alinea
Version:
Headless git-based CMS
92 lines (90 loc) • 2.68 kB
JavaScript
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
};