bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/chat/component.jsx

147 lines
4.3 KiB
React
Raw Normal View History

import React from 'react';
import PropTypes from 'prop-types';
2016-04-29 03:02:51 +08:00
import { Link } from 'react-router';
import { defineMessages, injectIntl } from 'react-intl';
import injectWbResizeEvent from '/imports/ui/components/presentation/resize-wrapper/component';
import Button from '/imports/ui/components/button/component';
2018-01-08 14:17:18 +08:00
import { styles } from './styles';
2016-06-02 00:33:19 +08:00
import MessageForm from './message-form/component';
import MessageList from './message-list/component';
import ChatDropdown from './chat-dropdown/component';
2016-06-02 00:33:19 +08:00
import Icon from '../icon/component';
const ELEMENT_ID = 'chat-messages';
2016-04-29 03:02:51 +08:00
const intlMessages = defineMessages({
closeChatLabel: {
id: 'app.chat.closeChatLabel',
2017-04-10 23:50:03 +08:00
description: 'aria-label for closing chat button',
},
hideChatLabel: {
id: 'app.chat.hideChatLabel',
description: 'aria-label for hiding chat button',
},
});
2018-05-01 05:09:56 +08:00
const SHORTCUTS_CONFIG = Meteor.settings.public.app.shortcuts;
2018-05-02 08:02:45 +08:00
const HIDE_CHAT_AK = SHORTCUTS_CONFIG.hidePrivateChat.accesskey;
const CLOSE_CHAT_AK = SHORTCUTS_CONFIG.closePrivateChat.accesskey;
2018-05-01 05:09:56 +08:00
const Chat = (props) => {
const {
chatID,
chatName,
title,
messages,
scrollPosition,
hasUnreadMessages,
lastReadMessageTime,
partnerIsLoggedOut,
isChatLocked,
minMessageLength,
maxMessageLength,
actions,
intl,
} = props;
2016-06-02 00:33:19 +08:00
return (
2018-01-09 10:43:34 +08:00
<div
data-test="publicChat"
className={styles.chat}
>
<header className={styles.header}>
2018-01-09 10:43:34 +08:00
<div
data-test="chatTitle"
className={styles.title}
>
<Link
to="/users"
role="button"
aria-label={intl.formatMessage(intlMessages.hideChatLabel, { 0: title })}
accessKey={HIDE_CHAT_AK}
>
<Icon iconName="left_arrow" /> {title}
</Link>
</div>
{
chatID !== 'public' ?
<Link
to="/users"
role="button"
tabIndex={-1}
2017-06-03 03:25:02 +08:00
>
<Button
className={styles.closeBtn}
icon="close"
size="md"
hideLabel
onClick={() => actions.handleClosePrivateChat(chatID)}
aria-label={intl.formatMessage(intlMessages.closeChatLabel, { 0: title })}
2017-12-16 05:06:22 +08:00
label={intl.formatMessage(intlMessages.closeChatLabel, { 0: title })}
accessKey={CLOSE_CHAT_AK}
/>
</Link> :
<ChatDropdown />
}
</header>
<MessageList
chatId={chatID}
messages={messages}
id={ELEMENT_ID}
scrollPosition={scrollPosition}
hasUnreadMessages={hasUnreadMessages}
handleScrollUpdate={actions.handleScrollUpdate}
handleReadMessage={actions.handleReadMessage}
lastReadMessageTime={lastReadMessageTime}
partnerIsLoggedOut={partnerIsLoggedOut}
/>
<MessageForm
disabled={isChatLocked}
chatAreaId={ELEMENT_ID}
chatTitle={title}
chatName={chatName}
minMessageLength={minMessageLength}
maxMessageLength={maxMessageLength}
handleSendMessage={actions.handleSendMessage}
/>
</div>
);
};
export default injectWbResizeEvent(injectIntl(Chat));
2017-10-11 06:08:51 +08:00
const propTypes = {
chatID: PropTypes.string.isRequired,
chatName: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
messages: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.oneOfType([
PropTypes.array,
PropTypes.string,
PropTypes.number,
PropTypes.object,
])).isRequired).isRequired,
scrollPosition: PropTypes.number,
hasUnreadMessages: PropTypes.bool.isRequired,
lastReadMessageTime: PropTypes.number.isRequired,
partnerIsLoggedOut: PropTypes.bool.isRequired,
isChatLocked: PropTypes.bool.isRequired,
minMessageLength: PropTypes.number.isRequired,
maxMessageLength: PropTypes.number.isRequired,
actions: PropTypes.shape({
handleClosePrivateChat: PropTypes.func.isRequired,
handleReadMessage: PropTypes.func.isRequired,
handleScrollUpdate: PropTypes.func.isRequired,
handleSendMessage: PropTypes.func.isRequired,
}).isRequired,
intl: PropTypes.shape({
formatMessage: PropTypes.func.isRequired,
}).isRequired,
};
2017-10-11 06:08:51 +08:00
const defaultProps = {
scrollPosition: 0,
};
2017-10-11 06:08:51 +08:00
Chat.propTypes = propTypes;
Chat.defaultProps = defaultProps;