export type DocumentAttachmentMeta = { fileName?: string; contentType?: string; }; export const DOCUMENT_FILE_ACCEPT = 'image/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.rtf,.odt,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document'; const EXTENSION_TO_MIME: Record = { jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', webp: 'image/webp', gif: 'image/gif', pdf: 'application/pdf', doc: 'application/msword', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', xls: 'application/vnd.ms-excel', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ppt: 'application/vnd.ms-powerpoint', pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', txt: 'text/plain', rtf: 'application/rtf', odt: 'application/vnd.oasis.opendocument.text' }; export function resolveDocumentFileContentType(file: File) { const fromType = file.type?.trim(); if (fromType && fromType !== 'application/octet-stream') { return fromType; } const extension = file.name.split('.').pop()?.toLowerCase() ?? ''; return EXTENSION_TO_MIME[extension] ?? 'application/octet-stream'; } export function inferAttachmentContentType(storageKey: string, meta?: DocumentAttachmentMeta) { if (meta?.contentType) return meta.contentType; const extension = storageKey.split('.').pop()?.toLowerCase() ?? ''; return EXTENSION_TO_MIME[extension] ?? 'application/octet-stream'; } export function isImageAttachment(contentType: string) { return contentType.startsWith('image/'); } export function isPdfAttachment(contentType: string) { return contentType === 'application/pdf'; } export function attachmentKindLabel(contentType: string) { if (isImageAttachment(contentType)) return 'Изображение'; if (isPdfAttachment(contentType)) return 'PDF'; if (contentType.includes('word') || contentType === 'application/msword') return 'Word'; if (contentType.includes('excel') || contentType === 'application/vnd.ms-excel') return 'Excel'; if (contentType.includes('powerpoint') || contentType === 'application/vnd.ms-powerpoint') return 'PowerPoint'; if (contentType === 'text/plain') return 'Текст'; return 'Файл'; } export function attachmentDisplayName(storageKey: string, meta?: DocumentAttachmentMeta) { if (meta?.fileName?.trim()) return meta.fileName.trim(); const parts = storageKey.split('/'); return parts[parts.length - 1] ?? 'Файл'; } export function attachmentFileExtension(contentType: string, fileName?: string) { const fromName = fileName?.split('.').pop()?.toUpperCase(); if (fromName && fromName.length <= 5) return fromName; if (isPdfAttachment(contentType)) return 'PDF'; if (contentType.includes('word')) return 'DOC'; if (contentType.includes('excel')) return 'XLS'; if (contentType.includes('powerpoint')) return 'PPT'; if (contentType === 'text/plain') return 'TXT'; if (isImageAttachment(contentType)) return 'IMG'; return 'FILE'; }