2024-12-02 00:44:02 +01:00
|
|
|
import { InView } from 'react-intersection-observer';
|
|
|
|
|
|
2025-06-11 00:14:17 +02:00
|
|
|
import { LocalMessageNode } from '@colanode/client/types';
|
|
|
|
|
import { MessageActions } from '@colanode/ui/components/messages/message-actions';
|
|
|
|
|
import { MessageAuthorAvatar } from '@colanode/ui/components/messages/message-author-avatar';
|
|
|
|
|
import { MessageAuthorName } from '@colanode/ui/components/messages/message-author-name';
|
|
|
|
|
import { MessageContent } from '@colanode/ui/components/messages/message-content';
|
|
|
|
|
import { MessageReactionCounts } from '@colanode/ui/components/messages/message-reaction-counts';
|
|
|
|
|
import { MessageReference } from '@colanode/ui/components/messages/message-reference';
|
|
|
|
|
import { MessageTime } from '@colanode/ui/components/messages/message-time';
|
|
|
|
|
import { useRadar } from '@colanode/ui/contexts/radar';
|
|
|
|
|
import { useWorkspace } from '@colanode/ui/contexts/workspace';
|
2025-02-05 22:40:35 +01:00
|
|
|
|
2024-08-03 19:14:38 +02:00
|
|
|
interface MessageProps {
|
2025-02-05 22:40:35 +01:00
|
|
|
message: LocalMessageNode;
|
|
|
|
|
previousMessage?: LocalMessageNode | null;
|
2024-08-03 19:14:38 +02:00
|
|
|
}
|
|
|
|
|
|
2024-11-18 15:38:58 +01:00
|
|
|
const shouldDisplayAuthor = (
|
2025-02-05 22:40:35 +01:00
|
|
|
message: LocalMessageNode,
|
|
|
|
|
previousMessage?: LocalMessageNode | 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}`}
|
2025-08-29 13:55:35 +02:00
|
|
|
className={`group flex flex-row px-1 rounded-sm hover:bg-accent ${
|
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) {
|
2025-02-05 22:40:35 +01:00
|
|
|
radar.markNodeAsSeen(
|
2025-01-17 14:35:13 +01:00
|
|
|
workspace.accountId,
|
|
|
|
|
workspace.id,
|
|
|
|
|
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} />
|
2025-01-09 11:13:22 +01:00
|
|
|
{message.attributes.referenceId && (
|
|
|
|
|
<MessageReference messageId={message.attributes.referenceId} />
|
|
|
|
|
)}
|
2024-11-18 15:38:58 +01:00
|
|
|
<MessageContent message={message} />
|
2025-01-23 15:43:13 +01:00
|
|
|
<MessageReactionCounts 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>
|
|
|
|
|
);
|
|
|
|
|
};
|