diff --git a/app/soapbox/components/ui/textarea/textarea.tsx b/app/soapbox/components/ui/textarea/textarea.tsx index 745325ea9..0228e2e2d 100644 --- a/app/soapbox/components/ui/textarea/textarea.tsx +++ b/app/soapbox/components/ui/textarea/textarea.tsx @@ -26,6 +26,8 @@ interface ITextarea extends Pick) => { const [rows, setRows] = useState(autoGrow ? 1 : 4); @@ -72,9 +75,10 @@ const Textarea = React.forwardRef(({ ref={ref} rows={rows} onChange={handleChange} - className={classNames({ - 'bg-white dark:bg-transparent shadow-sm block w-full sm:text-sm rounded-md text-gray-900 dark:text-gray-100 placeholder:text-gray-600 dark:placeholder:text-gray-600 border-gray-400 dark:border-gray-800 dark:ring-1 dark:ring-gray-800 focus:ring-primary-500 focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:border-primary-500': - true, + className={classNames('block w-full rounded-md sm:text-sm text-gray-900 dark:text-gray-100 placeholder:text-gray-600 dark:placeholder:text-gray-600', { + 'bg-white dark:bg-transparent shadow-sm border-gray-400 dark:border-gray-800 dark:ring-1 dark:ring-gray-800 focus:ring-primary-500 focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:border-primary-500': + theme === 'default', + 'bg-transparent border-0 focus:border-0 focus:ring-0': theme === 'transparent', 'font-mono': isCodeEditor, 'text-red-600 border-red-600': hasError, 'resize-none': !isResizeable, diff --git a/app/soapbox/features/chats/components/chat-composer.tsx b/app/soapbox/features/chats/components/chat-composer.tsx index 358fbb6f3..1d335d566 100644 --- a/app/soapbox/features/chats/components/chat-composer.tsx +++ b/app/soapbox/features/chats/components/chat-composer.tsx @@ -3,13 +3,16 @@ import { defineMessages, IntlShape, useIntl } from 'react-intl'; import { unblockAccount } from 'soapbox/actions/accounts'; import { openModal } from 'soapbox/actions/modals'; -import { Button, Combobox, ComboboxInput, ComboboxList, ComboboxOption, ComboboxPopover, HStack, IconButton, Stack, Text, Textarea } from 'soapbox/components/ui'; +import { Button, Combobox, ComboboxInput, ComboboxList, ComboboxOption, ComboboxPopover, HStack, IconButton, Stack, Text } from 'soapbox/components/ui'; import { useChatContext } from 'soapbox/contexts/chat-context'; import UploadButton from 'soapbox/features/compose/components/upload-button'; import { search as emojiSearch } from 'soapbox/features/emoji/emoji-mart-search-light'; import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; +import { Attachment } from 'soapbox/types/entities'; import { textAtCursorMatchesToken } from 'soapbox/utils/suggestions'; +import ChatTextarea from './chat-textarea'; + const messages = defineMessages({ placeholder: { id: 'chat.input.placeholder', defaultMessage: 'Type a message' }, send: { id: 'chat.actions.send', defaultMessage: 'Send' }, @@ -39,7 +42,7 @@ interface IChatComposer extends Pick void resetFileKey: number | null - hasAttachment?: boolean + attachments?: Attachment[] } /** Textarea input for chats. */ @@ -53,7 +56,7 @@ const ChatComposer = React.forwardRef onSelectFile, resetFileKey, onPaste, - hasAttachment, + attachments = [], }, ref) => { const intl = useIntl(); const dispatch = useAppDispatch(); @@ -68,6 +71,7 @@ const ChatComposer = React.forwardRef const [suggestions, setSuggestions] = useState(initialSuggestionState); const isSuggestionsAvailable = suggestions.list.length > 0; + const hasAttachment = attachments.length > 0; const isOverCharacterLimit = maxCharacterCount && value?.length > maxCharacterCount; const isSubmitDisabled = disabled || isOverCharacterLimit || (value.length === 0 && !hasAttachment); @@ -167,12 +171,9 @@ const ChatComposer = React.forwardRef )} - + autoGrow maxRows={5} disabled={disabled} + attachments={attachments} /> {isSuggestionsAvailable ? ( diff --git a/app/soapbox/features/chats/components/chat-textarea.tsx b/app/soapbox/features/chats/components/chat-textarea.tsx new file mode 100644 index 000000000..c26755cf5 --- /dev/null +++ b/app/soapbox/features/chats/components/chat-textarea.tsx @@ -0,0 +1,39 @@ +import React from 'react'; + +import { Textarea } from 'soapbox/components/ui'; +import { Attachment } from 'soapbox/types/entities'; + +interface IChatTextarea extends React.ComponentProps { + attachments?: Attachment[] +} + +/** Custom textarea for chats. */ +const ChatTextarea: React.FC = ({ attachments, ...rest }) => { + return ( +
+ {attachments?.map(attachment => ( + + ))} + +