77 lines
3.0 KiB
TypeScript
77 lines
3.0 KiB
TypeScript
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<string, string> = {
|
|
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';
|
|
}
|