2024-08-03 19:14:38 +02:00
|
|
|
import { InView } from 'react-intersection-observer';
|
2024-11-18 15:38:58 +01:00
|
|
|
import { MessageNode } from '@colanode/core';
|
2024-10-03 17:42:17 +02:00
|
|
|
import { MessageReactions } from '@/renderer/components/messages/message-reactions';
|
2024-10-03 17:35:28 +02:00
|
|
|
import { useWorkspace } from '@/renderer/contexts/workspace';
|
2024-11-14 17:11:53 +01:00
|
|
|
import { useRadar } from '@/renderer/contexts/radar';
|
2024-11-18 13:16:22 +01:00
|
|
|
import { MessageActions } from '@/renderer/components/messages/message-actions';
|
2024-11-18 15:38:58 +01:00
|
|
|
import { MessageAvatar } from '@/renderer/components/messages/message-avatar';
|
|
|
|
|
import { MessageHeader } from '@/renderer/components/messages/message-header';
|
|
|
|
|
import { MessageContent } from '@/renderer/components/messages/message-content';
|
2024-08-03 19:14:38 +02:00
|
|
|
|
|
|
|
|
interface MessageProps {
|
2024-08-22 20:17:36 +02:00
|
|
|
message: MessageNode;
|
2024-11-01 20:01:20 +01:00
|
|
|
previousMessage?: MessageNode | null;
|
2024-08-03 19:14:38 +02:00
|
|
|
}
|
|
|
|
|
|
2024-11-18 15:38:58 +01:00
|
|
|
const shouldDisplayAuthor = (
|
2024-09-15 16:29:47 +02:00
|
|
|
message: MessageNode,
|
2024-11-07 09:15:00 +01:00
|
|
|
previousMessage?: MessageNode | null
|
2024-09-15 16:29:47 +02:00
|
|
|
) => {
|
|
|
|
|
if (!previousMessage) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2024-08-06 21:45:12 +02:00
|
|
|
|
2024-09-15 16:29:47 +02:00
|
|
|
const previousMessageDate = new Date(previousMessage.createdAt);
|
|
|
|
|
const currentMessageDate = new Date(message.createdAt);
|
2024-08-06 21:45:12 +02:00
|
|
|
|
2024-09-15 16:29:47 +02:00
|
|
|
if (previousMessageDate.getDate() !== currentMessageDate.getDate()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2024-08-06 21:45:12 +02:00
|
|
|
|
2024-11-18 15:38:58 +01:00
|
|
|
return previousMessage.createdBy !== message.createdBy;
|
2024-09-15 16:29:47 +02:00
|
|
|
};
|
2024-08-03 19:14:38 +02:00
|
|
|
|
2024-11-12 23:00:22 +01:00
|
|
|
export const Message = ({ message, previousMessage }: MessageProps) => {
|
2024-10-03 17:11:39 +02:00
|
|
|
const workspace = useWorkspace();
|
2024-11-14 17:11:53 +01:00
|
|
|
const radar = useRadar();
|
2024-11-18 15:38:58 +01:00
|
|
|
const displayAuthor = shouldDisplayAuthor(message, previousMessage);
|
2024-09-15 16:29:47 +02:00
|
|
|
|
2024-08-27 15:20:16 +02:00
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
id={`message-${message.id}`}
|
|
|
|
|
key={`message-${message.id}`}
|
|
|
|
|
className={`group flex flex-row px-1 hover:bg-gray-50 ${
|
2024-11-18 15:38:58 +01:00
|
|
|
displayAuthor ? 'mt-2 first:mt-0' : ''
|
2024-08-27 15:20:16 +02:00
|
|
|
}`}
|
|
|
|
|
>
|
|
|
|
|
<div className="mr-2 w-10 pt-1">
|
2024-11-18 15:38:58 +01:00
|
|
|
{displayAuthor && <MessageAvatar message={message} />}
|
2024-08-27 15:20:16 +02:00
|
|
|
</div>
|
2024-08-03 19:14:38 +02:00
|
|
|
|
2024-08-27 15:20:16 +02:00
|
|
|
<div className="relative w-full">
|
2024-11-18 15:38:58 +01:00
|
|
|
{displayAuthor && <MessageHeader message={message} />}
|
2024-08-27 15:20:16 +02:00
|
|
|
<InView
|
|
|
|
|
rootMargin="50px"
|
|
|
|
|
onChange={(inView) => {
|
2024-10-28 20:35:30 +01:00
|
|
|
if (inView) {
|
2024-11-14 17:11:53 +01:00
|
|
|
radar.markAsSeen(workspace.userId, message.id, message.versionId);
|
2024-10-28 20:35:30 +01:00
|
|
|
}
|
2024-08-27 15:20:16 +02:00
|
|
|
}}
|
|
|
|
|
>
|
2024-11-18 13:16:22 +01:00
|
|
|
<MessageActions message={message} />
|
2024-11-18 15:38:58 +01:00
|
|
|
<MessageContent message={message} />
|
2024-11-18 13:16:22 +01:00
|
|
|
<MessageReactions message={message} />
|
2024-08-27 15:20:16 +02:00
|
|
|
</InView>
|
2024-08-03 19:14:38 +02:00
|
|
|
</div>
|
2024-08-27 15:20:16 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|