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>
This commit is contained in:
@@ -2,9 +2,16 @@ import type { AssetImage } from "@paperclip/shared";
|
|||||||
import { api } from "./client";
|
import { api } from "./client";
|
||||||
|
|
||||||
export const assetsApi = {
|
export const assetsApi = {
|
||||||
uploadImage: (companyId: string, file: File, namespace?: string) => {
|
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();
|
const form = new FormData();
|
||||||
form.append("file", file);
|
form.append("file", safeFile);
|
||||||
if (namespace && namespace.trim().length > 0) {
|
if (namespace && namespace.trim().length > 0) {
|
||||||
form.append("namespace", namespace.trim());
|
form.append("namespace", namespace.trim());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -237,6 +237,7 @@ export function NewIssueDialog() {
|
|||||||
>
|
>
|
||||||
<DialogContent
|
<DialogContent
|
||||||
showCloseButton={false}
|
showCloseButton={false}
|
||||||
|
aria-describedby={undefined}
|
||||||
className={cn(
|
className={cn(
|
||||||
"p-0 gap-0 flex flex-col max-h-[calc(100vh-6rem)]",
|
"p-0 gap-0 flex flex-col max-h-[calc(100vh-6rem)]",
|
||||||
expanded
|
expanded
|
||||||
|
|||||||
Reference in New Issue
Block a user