This commit is contained in:
lendry
2026-06-26 17:49:22 +03:00
parent c23f35e732
commit 4e853f8041
17 changed files with 1547 additions and 167 deletions

View File

@@ -0,0 +1,75 @@
import type { ChatMessage } from '@/lib/api';
export interface ChatMediaMetadata {
fileName?: string;
fileSize?: number;
durationMs?: number;
albumId?: string;
albumIndex?: number;
albumCount?: number;
width?: number;
height?: number;
sendAsFile?: boolean;
e2e?: boolean;
}
export function parseChatMediaMetadata(metadataJson?: string): ChatMediaMetadata {
if (!metadataJson) return {};
try {
return JSON.parse(metadataJson) as ChatMediaMetadata;
} catch {
return {};
}
}
export type ChatDisplayItem =
| { kind: 'message'; message: ChatMessage }
| { kind: 'album'; albumId: string; messages: ChatMessage[] };
export function groupChatMessagesForDisplay(messages: ChatMessage[]): ChatDisplayItem[] {
const items: ChatDisplayItem[] = [];
let index = 0;
while (index < messages.length) {
const message = messages[index]!;
const meta = parseChatMediaMetadata(message.metadataJson);
if (meta.albumId && message.storageKey) {
const albumMessages: ChatMessage[] = [message];
let cursor = index + 1;
while (cursor < messages.length) {
const next = messages[cursor]!;
const nextMeta = parseChatMediaMetadata(next.metadataJson);
if (
nextMeta.albumId === meta.albumId &&
next.senderId === message.senderId &&
next.storageKey
) {
albumMessages.push(next);
cursor += 1;
continue;
}
break;
}
albumMessages.sort((left, right) => {
const leftIndex = parseChatMediaMetadata(left.metadataJson).albumIndex ?? 0;
const rightIndex = parseChatMediaMetadata(right.metadataJson).albumIndex ?? 0;
return leftIndex - rightIndex;
});
items.push({ kind: 'album', albumId: meta.albumId, messages: albumMessages });
index = cursor;
continue;
}
items.push({ kind: 'message', message });
index += 1;
}
return items;
}
export function collectChatImageMessages(messages: ChatMessage[]) {
return messages.filter((message) => message.type === 'IMAGE' && message.storageKey);
}