mirror of
https://github.com/logos-messaging/js-waku.git
synced 2026-01-05 23:33:08 +00:00
Group sequential messages from same sender
Name and date are not repeated anymore.
This commit is contained in:
parent
2c72c6d388
commit
2c741da2c3
@ -1,6 +1,11 @@
|
|||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
import { ChatMessage } from '../../build/main/chat/chat_message';
|
import { ChatMessage } from '../../build/main/chat/chat_message';
|
||||||
import { Message, MessageText, MessageGroup } from '@livechat/ui-kit';
|
import {
|
||||||
|
Message,
|
||||||
|
MessageText,
|
||||||
|
MessageGroup,
|
||||||
|
MessageList,
|
||||||
|
} from '@livechat/ui-kit';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
messages: ChatMessage[];
|
messages: ChatMessage[];
|
||||||
@ -9,33 +14,57 @@ interface Props {
|
|||||||
export default function ChatList(props: Props) {
|
export default function ChatList(props: Props) {
|
||||||
const messages = props.messages;
|
const messages = props.messages;
|
||||||
|
|
||||||
const listItems = messages.map((currentMessage) => (
|
const messagesGroupedBySender = groupMessagesBySender(props.messages).map(
|
||||||
<Message
|
(currentMessageGroup) => (
|
||||||
// We assume that the same user is not sending two messages in the same second
|
<MessageGroup onlyFirstWithMeta>
|
||||||
key={currentMessage.timestamp.toString() + currentMessage.nick}
|
{currentMessageGroup.map((currentMessage) => (
|
||||||
authorName={currentMessage.nick}
|
<Message
|
||||||
date={formatDisplayDate(currentMessage)}
|
// We assume that the same user is not sending two messages in the same second
|
||||||
>
|
key={currentMessage.timestamp.toString() + currentMessage.nick}
|
||||||
<MessageText>{currentMessage.message}</MessageText>
|
authorName={currentMessage.nick}
|
||||||
</Message>
|
date={formatDisplayDate(currentMessage)}
|
||||||
));
|
>
|
||||||
|
<MessageText>{currentMessage.message}</MessageText>
|
||||||
return (
|
</Message>
|
||||||
<MessageGroup>
|
))}
|
||||||
{listItems}
|
</MessageGroup>
|
||||||
<AlwaysScrollToBottom messages={messages} />
|
)
|
||||||
</MessageGroup>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
function formatDisplayDate(message: ChatMessage) {
|
return (
|
||||||
return message.timestamp.toLocaleString([], {
|
<MessageList active containScrollInSubtree>
|
||||||
month: 'short',
|
{messagesGroupedBySender}
|
||||||
day: 'numeric',
|
<AlwaysScrollToBottom messages={messages} />
|
||||||
hour: 'numeric',
|
</MessageList>
|
||||||
minute: '2-digit',
|
);
|
||||||
hour12: false,
|
}
|
||||||
});
|
|
||||||
|
function groupMessagesBySender(messageArray: ChatMessage[]): ChatMessage[][] {
|
||||||
|
let currentSender = -1;
|
||||||
|
let lastNick = '';
|
||||||
|
let messagesBySender: ChatMessage[][] = [];
|
||||||
|
let currentSenderMessage = 0;
|
||||||
|
|
||||||
|
for (let currentMessage of messageArray) {
|
||||||
|
if (lastNick !== currentMessage.nick) {
|
||||||
|
currentSender++;
|
||||||
|
messagesBySender[currentSender] = [];
|
||||||
|
currentSenderMessage = 0;
|
||||||
|
lastNick = currentMessage.nick;
|
||||||
|
}
|
||||||
|
messagesBySender[currentSender][currentSenderMessage++] = currentMessage;
|
||||||
}
|
}
|
||||||
|
return messagesBySender;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatDisplayDate(message: ChatMessage): string {
|
||||||
|
return message.timestamp.toLocaleString([], {
|
||||||
|
month: 'short',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: 'numeric',
|
||||||
|
minute: '2-digit',
|
||||||
|
hour12: false,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const AlwaysScrollToBottom = (props: Props) => {
|
const AlwaysScrollToBottom = (props: Props) => {
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { ChatContentTopic } from './App';
|
|||||||
import ChatList from './ChatList';
|
import ChatList from './ChatList';
|
||||||
import MessageInput from './MessageInput';
|
import MessageInput from './MessageInput';
|
||||||
import { useWaku } from './WakuContext';
|
import { useWaku } from './WakuContext';
|
||||||
import { TitleBar, MessageList } from '@livechat/ui-kit';
|
import { TitleBar } from '@livechat/ui-kit';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
lines: ChatMessage[];
|
lines: ChatMessage[];
|
||||||
@ -23,9 +23,7 @@ export default function Room(props: Props) {
|
|||||||
style={{ height: '98vh', display: 'flex', flexDirection: 'column' }}
|
style={{ height: '98vh', display: 'flex', flexDirection: 'column' }}
|
||||||
>
|
>
|
||||||
<TitleBar title="Waku v2 chat app" />
|
<TitleBar title="Waku v2 chat app" />
|
||||||
<MessageList active containScrollInSubtree>
|
<ChatList messages={props.lines} />
|
||||||
<ChatList messages={props.lines} />
|
|
||||||
</MessageList>
|
|
||||||
<MessageInput
|
<MessageInput
|
||||||
messageHandler={setMessageToSend}
|
messageHandler={setMessageToSend}
|
||||||
sendMessage={
|
sendMessage={
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user