Files
paperclip/ui/src/api/assets.ts
Forgotten 4b7fdaea01 fix: resolve image upload ERR_ACCESS_DENIED and dialog a11y warning
Eagerly read file data into memory via arrayBuffer() before constructing
FormData for the upload fetch. Clipboard-paste File objects from the MDX
editor reference transient browser data that may be discarded after the
paste event handler returns; streaming that stale reference in the fetch
body causes net::ERR_ACCESS_DENIED. Reading into an ArrayBuffer first
makes the FormData self-contained.

Also suppress the Radix UI "Missing Description" console warning on the
NewIssueDialog by setting aria-describedby={undefined}.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:21:04 -06:00

22 lines
881 B
TypeScript

import type { AssetImage } from "@paperclip/shared";
import { api } from "./client";
export const assetsApi = {
uploadImage: async (companyId: string, file: File, namespace?: string) => {
// Read file data into memory eagerly so the fetch body is self-contained.
// Clipboard-paste File objects reference transient data that the browser may
// discard after the paste-event handler returns, causing ERR_ACCESS_DENIED
// when fetch() later tries to stream the FormData body.
const buffer = await file.arrayBuffer();
const safeFile = new File([buffer], file.name, { type: file.type });
const form = new FormData();
form.append("file", safeFile);
if (namespace && namespace.trim().length > 0) {
form.append("namespace", namespace.trim());
}
return api.postForm<AssetImage>(`/companies/${companyId}/assets/images`, form);
},
};