import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Avatar from 'soapbox/components/avatar'; import { acctFull } from 'soapbox/utils/accounts'; import IconButton from 'soapbox/components/icon_button'; import { closeChat, toggleChat, fetchChatMessages, sendChatMessage } from 'soapbox/actions/chats'; import { List as ImmutableList } from 'immutable'; const mapStateToProps = (state, { pane }) => ({ chatMessages: state.getIn(['chat_messages', pane.get('chat_id')], ImmutableList()).reverse(), }); export default @connect(mapStateToProps) @injectIntl class ChatWindow extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, pane: ImmutablePropTypes.map.isRequired, idx: PropTypes.number, chatMessages: ImmutablePropTypes.list, } static defaultProps = { chatMessages: ImmutableList(), } state = { content: '', } handleChatClose = (chatId) => { return (e) => { this.props.dispatch(closeChat(chatId)); }; } handleChatToggle = (chatId) => { return (e) => { this.props.dispatch(toggleChat(chatId)); }; } handleKeyDown = (chatId) => { return (e) => { if (e.key === 'Enter') { this.props.dispatch(sendChatMessage(chatId, this.state)); this.setState({ content: '' }); } }; } handleContentChange = (e) => { this.setState({ content: e.target.value }); } scrollToBottom = () => { if (!this.messagesEnd) return; this.messagesEnd.scrollIntoView({ behavior: 'smooth' }); } setRef = (el) => this.messagesEnd = el; componentDidMount() { const { dispatch, pane, chatMessages } = this.props; this.scrollToBottom(); if (chatMessages && chatMessages.count() < 1) dispatch(fetchChatMessages(pane.get('chat_id'))); } componentDidUpdate() { this.scrollToBottom(); } render() { const { pane, idx, chatMessages } = this.props; const chat = pane.get('chat'); const account = pane.getIn(['chat', 'account']); if (!chat || !account) return null; const right = (285 * (idx + 1)) + 20; return (
{chatMessages.map(chatMessage => (
{chatMessage.get('content')}
))}
); } }