atagen

malice

public
Star0
Watch0
719f7cdd974e47e6ab6bdad3523014a8d0a64771
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/staging.ts

dda384a360e0atagen2026-10-25 10:27 UTC1
import type { ImagePack, PackImage } from './types';
dda384a360e0atagen2026-10-25 10:27 UTC2
dda384a360e0atagen2026-10-25 10:27 UTC3
export const MAX_ATTACHMENT_BYTES = 20 * 1024 * 1024;
dda384a360e0atagen2026-10-25 10:27 UTC4
dda384a360e0atagen2026-10-25 10:27 UTC5
export interface StagedAttachment {
dda384a360e0atagen2026-10-25 10:27 UTC6
  id: number;
dda384a360e0atagen2026-10-25 10:27 UTC7
  file: File;
dda384a360e0atagen2026-10-25 10:27 UTC8
  previewUrl: string | null;
dda384a360e0atagen2026-10-25 10:27 UTC9
}
dda384a360e0atagen2026-10-25 10:27 UTC10
dda384a360e0atagen2026-10-25 10:27 UTC11
export interface StickerHandlers {
dda384a360e0atagen2026-10-25 10:27 UTC12
  onSend: (pack: ImagePack, image: PackImage) => void;
dda384a360e0atagen2026-10-25 10:27 UTC13
  onClone: (pack: ImagePack, image: PackImage, x: number, y: number) => void;
dda384a360e0atagen2026-10-25 10:27 UTC14
  onClonePack: (pack: ImagePack, x: number, y: number) => void;
dda384a360e0atagen2026-10-25 10:27 UTC15
  onManage: () => void;
dda384a360e0atagen2026-10-25 10:27 UTC16
  roomName: (roomId: string) => string;
dda384a360e0atagen2026-10-25 10:27 UTC17
}
dda384a360e0atagen2026-10-25 10:27 UTC18
dda384a360e0atagen2026-10-25 10:27 UTC19
let nextId = 1;
dda384a360e0atagen2026-10-25 10:27 UTC20
dda384a360e0atagen2026-10-25 10:27 UTC21
/** Files outside the homeserver-friendly size range are reported through `reject` and skipped. */
dda384a360e0atagen2026-10-25 10:27 UTC22
export function stageFiles(files: File[], reject: (message: string) => void): StagedAttachment[] {
dda384a360e0atagen2026-10-25 10:27 UTC23
  const accepted: StagedAttachment[] = [];
dda384a360e0atagen2026-10-25 10:27 UTC24
  for (const file of files) {
dda384a360e0atagen2026-10-25 10:27 UTC25
    if (file.size === 0 || file.size > MAX_ATTACHMENT_BYTES) {
dda384a360e0atagen2026-10-25 10:27 UTC26
      reject(`${file.name || 'File'} must be between 1 byte and 20 MiB.`);
dda384a360e0atagen2026-10-25 10:27 UTC27
      continue;
dda384a360e0atagen2026-10-25 10:27 UTC28
    }
dda384a360e0atagen2026-10-25 10:27 UTC29
    accepted.push({ id: nextId++, file, previewUrl: file.type.startsWith('image/') ? URL.createObjectURL(file) : null });
dda384a360e0atagen2026-10-25 10:27 UTC30
  }
dda384a360e0atagen2026-10-25 10:27 UTC31
  return accepted;
dda384a360e0atagen2026-10-25 10:27 UTC32
}
dda384a360e0atagen2026-10-25 10:27 UTC33
dda384a360e0atagen2026-10-25 10:27 UTC34
export function releaseStaged(list: StagedAttachment[]): void {
dda384a360e0atagen2026-10-25 10:27 UTC35
  for (const attachment of list) if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);
dda384a360e0atagen2026-10-25 10:27 UTC36
}