2024-12-02 00:44:02 +01:00
|
|
|
import { InView } from 'react-intersection-observer';
|
|
|
|
|
|
2024-11-18 13:16:22 +01:00
|
|
|
import { MessageActions } from '@/renderer/components/messages/message-actions';
|
2024-11-22 13:40:58 +01:00
|
|
|
import { MessageAuthorAvatar } from '@/renderer/components/messages/message-author-avatar';
|
|
|
|
|
import { MessageAuthorName } from '@/renderer/components/messages/message-author-name';
|
2024-11-18 15:38:58 +01:00
|
|
|
import { MessageContent } from '@/renderer/components/messages/message-content';
|
2024-12-02 00:44:02 +01:00
|
|
|
import { MessageReactions } from '@/renderer/components/messages/message-reactions';
|
2024-11-22 13:40:58 +01:00
|
|
|
import { MessageTime } from '@/renderer/components/messages/message-time';
|
2024-12-26 12:59:32 +01:00
|
|
|
import { useRadar } from '@/renderer/contexts/radar';
|
|
|
|
|
import { useWorkspace } from '@/renderer/contexts/workspace';
|
2024-12-23 15:29:11 +01:00
|
|
|
import { MessageNode } from '@/shared/types/messages';
|
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-12-26 12:59:32 +01:00
|
|
|
const workspace = useWorkspace();
|
|
|
|
|
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-22 13:40:58 +01:00
|
|
|
{displayAuthor && <MessageAuthorAvatar 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-22 13:40:58 +01:00
|
|
|
{displayAuthor && (
|
|
|
|
|
<div className="flex flex-row items-center gap-0.5">
|
|
|
|
|
<MessageAuthorName message={message} />
|
|
|
|
|
<MessageTime message={message} />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
2024-08-27 15:20:16 +02:00
|
|
|
<InView
|
|
|
|
|
rootMargin="50px"
|
|
|
|
|
onChange={(inView) => {
|
2024-10-28 20:35:30 +01:00
|
|
|
if (inView) {
|
2024-12-26 12:59:32 +01:00
|
|
|
radar.markMessageAsSeen(workspace.userId, message.id);
|
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-12-23 15:29:11 +01:00
|
|
|
{/* {message.type === 'reply' && (
|
|
|
|
|
<MessageReference messageId={message.referenceId} />
|
|
|
|
|
)} */}
|
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>
|
|
|
|
|
);
|
|
|
|
|
};
|