keanu-weblite/src/models/attachment.ts
N-Pex c66602deb7 Place CR icon correctly on (scaled) image
Also, show "red dot" only if details not viewed already.
2025-11-03 09:16:48 +01:00

83 lines
2.2 KiB
TypeScript

import { ComputedRef, Ref } from "vue";
import { Proof, MediaMetadata } from "./proof";
export class UploadPromise<Type> {
wrappedPromise: Promise<Type>;
aborted: boolean = false;
onAbort: (() => void) | undefined = undefined;
constructor(wrappedPromise: Promise<Type>) {
this.wrappedPromise = wrappedPromise;
}
abort() {
this.aborted = true;
if (this.onAbort) {
this.onAbort();
}
}
then(resolve: any, reject: any) {
this.wrappedPromise = this.wrappedPromise.then(resolve, reject);
return this;
}
catch(handler: any) {
this.wrappedPromise = this.wrappedPromise.catch(handler);
return this;
}
}
export type AttachmentSendStatus = "initial" | "sending" | "sent" | "canceled" | "failed";
export type AttachmentSendInfo = {
status: AttachmentSendStatus;
statusDate: number; //ms
mediaEventId: string | undefined;
progress: number;
promise: UploadPromise<string> | undefined;
randomRotation: number; // For UI effects
randomTranslationX: number; // For UI effects
randomTranslationY: number; // For UI effects
};
export type AttachmentThumbnail = {
data: Uint8Array;
mimetype: string;
size: number;
w: number;
h: number;
}
export type Attachment = {
status: "loading" | "loaded";
file: File;
dimensions?: { width: number; height: number };
compressedFile?: File;
compressedDimensions?: { width: number; height: number };
useCompressed: boolean;
src?: string;
proof?: Proof;
mediaMetadata?: MediaMetadata;
thumbnail?: AttachmentThumbnail;
detailsViewed: boolean;
sendInfo: AttachmentSendInfo;
};
export type AttachmentBatch = {
sendingStatus: Ref<AttachmentSendStatus>;
sendingRootEventId: Ref<string | undefined>;
sendingRootMessage: Ref<string | undefined>;
progressPercent: Ref<number>;
attachments: Attachment[];
attachmentsSentCount: ComputedRef<number>;
attachmentsSending: ComputedRef<Attachment[]>;
attachmentsSent: ComputedRef<Attachment[]>;
addFiles: (files: File[]) => void;
removeAttachment: (attachment: Attachment) => void;
isTooLarge: (attachment: Attachment) => boolean;
canSend: ComputedRef<boolean>;
send: (message: string) => Promise<any>;
cancel: () => void;
cancelSendAttachment: (attachment: Attachment) => void;
};