import type { ChangeEvent } from "react"; import { useStuffboxUpload, type UploadTransport, } from "@stuffbox/sdk/react"; async function responseJson(response: Response): Promise { if (!response.ok) { throw new Error(`Upload endpoint failed with status ${response.status}`); } return response.json() as Promise; } export const uploadTransport: UploadTransport = { async createUpload(input, options) { const response = await fetch("/api/stuffbox/uploads", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(input), ...(options?.signal ? { signal: options.signal } : {}), }); return responseJson(response); }, async completeUpload(uploadId, input, options) { const response = await fetch(`/api/stuffbox/uploads/${uploadId}/complete`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(input ?? {}), ...(options?.signal ? { signal: options.signal } : {}), }); return responseJson(response); }, }; export function StuffboxUploadButton() { const { state, upload, abort, reset } = useStuffboxUpload(uploadTransport); function chooseFile(event: ChangeEvent) { const file = event.currentTarget.files?.[0]; if (file) void upload(file).catch(() => undefined); } return (
{state.status === "uploading" && ( )} {state.status === "complete" && (

Uploaded {state.asset.filename}{" "}

)} {state.status === "error" &&

{state.error.message}

}
); }