Files
stuffbox-sdk/examples/react-upload.tsx
T
cyph3rasi 73a3279d5c Publish the SDK under the Gnosys Labs npm organization
Hop-State: A_06FPAHQDE2YC3AQWGQGNQN0
Hop-Proposal: R_06FPAHP3Q77W9A2D641H4SR
Hop-Task: T_06FPAH33SHXWSFZ2V45R2Z8
Hop-Attempt: AT_06FPAH33SGNKEM8JTS1KX70
2026-07-15 03:16:14 -07:00

65 lines
1.9 KiB
TypeScript

import type { ChangeEvent } from "react";
import {
useStuffboxUpload,
type UploadTransport,
} from "@gnosyslabs/stuffbox-sdk/react";
async function responseJson<T>(response: Response): Promise<T> {
if (!response.ok) {
throw new Error(`Upload endpoint failed with status ${response.status}`);
}
return response.json() as Promise<T>;
}
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<HTMLInputElement>) {
const file = event.currentTarget.files?.[0];
if (file) void upload(file).catch(() => undefined);
}
return (
<div>
<input type="file" onChange={chooseFile} disabled={state.status === "uploading"} />
{state.status === "uploading" && (
<button type="button" onClick={abort}>
Cancel upload ({Math.round(state.progress.percent)}%)
</button>
)}
{state.status === "complete" && (
<p>
Uploaded <a href={state.asset.url}>{state.asset.filename}</a>{" "}
<button type="button" onClick={reset}>Upload another</button>
</p>
)}
{state.status === "error" && <p role="alert">{state.error.message}</p>}
</div>
);
}