Files
colanode/apps/desktop/src/renderer/components/messages/message.tsx

69 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-08-03 19:14:38 +02:00
import { InView } from 'react-intersection-observer';
import { MessageNode } from '@colanode/core';
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';
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;
previousMessage?: MessageNode | null;
2024-08-03 19:14:38 +02:00
}
const shouldDisplayAuthor = (
2024-09-15 16:29:47 +02:00
message: MessageNode,
previousMessage?: MessageNode | null
2024-09-15 16:29:47 +02:00
) => {
if (!previousMessage) {
return true;
}
2024-09-15 16:29:47 +02:00
const previousMessageDate = new Date(previousMessage.createdAt);
const currentMessageDate = new Date(message.createdAt);
2024-09-15 16:29:47 +02:00
if (previousMessageDate.getDate() !== currentMessageDate.getDate()) {
return true;
}
return previousMessage.createdBy !== message.createdBy;
2024-09-15 16:29:47 +02:00
};
2024-08-03 19:14:38 +02: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();
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 ${
displayAuthor ? 'mt-2 first:mt-0' : ''
2024-08-27 15:20:16 +02:00
}`}
>
<div className="mr-2 w-10 pt-1">
{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">
{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} />
<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>
);
};