import { appApiPath } from "@agent-native/core/client/api-path"; import type { ComposeAttachment } from "@shared/types"; export interface UploadResult { url: string; filename: string; originalName: string; mimeType: string; size: number; } export async function uploadFile(file: File): Promise { const buffer = await file.arrayBuffer(); const resp = await fetch( appApiPath(`/api/media/upload?filename=${encodeURIComponent(file.name)}`), { method: "POST", body: buffer, }, ); if (!resp.ok) { throw new Error(`Upload failed: ${resp.statusText}`); } return resp.json(); } export function uploadResultToAttachment( result: UploadResult, ): ComposeAttachment { return { id: result.filename, filename: result.filename, originalName: result.originalName, mimeType: result.mimeType, size: result.size, url: result.url, }; } export async function uploadFiles(files: File[]): Promise { const uploaded: ComposeAttachment[] = []; for (const file of files) { uploaded.push(uploadResultToAttachment(await uploadFile(file))); } return uploaded; } export function openFilePicker(accept: string): Promise { return new Promise((resolve) => { const input = document.createElement("input"); input.type = "file"; input.accept = accept; input.onchange = () => { resolve(input.files?.[0] ?? null); }; // Handle cancel input.addEventListener("cancel", () => resolve(null)); input.click(); }); } export function formatFileSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; }