diff --git a/app/soapbox/actions/media.js b/app/soapbox/actions/media.js index 460c2f079..ce1550ba4 100644 --- a/app/soapbox/actions/media.js +++ b/app/soapbox/actions/media.js @@ -2,7 +2,7 @@ import { getFeatures } from 'soapbox/utils/features'; import api from '../api'; -const noOp = () => {}; +const noOp = (e) => {}; export function fetchMedia(mediaId) { return (dispatch, getState) => { diff --git a/app/soapbox/features/chats/chat_room.tsx b/app/soapbox/features/chats/chat_room.tsx index 41b108e3f..866c16ec9 100644 --- a/app/soapbox/features/chats/chat_room.tsx +++ b/app/soapbox/features/chats/chat_room.tsx @@ -22,7 +22,7 @@ interface IChatRoom { const ChatRoom: React.FC = ({ params }) => { const dispatch = useAppDispatch(); const displayFqn = useAppSelector(getDisplayFqn); - const inputElem = useRef(null); + const inputElem = useRef(null); const chat = useAppSelector(state => { const chat = state.chats.items.get(params.chatId, ImmutableMap()).toJS() as any; @@ -33,7 +33,7 @@ const ChatRoom: React.FC = ({ params }) => { inputElem.current?.focus(); }; - const handleInputRef = (el: HTMLInputElement) => { + const handleInputRef = (el: HTMLTextAreaElement) => { inputElem.current = el; focusInput(); }; diff --git a/app/soapbox/features/chats/components/chat_box.js b/app/soapbox/features/chats/components/chat_box.js deleted file mode 100644 index b4aee7a34..000000000 --- a/app/soapbox/features/chats/components/chat_box.js +++ /dev/null @@ -1,214 +0,0 @@ -import { OrderedSet as ImmutableOrderedSet } from 'immutable'; -import PropTypes from 'prop-types'; -import React from 'react'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { injectIntl, defineMessages } from 'react-intl'; -import { connect } from 'react-redux'; - -import { - sendChatMessage, - markChatRead, -} from 'soapbox/actions/chats'; -import { uploadMedia } from 'soapbox/actions/media'; -import IconButton from 'soapbox/components/icon_button'; -import UploadProgress from 'soapbox/features/compose/components/upload-progress'; -import UploadButton from 'soapbox/features/compose/components/upload_button'; -import { truncateFilename } from 'soapbox/utils/media'; - -import ChatMessageList from './chat_message_list'; - -const messages = defineMessages({ - placeholder: { id: 'chat_box.input.placeholder', defaultMessage: 'Send a messageā€¦' }, - send: { id: 'chat_box.actions.send', defaultMessage: 'Send' }, -}); - -const mapStateToProps = (state, { chatId }) => ({ - me: state.get('me'), - chat: state.getIn(['chats', 'items', chatId]), - chatMessageIds: state.getIn(['chat_message_lists', chatId], ImmutableOrderedSet()), -}); - -const fileKeyGen = () => Math.floor((Math.random() * 0x10000)); - -export default @connect(mapStateToProps) -@injectIntl -class ChatBox extends ImmutablePureComponent { - - static propTypes = { - dispatch: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - chatId: PropTypes.string.isRequired, - chatMessageIds: ImmutablePropTypes.orderedSet, - chat: ImmutablePropTypes.record, - onSetInputRef: PropTypes.func, - me: PropTypes.node, - } - - initialState = () => ({ - content: '', - attachment: undefined, - isUploading: false, - uploadProgress: 0, - resetFileKey: fileKeyGen(), - }) - - state = this.initialState() - - clearState = () => { - this.setState(this.initialState()); - } - - getParams = () => { - const { content, attachment } = this.state; - - return { - content, - media_id: attachment && attachment.id, - }; - } - - canSubmit = () => { - const { content, attachment } = this.state; - - const conds = [ - content.length > 0, - attachment, - ]; - - return conds.some(c => c); - } - - sendMessage = () => { - const { dispatch, chatId } = this.props; - const { isUploading } = this.state; - - if (this.canSubmit() && !isUploading) { - const params = this.getParams(); - - dispatch(sendChatMessage(chatId, params)); - this.clearState(); - } - } - - insertLine = () => { - const { content } = this.state; - this.setState({ content: content + '\n' }); - } - - handleKeyDown = (e) => { - this.markRead(); - if (e.key === 'Enter' && e.shiftKey) { - this.insertLine(); - e.preventDefault(); - } else if (e.key === 'Enter') { - this.sendMessage(); - e.preventDefault(); - } - } - - handleContentChange = (e) => { - this.setState({ content: e.target.value }); - } - - markRead = () => { - const { dispatch, chatId } = this.props; - dispatch(markChatRead(chatId)); - } - - handleHover = () => { - this.markRead(); - } - - setInputRef = (el) => { - const { onSetInputRef } = this.props; - this.inputElem = el; - onSetInputRef(el); - }; - - handleRemoveFile = (e) => { - this.setState({ attachment: undefined, resetFileKey: fileKeyGen() }); - } - - onUploadProgress = (e) => { - const { loaded, total } = e; - this.setState({ uploadProgress: loaded / total }); - } - - handleFiles = (files) => { - const { dispatch } = this.props; - - this.setState({ isUploading: true }); - - const data = new FormData(); - data.append('file', files[0]); - - dispatch(uploadMedia(data, this.onUploadProgress)).then(response => { - this.setState({ attachment: response.data, isUploading: false }); - }).catch(() => { - this.setState({ isUploading: false }); - }); - } - - renderAttachment = () => { - const { attachment } = this.state; - if (!attachment) return null; - - return ( -
-
- {truncateFilename(attachment.preview_url, 20)} -
-
- -
-
- ); - } - - renderActionButton = () => { - const { intl } = this.props; - const { resetFileKey } = this.state; - - return this.canSubmit() ? ( - - ) : ( - - ); - } - - render() { - const { chatMessageIds, chatId, intl } = this.props; - const { content, isUploading, uploadProgress } = this.state; - if (!chatMessageIds) return null; - - return ( -
- - {this.renderAttachment()} - -
-
- {this.renderActionButton()} -
-