Merge branch 'chat-timestamps' into 'develop'

Chats: add timestamps, fixes #370

Closes #370

See merge request soapbox-pub/soapbox-fe!239
better-alerts
Alex Gleason 2020-09-19 00:06:11 +00:00
commit a123bd88be
2 zmienionych plików z 73 dodań i 23 usunięć

Wyświetl plik

@ -2,7 +2,7 @@ import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import { injectIntl } from 'react-intl'; import { injectIntl, defineMessages } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { fetchChatMessages } from 'soapbox/actions/chats'; import { fetchChatMessages } from 'soapbox/actions/chats';
@ -13,6 +13,22 @@ import { escape, throttle } from 'lodash';
import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import { MediaGallery } from 'soapbox/features/ui/util/async-components';
import Bundle from 'soapbox/features/ui/components/bundle'; import Bundle from 'soapbox/features/ui/components/bundle';
const messages = defineMessages({
today: { id: 'chats.dividers.today', defaultMessage: 'Today' },
});
const timeChange = (prev, curr) => {
const prevDate = new Date(prev.get('created_at')).getDate();
const currDate = new Date(curr.get('created_at')).getDate();
const nowDate = new Date().getDate();
if (prevDate !== currDate) {
return currDate === nowDate ? 'today' : 'date';
};
return null;
};
const makeEmojiMap = record => record.get('emojis', ImmutableList()).reduce((map, emoji) => { const makeEmojiMap = record => record.get('emojis', ImmutableList()).reduce((map, emoji) => {
return map.set(`:${emoji.get('shortcode')}:`, emoji); return map.set(`:${emoji.get('shortcode')}:`, emoji);
}, ImmutableMap()); }, ImmutableMap());
@ -191,32 +207,58 @@ class ChatMessageList extends ImmutablePureComponent {
this.node = c; this.node = c;
} }
renderDivider = (text) => (
<div className='chat-messages__divider'>{text}</div>
)
renderMessage = (chatMessage) => {
const { me } = this.props;
return (
<div
className={classNames('chat-message', {
'chat-message--me': chatMessage.get('account_id') === me,
'chat-message--pending': chatMessage.get('pending', false) === true,
})}
key={chatMessage.get('id')}
>
<div
title={this.getFormattedTimestamp(chatMessage)}
className='chat-message__bubble'
ref={this.setBubbleRef}
>
{this.maybeRenderMedia(chatMessage)}
<span
className='chat-message__content'
dangerouslySetInnerHTML={{ __html: this.parseContent(chatMessage) }}
/>
</div>
</div>
);
}
render() { render() {
const { chatMessages, me } = this.props; const { chatMessages, intl } = this.props;
return ( return (
<div className='chat-messages' ref={this.setRef}> <div className='chat-messages' ref={this.setRef}>
{chatMessages.map(chatMessage => ( {chatMessages.reduce((acc, curr, idx) => {
<div const lastMessage = chatMessages.get(idx-1);
className={classNames('chat-message', {
'chat-message--me': chatMessage.get('account_id') === me, if (lastMessage) {
'chat-message--pending': chatMessage.get('pending', false) === true, switch(timeChange(lastMessage, curr)) {
})} case 'today':
key={chatMessage.get('id')} acc.push(this.renderDivider(intl.formatMessage(messages.today)));
> break;
<div case 'date':
title={this.getFormattedTimestamp(chatMessage)} acc.push(this.renderDivider(new Date(curr.get('created_at')).toDateString()));
className='chat-message__bubble' break;
ref={this.setBubbleRef} }
> }
{this.maybeRenderMedia(chatMessage)}
<span acc.push(this.renderMessage(curr));
className='chat-message__content' return acc;
dangerouslySetInnerHTML={{ __html: this.parseContent(chatMessage) }} }, [])}
/>
</div>
</div>
))}
<div style={{ float: 'left', clear: 'both' }} ref={this.setMessageEndRef} /> <div style={{ float: 'left', clear: 'both' }} ref={this.setMessageEndRef} />
</div> </div>
); );

Wyświetl plik

@ -439,3 +439,11 @@
object-fit: contain; object-fit: contain;
} }
} }
.chat-messages__divider {
text-align: center;
text-transform: uppercase;
font-size: 13px;
padding: 14px 0 2px;
opacity: 0.8;
}