fix
This commit is contained in:
@@ -6,7 +6,7 @@ import {
|
||||
type ChatMessage
|
||||
} from '@/lib/api';
|
||||
import { compressChatImage, isCompressibleImageFile, readImageDimensions } from '@/lib/chat-image-compress';
|
||||
import { detectChatMessageType, resolveChatContentType } from '@/lib/chat-media';
|
||||
import { detectChatMessageType, isVideoNoteFileName, resolveChatContentType } from '@/lib/chat-media';
|
||||
import { e2eKindFromMessageType, encryptE2EBlob, type E2EMessagePayload } from '@/lib/e2e-chat';
|
||||
|
||||
export interface ChatMediaUploadItem {
|
||||
@@ -54,6 +54,7 @@ export async function uploadChatMediaBatch(params: {
|
||||
|
||||
const contentType = resolveChatContentType(file);
|
||||
const messageType = item.sendAsFile && isCompressibleImageFile(item.file) ? 'FILE' : detectChatMessageType(file);
|
||||
const videoNote = messageType === 'VIDEO_NOTE' || isVideoNoteFileName(item.file.name);
|
||||
const metadata = {
|
||||
fileName: item.file.name,
|
||||
fileSize: file.size,
|
||||
@@ -62,7 +63,8 @@ export async function uploadChatMediaBatch(params: {
|
||||
albumCount: items.length,
|
||||
...(width ? { width } : {}),
|
||||
...(height ? { height } : {}),
|
||||
...(item.sendAsFile ? { sendAsFile: true } : {})
|
||||
...(item.sendAsFile ? { sendAsFile: true } : {}),
|
||||
...(videoNote ? { videoNote: true } : {})
|
||||
};
|
||||
|
||||
let uploadFile = file;
|
||||
|
||||
@@ -77,6 +77,42 @@ export function resolveChatContentType(file: Pick<File, 'type' | 'name'>) {
|
||||
return aliased || 'application/octet-stream';
|
||||
}
|
||||
|
||||
const VIDEO_NOTE_FILE_NAME_PATTERNS = [
|
||||
/video[_-]?circle/i,
|
||||
/video[_-]?note/i,
|
||||
/videonote/i,
|
||||
/circle[_-]?video/i,
|
||||
/round[_-]?video/i,
|
||||
/tg[_-]?round/i,
|
||||
/кружок/i
|
||||
];
|
||||
|
||||
export function isVideoNoteFileName(fileName?: string | null) {
|
||||
if (!fileName?.trim()) return false;
|
||||
return VIDEO_NOTE_FILE_NAME_PATTERNS.some((pattern) => pattern.test(fileName.trim()));
|
||||
}
|
||||
|
||||
export function isVideoNoteMessage(
|
||||
message: {
|
||||
type: string;
|
||||
metadataJson?: string;
|
||||
mimeType?: string | null;
|
||||
content?: string | null;
|
||||
},
|
||||
e2ePayload?: { kind?: string; fileName?: string } | null
|
||||
) {
|
||||
if (message.type === 'VIDEO_NOTE') return true;
|
||||
if (e2ePayload?.kind === 'video_note') return true;
|
||||
|
||||
const meta = parseMessageMetadata(message.metadataJson);
|
||||
if (meta.videoNote) return true;
|
||||
|
||||
const fileName = e2ePayload?.fileName || meta.fileName || message.content;
|
||||
if (!isVideoNoteFileName(fileName)) return false;
|
||||
|
||||
return message.type === 'VIDEO' || message.type === 'FILE' || message.mimeType?.startsWith('video/') === true;
|
||||
}
|
||||
|
||||
export function inferChatMessageType(contentType: string, options?: { voice?: boolean; videoNote?: boolean }): ChatAttachmentKind {
|
||||
const normalized = resolveChatContentType({ type: contentType, name: '' });
|
||||
if (options?.videoNote && normalized.startsWith('video/')) return 'VIDEO_NOTE';
|
||||
@@ -90,7 +126,8 @@ export function inferChatMessageType(contentType: string, options?: { voice?: bo
|
||||
|
||||
export function detectChatMessageType(file: File, options?: { voice?: boolean; videoNote?: boolean }) {
|
||||
const contentType = resolveChatContentType(file);
|
||||
return inferChatMessageType(contentType, options);
|
||||
const videoNote = Boolean(options?.videoNote || isVideoNoteFileName(file.name));
|
||||
return inferChatMessageType(contentType, { ...options, videoNote });
|
||||
}
|
||||
|
||||
export function isVideoFile(file: Pick<File, 'type' | 'name'>) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { ChatMessage } from '@/lib/api';
|
||||
import { isVideoNoteFileName } from '@/lib/chat-media';
|
||||
import { emojiIdToNative, resolveNativeEmojiContent } from '@/lib/emoji-native-map';
|
||||
|
||||
export const QUICK_REACTIONS = ['👍', '❤️', '😂', '😮', '😢', '🙏', '🔥', '👏'] as const;
|
||||
@@ -58,6 +59,16 @@ export function getMessagePreviewText(message: ChatMessage, visibleText?: string
|
||||
if (message.type === 'IMAGE') return '📷 Фото';
|
||||
if (message.type === 'VIDEO') return '🎬 Видео';
|
||||
if (message.type === 'VIDEO_NOTE') return '⭕ Кружок';
|
||||
if (message.type === 'VIDEO' || message.type === 'FILE') {
|
||||
const meta = message.metadataJson ? (() => {
|
||||
try {
|
||||
return JSON.parse(message.metadataJson) as { fileName?: string; videoNote?: boolean };
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
})() : {};
|
||||
if (meta.videoNote || isVideoNoteFileName(meta.fileName || message.content)) return '⭕ Кружок';
|
||||
}
|
||||
if (message.type === 'LOCATION') return '📍 Геопозиция';
|
||||
if (message.type === 'VOICE') return '🎤 Голосовое';
|
||||
if (message.type === 'AUDIO') return '🎵 Аудио';
|
||||
|
||||
Reference in New Issue
Block a user