mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-05-18 13:49:39 +01:00
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
// Copyright 2021 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { v4 as generateUuid } from 'uuid';
|
|
|
|
import { createLogger } from '../logging/log.std.ts';
|
|
import type { InMemoryAttachmentDraftType } from '../types/Attachment.std.ts';
|
|
import {
|
|
getAttachmentSizeLimit,
|
|
getRenderDetailsForLimit,
|
|
isAttachmentTooLargeToSend,
|
|
} from '../types/AttachmentSize.std.ts';
|
|
import * as Errors from '../types/errors.std.ts';
|
|
import { getValue as getRemoteConfigValue } from '../RemoteConfig.dom.ts';
|
|
import { fileToBytes } from './fileToBytes.std.ts';
|
|
import { handleImageAttachment } from './handleImageAttachment.preload.ts';
|
|
import { handleVideoAttachment } from './handleVideoAttachment.preload.ts';
|
|
import { isHeic, stringToMIMEType } from '../types/MIME.std.ts';
|
|
import {
|
|
isImageTypeSupported,
|
|
isVideoTypeSupported,
|
|
} from './GoogleChrome.std.ts';
|
|
import { isVideoAttachment } from './Attachment.std.ts';
|
|
import { ToastType } from '../types/Toast.dom.tsx';
|
|
|
|
const log = createLogger('processAttachment');
|
|
|
|
export async function processAttachment(
|
|
file: File,
|
|
options: { generateScreenshot: boolean; flags: number | null }
|
|
): Promise<InMemoryAttachmentDraftType | undefined> {
|
|
const fileType = stringToMIMEType(file.type);
|
|
|
|
let attachment: InMemoryAttachmentDraftType;
|
|
try {
|
|
if (isImageTypeSupported(fileType) || isHeic(fileType, file.name)) {
|
|
attachment = await handleImageAttachment(file);
|
|
} else if (isVideoTypeSupported(fileType)) {
|
|
attachment = await handleVideoAttachment(file, options);
|
|
} else {
|
|
const data = await fileToBytes(file);
|
|
attachment = {
|
|
clientUuid: generateUuid(),
|
|
contentType: fileType,
|
|
data,
|
|
fileName: file.name,
|
|
path: file.name,
|
|
pending: false,
|
|
size: data.byteLength,
|
|
};
|
|
}
|
|
} catch (e) {
|
|
log.error(
|
|
`Was unable to generate thumbnail for fileType ${fileType}`,
|
|
Errors.toLogFormat(e)
|
|
);
|
|
const data = await fileToBytes(file);
|
|
attachment = {
|
|
clientUuid: generateUuid(),
|
|
contentType: fileType,
|
|
data,
|
|
fileName: file.name,
|
|
path: file.name,
|
|
pending: false,
|
|
size: data.byteLength,
|
|
};
|
|
}
|
|
|
|
const sizeLimit = getAttachmentSizeLimit({
|
|
contentType: fileType,
|
|
getRemoteConfigValue,
|
|
});
|
|
|
|
if (
|
|
isAttachmentTooLargeToSend({
|
|
plaintextSize: attachment.size,
|
|
limit: sizeLimit,
|
|
})
|
|
) {
|
|
window.reduxActions.toast.showToast({
|
|
toastType: isVideoAttachment(attachment)
|
|
? ToastType.VideoFileSize
|
|
: ToastType.FileSize,
|
|
parameters: getRenderDetailsForLimit(sizeLimit),
|
|
});
|
|
return undefined;
|
|
}
|
|
|
|
return attachment;
|
|
}
|