UNPKG

alinea

Version:
92 lines (90 loc) 2.68 kB
import { useAtomValue } from "../../chunks/chunk-TOJF2G3X.js"; import "../../chunks/chunk-WJ67RR7S.js"; import "../../chunks/chunk-NZLE2WMY.js"; // src/dashboard/hook/UseUploads.ts import { Entry } from "alinea/core/Entry"; import { UploadOperation } from "alinea/core/db/Operation"; import { createPreview } from "alinea/core/media/CreatePreview"; import { MediaFile } from "alinea/core/media/MediaTypes"; import { useState } from "react"; import { dbAtom } from "../atoms/DbAtoms.js"; var UploadStatus = /* @__PURE__ */ ((UploadStatus2) => { UploadStatus2[UploadStatus2["Queued"] = 0] = "Queued"; UploadStatus2[UploadStatus2["CreatingPreview"] = 1] = "CreatingPreview"; UploadStatus2[UploadStatus2["Uploading"] = 2] = "Uploading"; UploadStatus2[UploadStatus2["Uploaded"] = 3] = "Uploaded"; UploadStatus2[UploadStatus2["Done"] = 4] = "Done"; return UploadStatus2; })(UploadStatus || {}); function useUploads(onSelect) { const db = useAtomValue(dbAtom); const [uploads, setUploads] = useState(Array); async function upload(files, to, replaceId) { const ops = Array.from( files, (file) => new UploadOperation({ file, createPreview, parentId: to.parentId, workspace: to.workspace, root: to.root, replaceId }) ); const ids = ops.map((_) => _.id); const uploads2 = ops.map((op, index) => { return { id: op.id, file: files[index], to, replaceId, status: 0 /* Queued */ }; }); setUploads((current) => [...uploads2, ...current]); try { await db.commit(...ops); const files2 = await db.find({ select: { ...Entry, ...MediaFile }, type: MediaFile, id: { in: ids } }); setUploads( (current) => current.map((upload2) => { const entry = files2.find((file) => file.id === upload2.id); if (!entry) return upload2; const result = { ...upload2, status: 4 /* Done */, preview: entry.preview, averageColor: entry.averageColor, focus: entry.focus, thumbHash: entry.thumbHash, width: entry.width, height: entry.height }; onSelect?.(entry); return result; }) ); } catch (error) { setUploads( (current) => current.map((upload2) => { if (ids.includes(upload2.id)) return { ...upload2, status: 4 /* Done */, error }; return upload2; }) ); } } return { upload, uploads }; } export { UploadStatus, useUploads };