- {visibleMessages.map((message) => {
+ {visibleMessages.map((message, messageIndex) => {
+ const previousMessage = visibleMessages[messageIndex - 1];
+ const showDateSeparator = shouldShowChatDateSeparator(message.createdAt, previousMessage?.createdAt);
+
if (isSystemMessage(message)) {
return (
-
-
- {getMessagePreviewText(message)}
-
+
+ {showDateSeparator ?
: null}
+
+
+ {getMessagePreviewText(message)}
+
+
);
}
@@ -1387,12 +1452,25 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
})
: '';
const isSelected = selectedMessageIds.includes(message.id);
+ const isLargeEmoji = isSingleEmojiMessage({
+ type: message.type,
+ content: emojiContent ?? message.content,
+ visibleText
+ });
+ const largeEmojiNative = isLargeEmoji
+ ? getSingleEmojiNative({ type: message.type, content: emojiContent ?? message.content, visibleText })
+ : '';
const bubble = (
{!mine ?
{message.senderName}
: null}
@@ -1483,6 +1561,21 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
);
})()
+ ) : isLargeEmoji ? (
+
+
{largeEmojiNative}
+
+ {message.editedAt ? изм. : null}
+ {formatMessageTime(message.createdAt)}
+ {mine ? (
+ message.readByAll ? (
+
+ ) : (
+
+ )
+ ) : null}
+
+
) : emojiContent ? (
@@ -1492,32 +1585,37 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
)}
-
- {message.editedAt ? изменено : null}
- {formatMessageTime(message.createdAt)}
- {mine ? (
- message.readByAll ? (
-
- ) : (
-
- )
- ) : null}
-
-
void handleToggleReaction(message.id, emoji)}
- />
+ {!isLargeEmoji ? (
+
+ {message.editedAt ? изменено : null}
+ {formatMessageTime(message.createdAt)}
+ {mine ? (
+ message.readByAll ? (
+
+ ) : (
+
+ )
+ ) : null}
+
+ ) : null}
+ {!isLargeEmoji ? (
+ void handleToggleReaction(message.id, emoji)}
+ />
+ ) : null}
);
return (
+
+ {showDateSeparator ?
: null}
{
- if (event.button !== 0 || isChatInteractiveTarget(event.target)) return;
- startDragSelection(message.id);
+ if (isChatInteractiveTarget(event.target)) return;
+ handleMessagePointerDown(message.id, event);
}}
onMouseEnter={() => handleDragEnterMessage(message.id)}
onClick={(event) => {
@@ -1535,7 +1633,7 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
token={token}
isVerified={message.senderIsVerified}
verificationIcon={message.senderVerificationIcon}
- className="h-8 w-8 self-end"
+ className="z-10 -mr-3 -mt-0.5 h-8 w-8 shrink-0 self-start ring-2 ring-[#eef1f6]"
badgeSize="xs"
/>
) : null}
@@ -1556,7 +1654,13 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
visibleText={visibleText}
onEdit={() => void startEditMessage(message)}
onDelete={() => requestDeleteMessages([message.id])}
- onReply={() => setReplyToMessage(message)}
+ onReply={() => {
+ exitSelectionMode();
+ setReplyToMessage(message);
+ setEditingMessageId(null);
+ setDraft('');
+ setEmojiOpen(false);
+ }}
onForward={() => {
setSelectedMessageIds([message.id]);
setForwardDialogOpen(true);
@@ -1568,6 +1672,19 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
{bubble}
)}
+ {mine ? (
+
+ ) : null}
+
);
})}
@@ -1705,6 +1822,28 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
onSelectRoom={(roomId) => void handleForwardToRoom(roomId)}
/>
+
+ getMessagePreviewText(
+ message,
+ getE2EMessageText({
+ message,
+ isE2E: activeRoomIsE2E,
+ peerE2eKey,
+ peerKeyLoading,
+ e2ePayload: message.isEncrypted ? e2ePayloads[message.id] : null,
+ e2eError: e2eErrors[message.id]
+ })
+ )
+ }
+ getMediaUrl={(message) => (message.storageKey ? mediaUrls[message.storageKey]?.blobUrl ?? null : null)}
+ />
+
('search');
const messagesEndRef = useRef(null);
const fileInputRef = useRef(null);
const previousGroupIdRef = useRef(null);
@@ -131,7 +139,7 @@ export function MiniFamilyChat() {
handleSelectionPointer
} = useChatMessageSelection(visibleMessages);
- const { startDragSelection, handleDragEnterMessage, isDragging } = useChatDragSelection({
+ const { handleMessagePointerDown, handleDragEnterMessage, isDragging } = useChatDragSelection({
selectionMode,
enterSelectionMode,
addSelectedMessage
@@ -684,6 +692,49 @@ export function MiniFamilyChat() {
) : null}
+ {view === 'chat' && activeRoom ? (
+ <>
+
+
+
+ >
+ ) : null}
{view === 'chat' && activeRoom && activeRoom.type !== 'GENERAL' ? (