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

78 lines
2.5 KiB
TypeScript
Raw Normal View History

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';
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';
import { useRadar } from '@/renderer/contexts/radar';
import { useWorkspace } from '@/renderer/contexts/workspace';
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;
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) => {
const workspace = useWorkspace();
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">
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) {
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} />
{/* {message.type === 'reply' && (
<MessageReference messageId={message.referenceId} />
)} */}
<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>
);
};