@rpcbase/ui 0.263.0 → 0.264.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index299.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index299.js","names":["useEffect","useMemo","useRef","useState","ReactNode","createPortal","DragEndEvent","DragStartEvent","DropAnimation","DndContext","DragOverlay","KeyboardSensor","PointerSensor","closestCenter","defaultDropAnimationSideEffects","useSensor","useSensors","SortableContext","arrayMove","rectSortingStrategy","sortableKeyboardCoordinates","useSortable","CSS","Loader2","Maximize2","Plus","X","cn","Image","Sha256Worker","FilesUploadFieldFile","id","url","alt","uploadKey","FileUploadsInitResponse","ok","error","uploadId","chunkSize","chunksTotal","fileId","deduplicated","FileUploadsStatusResponse","status","received","FileUploadsCompleteResponse","sha256Hex","data","ArrayBuffer","Promise","crypto","subtle","digest","bytes","Array","from","Uint8Array","map","b","toString","padStart","join","HashWorkerResponse","hash","sha256FileHex","file","File","signal","AbortSignal","Worker","Error","resolve","reject","worker","cleanup","removeEventListener","handleAbort","terminate","name","aborted","addEventListener","once","onerror","onmessage","event","MessageEvent","postMessage","postJson","body","options","headers","Record","T","response","fetch","method","credentials","JSON","stringify","payload","json","catch","getJson","putOctetStream","sha256","defaultUpload","FilesUploadFieldUploadHandler","onProgress","deduplicationNamespace","trim","fileHash","initRes","filename","mimeType","type","accessScope","isPublic","deduplication","namespace","algorithm","totalSize","size","deduplicatedFileId","String","deduplicatedUploadKey","encodeURIComponent","Number","doUploadChunk","index","start","end","Math","min","slice","arrayBuffer","sha","res","undefined","uploadChunks","indices","alreadyUploaded","uploaded","idx","pct","floor","allIndices","length","_","i","complete","completeRes","code","statusRes","isArray","present","Set","missing","has","push","SortableTile","t0","$","_c","item","isHovered","enableImagePreview","renderItem","onHoverEnter","onHoverLeave","onRemove","onRetry","startFullscreen","isUploading","isError","tileClasses","disabled","isDraggingExternal","removeButtonAriaLabel","t1","setNodeRef","attributes","listeners","transform","transition","isDragging","tileRef","previewRef","previewPosition","setPreviewPosition","t2","Symbol","for","el","current","rect","getBoundingClientRect","left","width","top","updatePreviewPosition","t3","t4","raf","schedule","cancelAnimationFrame","requestAnimationFrame","window","t5","Transform","t6","style","t7","fileName","previewUrl","progress","tileContent","t8","node","t9","t10","t11","t12","t13","t14","t15","t16","next","relatedTarget","Node","contains","t17","t18","t19","t20","preview","event_0","next_0","document","t21","t22","errorMessage","getErrorLabel","t23","UploadResult","FileUploadAccessScope","FilesUploadFieldUploadOptions","FilesUploadFieldRenderItemProps","FilesUploadFieldBaseProps","initialFiles","onChange","files","upload","uploadDeduplicationNamespace","maxFiles","onUploadingChange","accept","renderHeader","props","addButtonAriaLabel","variant","FilesUploadFieldVisibilityProps","uploadAccessScope","uploadIsPublic","FilesUploadFieldProps","FileWithState","toPreview","URL","createObjectURL","getErrorMessage","message","startsWith","IMAGE_FILE_NAME_RE","DROP_ANIMATION_FALLBACK_MS","hideDraggedTileDropSideEffects","styles","active","opacity","isImageItem","test","FilesUploadField","fileInputRef","HTMLInputElement","images","setImages","dragActive","setDragActive","fullscreenIndex","setFullscreenIndex","hoveredId","setHoveredId","activeId","setActiveId","dropAnimatingId","setDropAnimatingId","hoverTimeoutRef","dropAnimationFallbackRef","timeout","hasDragOverlayRef","clearDropAnimationRef","dropAnimationRef","sideEffects","args","fallback","clearTimeout","skipNotifyRef","imagesRef","lastInitialImagesRef","onChangeRef","onUploadingChangeRef","replacedIdRef","Map","fileRef","abortRef","AbortController","objectUrlRef","sensors","activationConstraint","distance","coordinateGetter","controller","values","abort","clear","revokeObjectURL","cursor","previous","samePropValue","every","img","prepared","preparedRawIds","tempId","finalId","entries","delete","currentIds","hasStaleInitialImages","some","mapped","get","preparedIds","tempUrl","sameLength","sameContent","handleKey","KeyboardEvent","key","handleFiles","FileList","normalizedMaxFiles","isFinite","remaining","POSITIVE_INFINITY","max","list","uploads","randomUUID","set","updateProgress","value","nextValue","finalize","result","console","allSettled","onFileInputChange","React","ChangeEvent","target","openFileDialog","click","removeImage","filter","retryUpload","existingController","findIndex","clearPendingDropAnimation","scheduleDropAnimationFallback","setTimeout","finishDrag","handleDragStart","handleDragEnd","over","overId","oldIndex","newIndex","handleDragCancel","clearHoverTimeout","fullscreenImage","containerClasses","tileBaseClasses","acceptAttr","tokens","split","Boolean","token","canPreviewItem","canAddFiles","statusItem","find","uploadStatusMessage","toRenderItemProps","dragOverlayContent","activeItem","rendered","hasDragOverlay","hiddenDraggedTileId","preventDefault","dataTransfer","overlay"],"sources":["../src/components/FilesUploadField/index.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { DragEndEvent, DragStartEvent, DropAnimation } from \"@dnd-kit/core\"\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n defaultDropAnimationSideEffects,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport {\n SortableContext,\n arrayMove,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { Loader2, Maximize2, Plus, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { Image } from \"../Image\"\nimport Sha256Worker from \"./sha256.worker.ts?worker&inline\"\n\n\nexport type FilesUploadFieldFile = {\n id: string\n url: string\n alt?: string\n uploadKey?: string\n}\n\ntype FileUploadsInitResponse = {\n ok: boolean\n error?: string\n uploadId?: string\n uploadKey?: string\n chunkSize?: number\n chunksTotal?: number\n fileId?: string\n deduplicated?: boolean\n}\n\ntype FileUploadsStatusResponse = {\n ok: boolean\n error?: string\n status?: \"uploading\" | \"assembling\" | \"done\" | \"error\"\n chunkSize?: number\n chunksTotal?: number\n received?: number[]\n fileId?: string\n}\n\ntype FileUploadsCompleteResponse = {\n ok: boolean\n error?: string\n fileId?: string\n}\n\nconst sha256Hex = async (data: ArrayBuffer): Promise<string | null> => {\n if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") return null\n try {\n const digest = await crypto.subtle.digest(\"SHA-256\", data)\n const bytes = Array.from(new Uint8Array(digest))\n return bytes.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n } catch {\n return null\n }\n}\n\ntype HashWorkerResponse =\n | { ok: true; hash: string }\n | { ok: false; error: string }\n\nconst sha256FileHex = async (file: File, signal?: AbortSignal): Promise<string> => {\n if (typeof Worker === \"undefined\") {\n throw new Error(\"File hashing is not supported in this browser\")\n }\n\n return new Promise((resolve, reject) => {\n const worker = new Sha256Worker()\n\n const cleanup = () => {\n signal?.removeEventListener(\"abort\", handleAbort)\n worker.terminate()\n }\n\n const handleAbort = () => {\n cleanup()\n const error = new Error(\"Upload aborted\")\n error.name = \"AbortError\"\n reject(error)\n }\n\n if (signal?.aborted) {\n handleAbort()\n return\n }\n\n signal?.addEventListener(\"abort\", handleAbort, { once: true })\n worker.onerror = () => {\n cleanup()\n reject(new Error(\"Unable to hash file\"))\n }\n worker.onmessage = (event: MessageEvent<HashWorkerResponse>) => {\n cleanup()\n if (event.data.ok) {\n resolve(event.data.hash)\n return\n }\n reject(new Error(event.data.error === \"hash_unavailable\" ? \"File hashing is not supported in this browser\" : \"Unable to hash file\"))\n }\n worker.postMessage(file)\n })\n}\n\nconst postJson = async <T,>(\n url: string,\n body: unknown,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(options?.headers ?? {}) },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal: options?.signal,\n })\n\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst getJson = async <T,>(\n url: string,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n credentials: \"include\",\n headers: options?.headers,\n signal: options?.signal,\n })\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst putOctetStream = async ({\n url,\n body,\n sha256,\n uploadKey,\n signal,\n}: {\n url: string\n body: ArrayBuffer\n sha256?: string\n uploadKey?: string\n signal?: AbortSignal\n}): Promise<{ ok: boolean; status: number }> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/octet-stream\",\n }\n if (sha256) headers[\"X-Chunk-SHA256\"] = sha256\n if (uploadKey) headers[\"X-Upload-Key\"] = uploadKey\n\n const response = await fetch(url, {\n method: \"PUT\",\n credentials: \"include\",\n headers,\n body,\n signal,\n })\n\n return { ok: response.ok, status: response.status }\n}\n\nconst defaultUpload: FilesUploadFieldUploadHandler = async (file, onProgress, options) => {\n const deduplicationNamespace = options?.deduplicationNamespace?.trim()\n const fileHash = deduplicationNamespace\n ? await sha256FileHex(file, options?.signal)\n : null\n\n const initRes = await postJson<FileUploadsInitResponse>(\n \"/api/rb/file-uploads\",\n {\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n ...(options?.accessScope\n ? { accessScope: options.accessScope }\n : typeof options?.isPublic === \"boolean\"\n ? { isPublic: options.isPublic }\n : {}),\n ...(deduplicationNamespace && fileHash\n ? {\n deduplication: {\n namespace: deduplicationNamespace,\n algorithm: \"sha256\",\n hash: fileHash,\n },\n }\n : {}),\n totalSize: file.size,\n },\n { signal: options?.signal },\n )\n\n if (!initRes.ok || !(initRes.data as any)?.ok) {\n throw new Error((initRes.data as any)?.error ?? `Init failed (${initRes.status})`)\n }\n\n const deduplicatedFileId = String((initRes.data as any)?.fileId ?? \"\").trim()\n if ((initRes.data as any)?.deduplicated === true && deduplicatedFileId) {\n const deduplicatedUploadKey = typeof (initRes.data as any)?.uploadKey === \"string\"\n ? String((initRes.data as any).uploadKey)\n : null\n onProgress(100)\n return {\n id: deduplicatedFileId,\n url: `/api/rb/files/${encodeURIComponent(deduplicatedFileId)}`,\n alt: file.name,\n ...(deduplicatedUploadKey ? { uploadKey: deduplicatedUploadKey } : {}),\n }\n }\n\n const uploadId = String((initRes.data as any)?.uploadId ?? \"\")\n const uploadKey = typeof (initRes.data as any)?.uploadKey === \"string\" ? String((initRes.data as any).uploadKey) : null\n const chunkSize = Number((initRes.data as any)?.chunkSize ?? 0)\n const chunksTotal = Number((initRes.data as any)?.chunksTotal ?? 0)\n\n if (!uploadId || !chunkSize || !chunksTotal) {\n throw new Error(\"Upload init missing required fields\")\n }\n\n const doUploadChunk = async (index: number) => {\n const start = index * chunkSize\n const end = Math.min(file.size, start + chunkSize)\n const slice = file.slice(start, end)\n const body = await slice.arrayBuffer()\n const sha = await sha256Hex(body)\n\n const res = await putOctetStream({\n url: `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/chunks/${index}`,\n body,\n sha256: sha ?? undefined,\n uploadKey: uploadKey ?? undefined,\n signal: options?.signal,\n })\n\n if (res.status === 204) return\n throw new Error(`Chunk ${index} failed (${res.status})`)\n }\n\n const uploadChunks = async (indices: number[], alreadyUploaded = 0) => {\n let uploaded = alreadyUploaded\n\n for (const idx of indices) {\n await doUploadChunk(idx)\n uploaded += 1\n const pct = Math.min(99, Math.floor((uploaded / chunksTotal) * 99))\n onProgress(pct)\n }\n }\n\n const allIndices = Array.from({ length: chunksTotal }, (_, i) => i)\n await uploadChunks(allIndices, 0)\n\n const complete = async (): Promise<string> => {\n const completeRes = await postJson<FileUploadsCompleteResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/complete`,\n {},\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (completeRes.ok && (completeRes.data as any)?.ok) {\n const fileId = String((completeRes.data as any)?.fileId ?? \"\")\n if (!fileId) throw new Error(\"Upload completed without fileId\")\n return fileId\n }\n\n const code = String((completeRes.data as any)?.error ?? \"\")\n if (completeRes.status !== 409 || code !== \"missing_chunks\") {\n throw new Error(code || `Complete failed (${completeRes.status})`)\n }\n\n const statusRes = await getJson<FileUploadsStatusResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/status`,\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (!statusRes.ok || !(statusRes.data as any)?.ok) {\n throw new Error((statusRes.data as any)?.error ?? `Status failed (${statusRes.status})`)\n }\n\n const received = Array.isArray((statusRes.data as any)?.received) ? (statusRes.data as any).received : []\n const present = new Set<number>(received)\n const missing: number[] = []\n for (let i = 0; i < chunksTotal; i += 1) {\n if (!present.has(i)) missing.push(i)\n }\n\n if (!missing.length) {\n throw new Error(\"missing_chunks\")\n }\n\n await uploadChunks(missing, present.size)\n return complete()\n }\n\n const fileId = await complete()\n\n onProgress(100)\n return {\n id: fileId,\n url: `/api/rb/files/${encodeURIComponent(fileId)}`,\n alt: file.name,\n ...(uploadKey ? { uploadKey } : {}),\n }\n}\n\nfunction SortableTile({\n item,\n isHovered,\n enableImagePreview,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n onRetry,\n startFullscreen,\n isUploading,\n isError,\n tileClasses,\n disabled,\n isDraggingExternal,\n removeButtonAriaLabel,\n}: {\n item: FileWithState\n isHovered: boolean\n enableImagePreview: boolean\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n onHoverEnter: () => void\n onHoverLeave: () => void\n onRemove: (id: string) => void\n onRetry: (id: string) => void\n startFullscreen: (id: string) => void\n isUploading: boolean\n isError: boolean\n tileClasses: string\n disabled: boolean\n isDraggingExternal: boolean\n removeButtonAriaLabel: string\n}) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: item.id,\n disabled,\n })\n\n const tileRef = useRef<HTMLDivElement | null>(null)\n const previewRef = useRef<HTMLDivElement | null>(null)\n const [previewPosition, setPreviewPosition] = useState<{ left: number; top: number } | null>(null)\n\n const updatePreviewPosition = () => {\n const el = tileRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setPreviewPosition({ left: rect.left + rect.width / 2, top: rect.top - 10 })\n }\n\n useEffect(() => {\n if (!enableImagePreview || !isHovered) {\n setPreviewPosition(null)\n return\n }\n\n updatePreviewPosition()\n\n let raf = 0\n const schedule = () => {\n if (raf) cancelAnimationFrame(raf)\n raf = requestAnimationFrame(() => {\n raf = 0\n updatePreviewPosition()\n })\n }\n\n window.addEventListener(\"resize\", schedule)\n window.addEventListener(\"scroll\", schedule, true)\n return () => {\n if (raf) cancelAnimationFrame(raf)\n window.removeEventListener(\"resize\", schedule)\n window.removeEventListener(\"scroll\", schedule, true)\n }\n }, [enableImagePreview, isHovered])\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n const tileContent = renderItem\n ? renderItem({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n : enableImagePreview\n ? (\n <Image\n src={item.previewUrl}\n alt={item.alt ?? \"Uploaded file\"}\n sizes=\"96px\"\n className={cn(\n \"size-full rounded-md object-cover\",\n isUploading && \"opacity-75\",\n isError && \"grayscale\"\n )}\n />\n )\n : (\n <div className=\"flex size-full items-center justify-center rounded-md bg-slate-100 px-2 text-center text-[10px] font-medium text-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <span className=\"w-full truncate\">{item.fileName ?? item.alt ?? \"Fichier\"}</span>\n </div>\n )\n\n return (\n <div\n ref={(node) => {\n tileRef.current = node\n setNodeRef(node)\n }}\n style={style}\n className={cn(\n tileClasses,\n isDragging && \"z-20 ring-2 ring-primary shadow-xl\",\n isDraggingExternal && \"opacity-0\",\n !disabled && \"cursor-grab active:cursor-grabbing\",\n isDragging && \"cursor-grabbing\",\n disabled && \"cursor-default\"\n )}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && previewRef.current?.contains(next)) return\n onHoverLeave()\n }}\n {...attributes}\n {...listeners}\n >\n {tileContent}\n\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return\n onRemove(item.id)\n }}\n disabled={disabled}\n className=\"absolute right-1 top-1 inline-flex size-6 items-center justify-center rounded-full bg-white text-slate-700 shadow-sm transition hover:scale-105 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:bg-slate-900 dark:text-slate-200\"\n aria-label={removeButtonAriaLabel}\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n {enableImagePreview &&\n isHovered &&\n previewPosition &&\n (() => {\n const preview = (\n <>\n <div\n ref={previewRef}\n className=\"pointer-events-auto fixed z-[60] w-52 -translate-x-1/2 -translate-y-full rounded-xl border border-slate-200 bg-white/95 p-3 shadow-2xl backdrop-blur dark:border-slate-700 dark:bg-slate-900/95\"\n style={{ left: previewPosition.left, top: previewPosition.top }}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && tileRef.current?.contains(next)) return\n onHoverLeave()\n }}\n >\n <div className=\"relative overflow-hidden rounded-lg\">\n <Image src={item.url} alt={item.alt ?? \"Preview\"} sizes=\"208px\" className=\"h-40 w-full object-cover\" />\n <button\n type=\"button\"\n onClick={() => startFullscreen(item.id)}\n className=\"absolute right-2 top-2 inline-flex items-center justify-center rounded-full bg-black/70 p-2 text-white transition hover:bg-black\"\n aria-label=\"Plein écran\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return preview\n return createPortal(preview, document.body)\n })()}\n\n {isUploading && (\n <div\n className=\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-lg bg-black/40 text-white\"\n role=\"progressbar\"\n aria-label={item.fileName ?? item.alt ?? \"File\"}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={item.progress}\n >\n <Loader2 className=\"h-5 w-5 animate-spin\" aria-hidden=\"true\" />\n <div className=\"h-1.5 w-5/6 rounded-full bg-white/20\">\n <div className=\"h-full rounded-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n <div className=\"text-xs font-semibold\">{item.progress}%</div>\n </div>\n )}\n\n {isError && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-red-600/70 text-white\"\n role=\"alert\"\n >\n <div className=\"max-w-[92%] break-words text-center text-[10px] font-semibold leading-tight\" title={item.errorMessage}>\n {getErrorLabel(item.errorMessage)}\n </div>\n <button\n type=\"button\"\n onClick={() => onRetry(item.id)}\n disabled={disabled}\n className=\"rounded-full bg-white/90 px-3 py-1 text-xs font-semibold text-red-700 shadow-sm transition hover:bg-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Réessayer\n </button>\n </div>\n )}\n </div>\n )\n}\n\ntype UploadResult = FilesUploadFieldFile | Promise<FilesUploadFieldFile>\n\nexport type FileUploadAccessScope = \"owner\" | \"tenant\" | \"public\"\n\nexport type FilesUploadFieldUploadOptions = {\n signal?: AbortSignal\n isPublic?: boolean\n accessScope?: FileUploadAccessScope\n deduplicationNamespace?: string\n}\n\nexport type FilesUploadFieldUploadHandler = (\n file: File,\n onProgress: (progress: number) => void,\n options?: FilesUploadFieldUploadOptions,\n) => UploadResult\n\nexport type FilesUploadFieldRenderItemProps = {\n file: FilesUploadFieldFile\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n}\n\ntype FilesUploadFieldBaseProps = {\n initialFiles?: FilesUploadFieldFile[]\n onChange?: (files: FilesUploadFieldFile[]) => void\n upload?: FilesUploadFieldUploadHandler\n uploadDeduplicationNamespace?: string\n maxFiles?: number\n disabled?: boolean\n onUploadingChange?: (isUploading: boolean) => void\n accept?: string | string[]\n renderHeader?: () => ReactNode\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n addButtonAriaLabel?: string\n removeButtonAriaLabel?: string\n variant?: \"card\" | \"bare\"\n}\n\ntype FilesUploadFieldVisibilityProps =\n | { uploadAccessScope?: never; uploadIsPublic?: boolean }\n | { uploadAccessScope: FileUploadAccessScope; uploadIsPublic?: never }\n\nexport type FilesUploadFieldProps = FilesUploadFieldBaseProps & FilesUploadFieldVisibilityProps\n\ntype FileWithState = FilesUploadFieldFile & {\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n mimeType?: string\n errorMessage?: string\n}\n\nfunction toPreview(file: File) {\n return URL.createObjectURL(file)\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === \"string\") return error\n return \"Upload failed\"\n}\n\nconst getErrorLabel = (message: string | undefined): string => {\n if (!message) return \"Échec\"\n if (message.startsWith(\"heif_decode_unsupported\")) return \"HEIC/HEVC non supporté\"\n return message\n}\n\nconst IMAGE_FILE_NAME_RE = /\\.(png|jpe?g|gif|webp|avif|heic|heif|svg|bmp)$/i\nconst DROP_ANIMATION_FALLBACK_MS = 350\n\nconst hideDraggedTileDropSideEffects = defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0\",\n },\n },\n})\n\nconst isImageItem = (item: FileWithState): boolean => {\n if (item.mimeType) return item.mimeType.startsWith(\"image/\")\n return IMAGE_FILE_NAME_RE.test(item.fileName ?? item.alt ?? \"\")\n}\n\nexport function FilesUploadField({\n initialFiles = [],\n onChange,\n upload = defaultUpload,\n uploadIsPublic,\n uploadAccessScope,\n uploadDeduplicationNamespace,\n maxFiles,\n disabled = false,\n onUploadingChange,\n accept,\n renderHeader,\n renderItem,\n addButtonAriaLabel = \"Ajouter un fichier\",\n removeButtonAriaLabel = \"Supprimer le fichier\",\n variant = \"card\",\n}: FilesUploadFieldProps) {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [images, setImages] = useState<FileWithState[]>(() =>\n initialFiles.map((file) => ({ ...file, previewUrl: file.url, status: \"uploaded\", progress: 100 }))\n )\n const [dragActive, setDragActive] = useState(false)\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dropAnimatingId, setDropAnimatingId] = useState<string | null>(null)\n const hoverTimeoutRef = useRef<number | null>(null)\n const dropAnimationFallbackRef = useRef<{ id: string; timeout: number } | null>(null)\n const hasDragOverlayRef = useRef(false)\n const clearDropAnimationRef = useRef<(id: string) => void>(() => {})\n const dropAnimationRef = useRef<DropAnimation>({\n sideEffects(args) {\n const id = String(args.active.id)\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n const cleanup = hideDraggedTileDropSideEffects(args)\n\n return () => {\n cleanup?.()\n clearDropAnimationRef.current(id)\n }\n },\n })\n const skipNotifyRef = useRef(true)\n const imagesRef = useRef<FileWithState[]>([])\n const lastInitialImagesRef = useRef<FilesUploadFieldFile[]>(initialFiles)\n const onChangeRef = useRef(onChange)\n const onUploadingChangeRef = useRef(onUploadingChange)\n const replacedIdRef = useRef<Map<string, string>>(new Map())\n const fileRef = useRef<Map<string, File>>(new Map())\n const abortRef = useRef<Map<string, AbortController>>(new Map())\n const objectUrlRef = useRef<Map<string, string>>(new Map())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n )\n\n useEffect(() => {\n return () => {\n for (const controller of abortRef.current.values()) {\n try {\n controller.abort()\n } catch {\n //\n }\n }\n abortRef.current.clear()\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n fileRef.current.clear()\n replacedIdRef.current.clear()\n\n for (const url of objectUrlRef.current.values()) {\n if (typeof URL !== \"undefined\") {\n try {\n URL.revokeObjectURL(url)\n } catch {\n //\n }\n }\n }\n objectUrlRef.current.clear()\n }\n }, [])\n\n clearDropAnimationRef.current = (id: string) => {\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n setDropAnimatingId((current) => (current === id ? null : current))\n }\n\n useEffect(() => {\n if (typeof document === \"undefined\") return\n if (activeId) {\n document.body.style.cursor = \"grabbing\"\n return () => {\n document.body.style.cursor = \"\"\n }\n }\n document.body.style.cursor = \"\"\n }, [activeId])\n\n useEffect(() => {\n imagesRef.current = images\n }, [images])\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n onUploadingChangeRef.current = onUploadingChange\n }, [onUploadingChange])\n\n useEffect(() => {\n const previous = lastInitialImagesRef.current\n const samePropValue =\n previous.length === initialFiles.length &&\n previous.every((img, index) => {\n const next = initialFiles[index]\n return next && img.id === next.id && img.url === next.url && img.alt === next.alt\n })\n\n if (samePropValue) return\n lastInitialImagesRef.current = initialFiles\n\n const prepared: FileWithState[] = initialFiles.map((img) => ({\n ...img,\n previewUrl: img.url,\n status: \"uploaded\",\n progress: 100,\n }))\n\n const preparedRawIds = new Set(prepared.map((img) => img.id))\n for (const [tempId, finalId] of replacedIdRef.current.entries()) {\n if (preparedRawIds.has(finalId)) {\n replacedIdRef.current.delete(tempId)\n }\n }\n\n const currentIds = new Set(imagesRef.current.map((img) => img.id))\n const hasStaleInitialImages = prepared.some((img) => {\n const mapped = replacedIdRef.current.get(img.id)\n return mapped ? currentIds.has(mapped) : false\n })\n if (hasStaleInitialImages) return\n\n const preparedIds = new Set(prepared.map((img) => img.id))\n for (const img of imagesRef.current) {\n if (preparedIds.has(img.id)) continue\n\n const controller = abortRef.current.get(img.id)\n if (controller) {\n abortRef.current.delete(img.id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(img.id)\n\n const tempUrl = objectUrlRef.current.get(img.id)\n if (tempUrl) {\n objectUrlRef.current.delete(img.id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n }\n\n setImages((current) => {\n const sameLength = current.length === prepared.length\n const sameContent =\n sameLength &&\n current.every((item, index) => {\n const next = prepared[index]\n return next && item.id === next.id && item.url === next.url && item.alt === next.alt && item.uploadKey === next.uploadKey\n })\n\n if (sameContent) return current\n\n skipNotifyRef.current = true\n return prepared\n })\n }, [initialFiles])\n\n useEffect(() => {\n if (skipNotifyRef.current) {\n skipNotifyRef.current = false\n return\n }\n\n onChangeRef.current?.(images.map(({ id, url, alt, uploadKey }) => ({ id, url, alt, uploadKey })))\n }, [images])\n\n useEffect(() => {\n onUploadingChangeRef.current?.(images.some((img) => img.status === \"uploading\"))\n }, [images])\n\n useEffect(() => {\n if (fullscreenIndex === null) {\n return\n }\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setFullscreenIndex(null)\n return\n }\n\n if (event.key === \"ArrowRight\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n return\n }\n\n if (event.key === \"ArrowLeft\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n }\n\n window.addEventListener(\"keydown\", handleKey)\n return () => window.removeEventListener(\"keydown\", handleKey)\n }, [fullscreenIndex, images.length])\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const remaining = normalizedMaxFiles === null\n ? Number.POSITIVE_INFINITY\n : Math.max(0, normalizedMaxFiles - imagesRef.current.length)\n const list = Array.from(files).slice(0, remaining)\n if (!list.length) return\n\n const uploads = list.map((file) => {\n const previewUrl = toPreview(file)\n const tempId = crypto.randomUUID()\n\n objectUrlRef.current.set(tempId, previewUrl)\n fileRef.current.set(tempId, file)\n\n const next: FileWithState = {\n id: tempId,\n url: previewUrl,\n previewUrl,\n alt: file.name,\n status: \"uploading\",\n progress: 0,\n fileName: file.name,\n mimeType: file.type,\n }\n\n setImages((current) => [...current, next])\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) =>\n item.id === tempId ? { ...item, progress: nextValue, status: \"uploading\" } : item\n )\n )\n }\n\n const finalize = async () => {\n const controller = new AbortController()\n abortRef.current.set(tempId, controller)\n\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(tempId, result.id)\n\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n abortRef.current.delete(tempId)\n fileRef.current.delete(tempId)\n\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? {\n ...item,\n ...result,\n previewUrl: result.url,\n url: result.url,\n status: \"uploaded\",\n progress: 100,\n errorMessage: undefined,\n }\n : item\n )\n )\n } catch (error) {\n abortRef.current.delete(tempId)\n if (controller.signal.aborted) {\n fileRef.current.delete(tempId)\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n return\n }\n console.error(\"Upload failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? { ...item, status: \"error\", progress: Math.max(0, Math.min(99, item.progress)), errorMessage }\n : item\n )\n )\n }\n }\n\n return finalize()\n })\n\n await Promise.allSettled(uploads)\n }\n\n const onFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!event.target.files) return\n void handleFiles(event.target.files)\n event.target.value = \"\"\n }\n\n const openFileDialog = () => {\n if (disabled) return\n fileInputRef.current?.click()\n }\n\n const removeImage = (id: string) => {\n const controller = abortRef.current.get(id)\n if (controller) {\n abortRef.current.delete(id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n setImages((current) => current.filter((item) => item.id !== id))\n }\n\n const retryUpload = (id: string) => {\n if (disabled) return\n const file = fileRef.current.get(id)\n if (!file) return\n\n const existingController = abortRef.current.get(id)\n if (existingController) {\n try {\n existingController.abort()\n } catch {\n //\n }\n abortRef.current.delete(id)\n }\n\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, status: \"uploading\", progress: 0, errorMessage: undefined } : item))\n )\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, progress: nextValue, status: \"uploading\" } : item))\n )\n }\n\n const controller = new AbortController()\n abortRef.current.set(id, controller)\n\n void (async () => {\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(id, result.id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n abortRef.current.delete(id)\n fileRef.current.delete(id)\n\n setImages((current) =>\n current.map((item) =>\n item.id === id\n ? { ...item, ...result, previewUrl: result.url, url: result.url, status: \"uploaded\", progress: 100, errorMessage: undefined }\n : item\n )\n )\n } catch (error) {\n abortRef.current.delete(id)\n if (controller.signal.aborted) return\n console.error(\"Retry failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) => current.map((item) => (item.id === id ? { ...item, status: \"error\", errorMessage } : item)))\n }\n })()\n }\n\n const startFullscreen = (id: string) => {\n const index = images.findIndex((item) => item.id === id)\n if (index !== -1) {\n setFullscreenIndex(index)\n }\n }\n\n const clearPendingDropAnimation = () => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n setDropAnimatingId(null)\n }\n\n const scheduleDropAnimationFallback = (id: string) => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n }\n\n dropAnimationFallbackRef.current = {\n id,\n timeout: window.setTimeout(() => {\n dropAnimationFallbackRef.current = null\n setDropAnimatingId((current) => (current === id ? null : current))\n }, DROP_ANIMATION_FALLBACK_MS),\n }\n }\n\n const finishDrag = (id: string) => {\n if (hasDragOverlayRef.current) {\n setDropAnimatingId(id)\n scheduleDropAnimationFallback(id)\n }\n setActiveId(null)\n }\n\n const handleDragStart = (event: DragStartEvent) => {\n clearPendingDropAnimation()\n setActiveId(String(event.active.id))\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n const activeId = String(active.id)\n\n if (!over) {\n finishDrag(activeId)\n return\n }\n\n const overId = String(over.id)\n\n if (activeId !== overId) {\n setImages((current) => {\n const oldIndex = current.findIndex((item) => item.id === activeId)\n const newIndex = current.findIndex((item) => item.id === overId)\n if (oldIndex === -1 || newIndex === -1) return current\n return arrayMove(current, oldIndex, newIndex)\n })\n }\n\n finishDrag(activeId)\n }\n\n const handleDragCancel = () => {\n if (activeId) {\n finishDrag(activeId)\n return\n }\n\n setActiveId(null)\n }\n\n const clearHoverTimeout = () => {\n if (hoverTimeoutRef.current !== null) {\n window.clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const fullscreenImage = useMemo(() => {\n if (fullscreenIndex === null) return null\n return images[fullscreenIndex] ?? null\n }, [fullscreenIndex, images])\n\n const containerClasses = cn(\n variant === \"bare\"\n ? \"rounded-lg transition-colors\"\n : \"rounded-xl border border-dashed border-slate-300 bg-white/70 p-4 shadow-sm transition-colors dark:border-slate-700 dark:bg-slate-900/60\",\n dragActive && (variant === \"bare\" ? \"bg-primary/5 ring-2 ring-primary/50\" : \"border-primary ring-2 ring-primary/50\"),\n disabled && \"opacity-70\"\n )\n\n const tileBaseClasses = \"group relative size-20 overflow-visible rounded-lg border border-slate-200 bg-slate-50 shadow-inner transition hover:shadow md:size-24 dark:border-slate-700 dark:bg-slate-800\"\n\n const acceptAttr = useMemo(() => {\n if (!accept) return undefined\n if (Array.isArray(accept)) return accept.join(\",\")\n return accept\n }, [accept])\n\n const enableImagePreview = useMemo(() => {\n if (renderItem) return false\n if (!acceptAttr) return false\n const tokens = acceptAttr.split(\",\").map((value) => value.trim()).filter(Boolean)\n if (!tokens.length) return false\n return tokens.every((token) =>\n token === \"image/*\" ||\n token.startsWith(\"image/\") ||\n token === \".heic\" ||\n token === \".heif\" ||\n token === \".heics\" ||\n token === \".heifs\"\n )\n }, [acceptAttr, renderItem])\n\n const canPreviewItem = (item: FileWithState) => enableImagePreview || (!renderItem && isImageItem(item))\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const canAddFiles = !disabled && (normalizedMaxFiles === null || images.length < normalizedMaxFiles)\n const statusItem = images.find((item) => item.status === \"error\") ??\n images.find((item) => item.status === \"uploading\")\n const uploadStatusMessage = statusItem\n ? statusItem.status === \"error\"\n ? getErrorLabel(statusItem.errorMessage)\n : `${statusItem.fileName ?? statusItem.alt ?? \"File\"}: ${statusItem.progress}%`\n : \"\"\n\n const toRenderItemProps = (item: FileWithState): FilesUploadFieldRenderItemProps => ({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n\n const dragOverlayContent = activeId\n ? (() => {\n const activeItem = images.find((item) => item.id === activeId)\n if (!activeItem) return null\n\n if (renderItem) {\n const rendered = renderItem(toRenderItemProps(activeItem))\n if (rendered === null || rendered === undefined || rendered === false) return null\n return (\n <div className=\"pointer-events-none\">\n <div className=\"h-24 w-24 overflow-hidden rounded-lg shadow-2xl\">{rendered}</div>\n </div>\n )\n }\n\n if (!canPreviewItem(activeItem)) return null\n return (\n <div className=\"pointer-events-none\">\n <Image\n src={activeItem.previewUrl}\n alt={activeItem.alt ?? \"Dragged image\"}\n sizes=\"96px\"\n className=\"h-24 w-24 rounded-lg object-cover shadow-2xl\"\n />\n </div>\n )\n })()\n : null\n\n const hasDragOverlay = dragOverlayContent !== null && dragOverlayContent !== undefined\n const hiddenDraggedTileId = hasDragOverlay ? activeId : dropAnimatingId\n hasDragOverlayRef.current = hasDragOverlay\n\n return (\n <div\n onDragOver={(event) => {\n event.preventDefault()\n if (canAddFiles) {\n setDragActive(true)\n }\n }}\n onDragLeave={() => setDragActive(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragActive(false)\n if (canAddFiles && event.dataTransfer.files?.length) {\n void handleFiles(event.dataTransfer.files)\n }\n }}\n className={containerClasses}\n >\n {renderHeader ? <div className=\"mb-3\">{renderHeader()}</div> : null}\n <div role=\"status\" className=\"sr-only\">{uploadStatusMessage}</div>\n\n <DndContext\n sensors={disabled ? undefined : sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext items={images.map((item) => item.id)} strategy={rectSortingStrategy}>\n <div className=\"flex flex-wrap gap-3\">\n {images.map((item) => {\n const isUploading = item.status === \"uploading\"\n const isError = item.status === \"error\"\n\n return (\n <SortableTile\n key={item.id}\n item={item}\n isHovered={hoveredId === item.id}\n enableImagePreview={canPreviewItem(item)}\n renderItem={renderItem}\n onHoverEnter={() => {\n clearHoverTimeout()\n setHoveredId(item.id)\n }}\n onHoverLeave={() => {\n clearHoverTimeout()\n hoverTimeoutRef.current = window.setTimeout(() => {\n setHoveredId((current) => (current === item.id ? null : current))\n hoverTimeoutRef.current = null\n }, 120)\n }}\n onRemove={removeImage}\n onRetry={retryUpload}\n startFullscreen={startFullscreen}\n isUploading={isUploading}\n isError={isError}\n tileClasses={tileBaseClasses}\n disabled={disabled}\n isDraggingExternal={hiddenDraggedTileId === item.id}\n removeButtonAriaLabel={removeButtonAriaLabel}\n />\n )\n })}\n\n {canAddFiles && (variant === \"bare\" && images.length === 0 ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex w-full flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-slate-300 px-4 py-6 text-slate-500 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 dark:border-slate-700 dark:hover:bg-slate-800/50\"\n aria-label={addButtonAriaLabel}\n >\n <Plus className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{addButtonAriaLabel}</span>\n <span className=\"text-[11px] text-slate-400 dark:text-slate-500\">ou glissez-déposez ici</span>\n </button>\n ) : variant === \"bare\" ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex size-20 items-center justify-center rounded-lg border border-dashed border-slate-300 text-slate-400 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 md:size-24 dark:border-slate-700 dark:hover:bg-slate-800/50 dark:hover:text-slate-300\"\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <Plus className=\"h-4 w-4\" />\n <span className=\"text-[11px] font-medium\">Ajouter</span>\n </div>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className={cn(\n tileBaseClasses,\n \"flex items-center justify-center border-dashed bg-white text-slate-500 hover:border-slate-300 dark:bg-slate-900\"\n )}\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex size-9 items-center justify-center rounded-full border border-slate-300 bg-slate-100 text-slate-600 shadow-inner dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <Plus className=\"h-5 w-5\" />\n </div>\n <span className=\"text-xs font-medium\">Ajouter</span>\n </div>\n </button>\n ))}\n </div>\n </SortableContext>\n {(() => {\n const overlay = <DragOverlay dropAnimation={dropAnimationRef.current}>{dragOverlayContent}</DragOverlay>\n\n if (typeof document === \"undefined\") return overlay\n return createPortal(overlay, document.body)\n })()}\n </DndContext>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptAttr}\n multiple={normalizedMaxFiles !== 1}\n disabled={!canAddFiles}\n className=\"hidden\"\n onChange={onFileInputChange}\n aria-hidden\n />\n\n {fullscreenImage && canPreviewItem(fullscreenImage) && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\">\n <button\n type=\"button\"\n className=\"absolute left-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n aria-label=\"Précédent\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M15 18l-6-6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <div className=\"relative max-h-[80vh] max-w-4xl\">\n <Image\n src={fullscreenImage.url}\n alt={fullscreenImage.alt ?? \"Fullscreen\"}\n sizes=\"(max-width: 1024px) 100vw, 1024px\"\n className=\"max-h-[80vh] max-w-full rounded-lg object-contain shadow-2xl\"\n />\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex size-9 items-center justify-center rounded-full bg-black/70 text-white transition hover:bg-black focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() => setFullscreenIndex(null)}\n aria-label=\"Fermer\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"absolute right-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n }\n aria-label=\"Suivant\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M9 6l6 6-6 6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index299.js","names":["useEffect","useMemo","useRef","useState","ReactNode","createPortal","DragEndEvent","DragStartEvent","DropAnimation","DndContext","DragOverlay","KeyboardSensor","PointerSensor","closestCenter","defaultDropAnimationSideEffects","useSensor","useSensors","SortableContext","arrayMove","rectSortingStrategy","sortableKeyboardCoordinates","useSortable","CSS","Loader2","Maximize2","Plus","X","cn","Image","getImageSrcSet","isRpcbaseFileImageSrc","withImageWidth","Sha256Worker","FilesUploadFieldFile","id","url","alt","uploadKey","FileUploadsInitResponse","ok","error","uploadId","chunkSize","chunksTotal","fileId","deduplicated","FileUploadsStatusResponse","status","received","FileUploadsCompleteResponse","sha256Hex","data","ArrayBuffer","Promise","crypto","subtle","digest","bytes","Array","from","Uint8Array","map","b","toString","padStart","join","HashWorkerResponse","hash","sha256FileHex","file","File","signal","AbortSignal","Worker","Error","resolve","reject","worker","cleanup","removeEventListener","handleAbort","terminate","name","aborted","addEventListener","once","onerror","onmessage","event","MessageEvent","postMessage","postJson","body","options","headers","Record","T","response","fetch","method","credentials","JSON","stringify","payload","json","catch","getJson","putOctetStream","sha256","defaultUpload","FilesUploadFieldUploadHandler","onProgress","deduplicationNamespace","trim","fileHash","initRes","filename","mimeType","type","accessScope","isPublic","deduplication","namespace","algorithm","totalSize","size","deduplicatedFileId","String","deduplicatedUploadKey","encodeURIComponent","Number","doUploadChunk","index","start","end","Math","min","slice","arrayBuffer","sha","res","undefined","uploadChunks","indices","alreadyUploaded","uploaded","idx","pct","floor","allIndices","length","_","i","complete","completeRes","code","statusRes","isArray","present","Set","missing","has","push","SortableTile","t0","$","_c","item","isHovered","enableImagePreview","renderItem","onHoverEnter","onHoverLeave","onRemove","onRetry","startFullscreen","isUploading","isError","tileClasses","disabled","isDraggingExternal","removeButtonAriaLabel","t1","setNodeRef","attributes","listeners","transform","transition","isDragging","tileRef","previewRef","previewPosition","setPreviewPosition","t2","Symbol","for","el","current","rect","getBoundingClientRect","left","width","top","updatePreviewPosition","t3","t4","raf","schedule","cancelAnimationFrame","requestAnimationFrame","window","t5","Transform","t6","style","t7","fileName","previewUrl","progress","tileContent","t8","node","t9","t10","t11","t12","t13","t14","t15","t16","next","relatedTarget","Node","contains","t17","t18","t19","t20","preview","event_0","next_0","document","t21","t22","errorMessage","getErrorLabel","t23","UploadResult","FileUploadAccessScope","FilesUploadFieldUploadOptions","FilesUploadFieldRenderItemProps","FilesUploadFieldBaseProps","initialFiles","onChange","files","upload","uploadDeduplicationNamespace","maxFiles","onUploadingChange","accept","renderHeader","props","addButtonAriaLabel","variant","FilesUploadFieldVisibilityProps","uploadAccessScope","uploadIsPublic","FilesUploadFieldProps","FileWithState","renderKey","toPreview","URL","createObjectURL","preloadImagePreview","src","image","createElement","srcSet","srcset","sizes","decode","onload","getErrorMessage","message","startsWith","IMAGE_FILE_NAME_RE","DROP_ANIMATION_FALLBACK_MS","hideDraggedTileDropSideEffects","styles","active","opacity","isImageItem","test","FilesUploadField","fileInputRef","HTMLInputElement","images","setImages","dragActive","setDragActive","fullscreenIndex","setFullscreenIndex","hoveredId","setHoveredId","activeId","setActiveId","dropAnimatingId","setDropAnimatingId","hoverTimeoutRef","dropAnimationFallbackRef","timeout","hasDragOverlayRef","clearDropAnimationRef","dropAnimationRef","sideEffects","args","fallback","clearTimeout","skipNotifyRef","imagesRef","lastInitialImagesRef","onChangeRef","onUploadingChangeRef","replacedIdRef","Map","fileRef","abortRef","AbortController","objectUrlRef","sensors","activationConstraint","distance","coordinateGetter","controller","values","abort","clear","revokeObjectURL","cursor","previous","samePropValue","every","img","renderKeysById","prepared","get","preparedRawIds","tempId","finalId","entries","delete","currentIds","hasStaleInitialImages","some","mapped","preparedIds","tempUrl","sameLength","sameContent","handleKey","KeyboardEvent","key","handleFiles","FileList","normalizedMaxFiles","isFinite","remaining","POSITIVE_INFINITY","max","list","uploads","randomUUID","set","updateProgress","value","nextValue","finalize","result","console","allSettled","onFileInputChange","React","ChangeEvent","target","openFileDialog","click","removeImage","filter","retryUpload","existingController","findIndex","clearPendingDropAnimation","scheduleDropAnimationFallback","setTimeout","finishDrag","handleDragStart","handleDragEnd","over","overId","oldIndex","newIndex","handleDragCancel","clearHoverTimeout","fullscreenImage","containerClasses","tileBaseClasses","acceptAttr","tokens","split","Boolean","token","canPreviewItem","canAddFiles","statusItem","find","uploadStatusMessage","toRenderItemProps","dragOverlayContent","activeItem","rendered","hasDragOverlay","hiddenDraggedTileId","preventDefault","dataTransfer","overlay"],"sources":["../src/components/FilesUploadField/index.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { DragEndEvent, DragStartEvent, DropAnimation } from \"@dnd-kit/core\"\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n defaultDropAnimationSideEffects,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport {\n SortableContext,\n arrayMove,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { Loader2, Maximize2, Plus, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { Image, getImageSrcSet, isRpcbaseFileImageSrc, withImageWidth } from \"../Image\"\nimport Sha256Worker from \"./sha256.worker.ts?worker&inline\"\n\n\nexport type FilesUploadFieldFile = {\n id: string\n url: string\n alt?: string\n uploadKey?: string\n}\n\ntype FileUploadsInitResponse = {\n ok: boolean\n error?: string\n uploadId?: string\n uploadKey?: string\n chunkSize?: number\n chunksTotal?: number\n fileId?: string\n deduplicated?: boolean\n}\n\ntype FileUploadsStatusResponse = {\n ok: boolean\n error?: string\n status?: \"uploading\" | \"assembling\" | \"done\" | \"error\"\n chunkSize?: number\n chunksTotal?: number\n received?: number[]\n fileId?: string\n}\n\ntype FileUploadsCompleteResponse = {\n ok: boolean\n error?: string\n fileId?: string\n}\n\nconst sha256Hex = async (data: ArrayBuffer): Promise<string | null> => {\n if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") return null\n try {\n const digest = await crypto.subtle.digest(\"SHA-256\", data)\n const bytes = Array.from(new Uint8Array(digest))\n return bytes.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n } catch {\n return null\n }\n}\n\ntype HashWorkerResponse =\n | { ok: true; hash: string }\n | { ok: false; error: string }\n\nconst sha256FileHex = async (file: File, signal?: AbortSignal): Promise<string> => {\n if (typeof Worker === \"undefined\") {\n throw new Error(\"File hashing is not supported in this browser\")\n }\n\n return new Promise((resolve, reject) => {\n const worker = new Sha256Worker()\n\n const cleanup = () => {\n signal?.removeEventListener(\"abort\", handleAbort)\n worker.terminate()\n }\n\n const handleAbort = () => {\n cleanup()\n const error = new Error(\"Upload aborted\")\n error.name = \"AbortError\"\n reject(error)\n }\n\n if (signal?.aborted) {\n handleAbort()\n return\n }\n\n signal?.addEventListener(\"abort\", handleAbort, { once: true })\n worker.onerror = () => {\n cleanup()\n reject(new Error(\"Unable to hash file\"))\n }\n worker.onmessage = (event: MessageEvent<HashWorkerResponse>) => {\n cleanup()\n if (event.data.ok) {\n resolve(event.data.hash)\n return\n }\n reject(new Error(event.data.error === \"hash_unavailable\" ? \"File hashing is not supported in this browser\" : \"Unable to hash file\"))\n }\n worker.postMessage(file)\n })\n}\n\nconst postJson = async <T,>(\n url: string,\n body: unknown,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(options?.headers ?? {}) },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal: options?.signal,\n })\n\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst getJson = async <T,>(\n url: string,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n credentials: \"include\",\n headers: options?.headers,\n signal: options?.signal,\n })\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst putOctetStream = async ({\n url,\n body,\n sha256,\n uploadKey,\n signal,\n}: {\n url: string\n body: ArrayBuffer\n sha256?: string\n uploadKey?: string\n signal?: AbortSignal\n}): Promise<{ ok: boolean; status: number }> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/octet-stream\",\n }\n if (sha256) headers[\"X-Chunk-SHA256\"] = sha256\n if (uploadKey) headers[\"X-Upload-Key\"] = uploadKey\n\n const response = await fetch(url, {\n method: \"PUT\",\n credentials: \"include\",\n headers,\n body,\n signal,\n })\n\n return { ok: response.ok, status: response.status }\n}\n\nconst defaultUpload: FilesUploadFieldUploadHandler = async (file, onProgress, options) => {\n const deduplicationNamespace = options?.deduplicationNamespace?.trim()\n const fileHash = deduplicationNamespace\n ? await sha256FileHex(file, options?.signal)\n : null\n\n const initRes = await postJson<FileUploadsInitResponse>(\n \"/api/rb/file-uploads\",\n {\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n ...(options?.accessScope\n ? { accessScope: options.accessScope }\n : typeof options?.isPublic === \"boolean\"\n ? { isPublic: options.isPublic }\n : {}),\n ...(deduplicationNamespace && fileHash\n ? {\n deduplication: {\n namespace: deduplicationNamespace,\n algorithm: \"sha256\",\n hash: fileHash,\n },\n }\n : {}),\n totalSize: file.size,\n },\n { signal: options?.signal },\n )\n\n if (!initRes.ok || !(initRes.data as any)?.ok) {\n throw new Error((initRes.data as any)?.error ?? `Init failed (${initRes.status})`)\n }\n\n const deduplicatedFileId = String((initRes.data as any)?.fileId ?? \"\").trim()\n if ((initRes.data as any)?.deduplicated === true && deduplicatedFileId) {\n const deduplicatedUploadKey = typeof (initRes.data as any)?.uploadKey === \"string\"\n ? String((initRes.data as any).uploadKey)\n : null\n onProgress(100)\n return {\n id: deduplicatedFileId,\n url: `/api/rb/files/${encodeURIComponent(deduplicatedFileId)}`,\n alt: file.name,\n ...(deduplicatedUploadKey ? { uploadKey: deduplicatedUploadKey } : {}),\n }\n }\n\n const uploadId = String((initRes.data as any)?.uploadId ?? \"\")\n const uploadKey = typeof (initRes.data as any)?.uploadKey === \"string\" ? String((initRes.data as any).uploadKey) : null\n const chunkSize = Number((initRes.data as any)?.chunkSize ?? 0)\n const chunksTotal = Number((initRes.data as any)?.chunksTotal ?? 0)\n\n if (!uploadId || !chunkSize || !chunksTotal) {\n throw new Error(\"Upload init missing required fields\")\n }\n\n const doUploadChunk = async (index: number) => {\n const start = index * chunkSize\n const end = Math.min(file.size, start + chunkSize)\n const slice = file.slice(start, end)\n const body = await slice.arrayBuffer()\n const sha = await sha256Hex(body)\n\n const res = await putOctetStream({\n url: `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/chunks/${index}`,\n body,\n sha256: sha ?? undefined,\n uploadKey: uploadKey ?? undefined,\n signal: options?.signal,\n })\n\n if (res.status === 204) return\n throw new Error(`Chunk ${index} failed (${res.status})`)\n }\n\n const uploadChunks = async (indices: number[], alreadyUploaded = 0) => {\n let uploaded = alreadyUploaded\n\n for (const idx of indices) {\n await doUploadChunk(idx)\n uploaded += 1\n const pct = Math.min(99, Math.floor((uploaded / chunksTotal) * 99))\n onProgress(pct)\n }\n }\n\n const allIndices = Array.from({ length: chunksTotal }, (_, i) => i)\n await uploadChunks(allIndices, 0)\n\n const complete = async (): Promise<string> => {\n const completeRes = await postJson<FileUploadsCompleteResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/complete`,\n {},\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (completeRes.ok && (completeRes.data as any)?.ok) {\n const fileId = String((completeRes.data as any)?.fileId ?? \"\")\n if (!fileId) throw new Error(\"Upload completed without fileId\")\n return fileId\n }\n\n const code = String((completeRes.data as any)?.error ?? \"\")\n if (completeRes.status !== 409 || code !== \"missing_chunks\") {\n throw new Error(code || `Complete failed (${completeRes.status})`)\n }\n\n const statusRes = await getJson<FileUploadsStatusResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/status`,\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (!statusRes.ok || !(statusRes.data as any)?.ok) {\n throw new Error((statusRes.data as any)?.error ?? `Status failed (${statusRes.status})`)\n }\n\n const received = Array.isArray((statusRes.data as any)?.received) ? (statusRes.data as any).received : []\n const present = new Set<number>(received)\n const missing: number[] = []\n for (let i = 0; i < chunksTotal; i += 1) {\n if (!present.has(i)) missing.push(i)\n }\n\n if (!missing.length) {\n throw new Error(\"missing_chunks\")\n }\n\n await uploadChunks(missing, present.size)\n return complete()\n }\n\n const fileId = await complete()\n\n onProgress(100)\n return {\n id: fileId,\n url: `/api/rb/files/${encodeURIComponent(fileId)}`,\n alt: file.name,\n ...(uploadKey ? { uploadKey } : {}),\n }\n}\n\nfunction SortableTile({\n item,\n isHovered,\n enableImagePreview,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n onRetry,\n startFullscreen,\n isUploading,\n isError,\n tileClasses,\n disabled,\n isDraggingExternal,\n removeButtonAriaLabel,\n}: {\n item: FileWithState\n isHovered: boolean\n enableImagePreview: boolean\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n onHoverEnter: () => void\n onHoverLeave: () => void\n onRemove: (id: string) => void\n onRetry: (id: string) => void\n startFullscreen: (id: string) => void\n isUploading: boolean\n isError: boolean\n tileClasses: string\n disabled: boolean\n isDraggingExternal: boolean\n removeButtonAriaLabel: string\n}) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: item.id,\n disabled,\n })\n\n const tileRef = useRef<HTMLDivElement | null>(null)\n const previewRef = useRef<HTMLDivElement | null>(null)\n const [previewPosition, setPreviewPosition] = useState<{ left: number; top: number } | null>(null)\n\n const updatePreviewPosition = () => {\n const el = tileRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setPreviewPosition({ left: rect.left + rect.width / 2, top: rect.top - 10 })\n }\n\n useEffect(() => {\n if (!enableImagePreview || !isHovered) {\n setPreviewPosition(null)\n return\n }\n\n updatePreviewPosition()\n\n let raf = 0\n const schedule = () => {\n if (raf) cancelAnimationFrame(raf)\n raf = requestAnimationFrame(() => {\n raf = 0\n updatePreviewPosition()\n })\n }\n\n window.addEventListener(\"resize\", schedule)\n window.addEventListener(\"scroll\", schedule, true)\n return () => {\n if (raf) cancelAnimationFrame(raf)\n window.removeEventListener(\"resize\", schedule)\n window.removeEventListener(\"scroll\", schedule, true)\n }\n }, [enableImagePreview, isHovered])\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n const tileContent = renderItem\n ? renderItem({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n : enableImagePreview\n ? (\n <Image\n src={item.previewUrl}\n alt={item.alt ?? \"Uploaded file\"}\n sizes=\"96px\"\n className={cn(\n \"size-full rounded-md object-cover\",\n isUploading && \"opacity-75\",\n isError && \"grayscale\"\n )}\n />\n )\n : (\n <div className=\"flex size-full items-center justify-center rounded-md bg-slate-100 px-2 text-center text-[10px] font-medium text-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <span className=\"w-full truncate\">{item.fileName ?? item.alt ?? \"Fichier\"}</span>\n </div>\n )\n\n return (\n <div\n ref={(node) => {\n tileRef.current = node\n setNodeRef(node)\n }}\n style={style}\n className={cn(\n tileClasses,\n isDragging && \"z-20 ring-2 ring-primary shadow-xl\",\n isDraggingExternal && \"opacity-0\",\n !disabled && \"cursor-grab active:cursor-grabbing\",\n isDragging && \"cursor-grabbing\",\n disabled && \"cursor-default\"\n )}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && previewRef.current?.contains(next)) return\n onHoverLeave()\n }}\n {...attributes}\n {...listeners}\n >\n {tileContent}\n\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return\n onRemove(item.id)\n }}\n disabled={disabled}\n className=\"absolute right-1 top-1 inline-flex size-6 items-center justify-center rounded-full bg-white text-slate-700 shadow-sm transition hover:scale-105 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:bg-slate-900 dark:text-slate-200\"\n aria-label={removeButtonAriaLabel}\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n {enableImagePreview &&\n isHovered &&\n previewPosition &&\n (() => {\n const preview = (\n <>\n <div\n ref={previewRef}\n className=\"pointer-events-auto fixed z-[60] w-52 -translate-x-1/2 -translate-y-full rounded-xl border border-slate-200 bg-white/95 p-3 shadow-2xl backdrop-blur dark:border-slate-700 dark:bg-slate-900/95\"\n style={{ left: previewPosition.left, top: previewPosition.top }}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && tileRef.current?.contains(next)) return\n onHoverLeave()\n }}\n >\n <div className=\"relative overflow-hidden rounded-lg\">\n <Image src={item.url} alt={item.alt ?? \"Preview\"} sizes=\"208px\" className=\"h-40 w-full object-cover\" />\n <button\n type=\"button\"\n onClick={() => startFullscreen(item.id)}\n className=\"absolute right-2 top-2 inline-flex items-center justify-center rounded-full bg-black/70 p-2 text-white transition hover:bg-black\"\n aria-label=\"Plein écran\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return preview\n return createPortal(preview, document.body)\n })()}\n\n {isUploading && (\n <div\n className=\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-lg bg-black/40 text-white\"\n role=\"progressbar\"\n aria-label={item.fileName ?? item.alt ?? \"File\"}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={item.progress}\n >\n <Loader2 className=\"h-5 w-5 animate-spin\" aria-hidden=\"true\" />\n <div className=\"h-1.5 w-5/6 rounded-full bg-white/20\">\n <div className=\"h-full rounded-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n <div className=\"text-xs font-semibold\">{item.progress}%</div>\n </div>\n )}\n\n {isError && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-red-600/70 text-white\"\n role=\"alert\"\n >\n <div className=\"max-w-[92%] break-words text-center text-[10px] font-semibold leading-tight\" title={item.errorMessage}>\n {getErrorLabel(item.errorMessage)}\n </div>\n <button\n type=\"button\"\n onClick={() => onRetry(item.id)}\n disabled={disabled}\n className=\"rounded-full bg-white/90 px-3 py-1 text-xs font-semibold text-red-700 shadow-sm transition hover:bg-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Réessayer\n </button>\n </div>\n )}\n </div>\n )\n}\n\ntype UploadResult = FilesUploadFieldFile | Promise<FilesUploadFieldFile>\n\nexport type FileUploadAccessScope = \"owner\" | \"tenant\" | \"public\"\n\nexport type FilesUploadFieldUploadOptions = {\n signal?: AbortSignal\n isPublic?: boolean\n accessScope?: FileUploadAccessScope\n deduplicationNamespace?: string\n}\n\nexport type FilesUploadFieldUploadHandler = (\n file: File,\n onProgress: (progress: number) => void,\n options?: FilesUploadFieldUploadOptions,\n) => UploadResult\n\nexport type FilesUploadFieldRenderItemProps = {\n file: FilesUploadFieldFile\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n}\n\ntype FilesUploadFieldBaseProps = {\n initialFiles?: FilesUploadFieldFile[]\n onChange?: (files: FilesUploadFieldFile[]) => void\n upload?: FilesUploadFieldUploadHandler\n uploadDeduplicationNamespace?: string\n maxFiles?: number\n disabled?: boolean\n onUploadingChange?: (isUploading: boolean) => void\n accept?: string | string[]\n renderHeader?: () => ReactNode\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n addButtonAriaLabel?: string\n removeButtonAriaLabel?: string\n variant?: \"card\" | \"bare\"\n}\n\ntype FilesUploadFieldVisibilityProps =\n | { uploadAccessScope?: never; uploadIsPublic?: boolean }\n | { uploadAccessScope: FileUploadAccessScope; uploadIsPublic?: never }\n\nexport type FilesUploadFieldProps = FilesUploadFieldBaseProps & FilesUploadFieldVisibilityProps\n\ntype FileWithState = FilesUploadFieldFile & {\n renderKey: string\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n mimeType?: string\n errorMessage?: string\n}\n\nfunction toPreview(file: File) {\n return URL.createObjectURL(file)\n}\n\nasync function preloadImagePreview(src: string) {\n const image = document.createElement(\"img\")\n const srcSet = getImageSrcSet(src)\n if (srcSet) {\n image.srcset = srcSet\n image.sizes = \"96px\"\n }\n image.src = isRpcbaseFileImageSrc(src) ? withImageWidth(src, 960) : src\n if (typeof image.decode === \"function\") {\n await image.decode().catch(() => undefined)\n return\n }\n if (image.complete) return\n\n await new Promise<void>((resolve) => {\n image.onload = () => resolve()\n image.onerror = () => resolve()\n })\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === \"string\") return error\n return \"Upload failed\"\n}\n\nconst getErrorLabel = (message: string | undefined): string => {\n if (!message) return \"Échec\"\n if (message.startsWith(\"heif_decode_unsupported\")) return \"HEIC/HEVC non supporté\"\n return message\n}\n\nconst IMAGE_FILE_NAME_RE = /\\.(png|jpe?g|gif|webp|avif|heic|heif|svg|bmp)$/i\nconst DROP_ANIMATION_FALLBACK_MS = 350\n\nconst hideDraggedTileDropSideEffects = defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0\",\n },\n },\n})\n\nconst isImageItem = (item: FileWithState): boolean => {\n if (item.mimeType) return item.mimeType.startsWith(\"image/\")\n return IMAGE_FILE_NAME_RE.test(item.fileName ?? item.alt ?? \"\")\n}\n\nexport function FilesUploadField({\n initialFiles = [],\n onChange,\n upload = defaultUpload,\n uploadIsPublic,\n uploadAccessScope,\n uploadDeduplicationNamespace,\n maxFiles,\n disabled = false,\n onUploadingChange,\n accept,\n renderHeader,\n renderItem,\n addButtonAriaLabel = \"Ajouter un fichier\",\n removeButtonAriaLabel = \"Supprimer le fichier\",\n variant = \"card\",\n}: FilesUploadFieldProps) {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [images, setImages] = useState<FileWithState[]>(() =>\n initialFiles.map((file) => ({\n ...file,\n renderKey: file.id,\n previewUrl: file.url,\n status: \"uploaded\",\n progress: 100,\n }))\n )\n const [dragActive, setDragActive] = useState(false)\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dropAnimatingId, setDropAnimatingId] = useState<string | null>(null)\n const hoverTimeoutRef = useRef<number | null>(null)\n const dropAnimationFallbackRef = useRef<{ id: string; timeout: number } | null>(null)\n const hasDragOverlayRef = useRef(false)\n const clearDropAnimationRef = useRef<(id: string) => void>(() => {})\n const dropAnimationRef = useRef<DropAnimation>({\n sideEffects(args) {\n const id = String(args.active.id)\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n const cleanup = hideDraggedTileDropSideEffects(args)\n\n return () => {\n cleanup?.()\n clearDropAnimationRef.current(id)\n }\n },\n })\n const skipNotifyRef = useRef(true)\n const imagesRef = useRef<FileWithState[]>([])\n const lastInitialImagesRef = useRef<FilesUploadFieldFile[]>(initialFiles)\n const onChangeRef = useRef(onChange)\n const onUploadingChangeRef = useRef(onUploadingChange)\n const replacedIdRef = useRef<Map<string, string>>(new Map())\n const fileRef = useRef<Map<string, File>>(new Map())\n const abortRef = useRef<Map<string, AbortController>>(new Map())\n const objectUrlRef = useRef<Map<string, string>>(new Map())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n )\n\n useEffect(() => {\n return () => {\n for (const controller of abortRef.current.values()) {\n try {\n controller.abort()\n } catch {\n //\n }\n }\n abortRef.current.clear()\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n fileRef.current.clear()\n replacedIdRef.current.clear()\n\n for (const url of objectUrlRef.current.values()) {\n if (typeof URL !== \"undefined\") {\n try {\n URL.revokeObjectURL(url)\n } catch {\n //\n }\n }\n }\n objectUrlRef.current.clear()\n }\n }, [])\n\n clearDropAnimationRef.current = (id: string) => {\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n setDropAnimatingId((current) => (current === id ? null : current))\n }\n\n useEffect(() => {\n if (typeof document === \"undefined\") return\n if (activeId) {\n document.body.style.cursor = \"grabbing\"\n return () => {\n document.body.style.cursor = \"\"\n }\n }\n document.body.style.cursor = \"\"\n }, [activeId])\n\n useEffect(() => {\n imagesRef.current = images\n }, [images])\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n onUploadingChangeRef.current = onUploadingChange\n }, [onUploadingChange])\n\n useEffect(() => {\n const previous = lastInitialImagesRef.current\n const samePropValue =\n previous.length === initialFiles.length &&\n previous.every((img, index) => {\n const next = initialFiles[index]\n return next && img.id === next.id && img.url === next.url && img.alt === next.alt\n })\n\n if (samePropValue) return\n lastInitialImagesRef.current = initialFiles\n\n const renderKeysById = new Map(imagesRef.current.map((img) => [img.id, img.renderKey]))\n const prepared: FileWithState[] = initialFiles.map((img) => ({\n ...img,\n renderKey: renderKeysById.get(img.id) ?? img.id,\n previewUrl: img.url,\n status: \"uploaded\",\n progress: 100,\n }))\n\n const preparedRawIds = new Set(prepared.map((img) => img.id))\n for (const [tempId, finalId] of replacedIdRef.current.entries()) {\n if (preparedRawIds.has(finalId)) {\n replacedIdRef.current.delete(tempId)\n }\n }\n\n const currentIds = new Set(imagesRef.current.map((img) => img.id))\n const hasStaleInitialImages = prepared.some((img) => {\n const mapped = replacedIdRef.current.get(img.id)\n return mapped ? currentIds.has(mapped) : false\n })\n if (hasStaleInitialImages) return\n\n const preparedIds = new Set(prepared.map((img) => img.id))\n for (const img of imagesRef.current) {\n if (preparedIds.has(img.id)) continue\n\n const controller = abortRef.current.get(img.id)\n if (controller) {\n abortRef.current.delete(img.id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(img.id)\n\n const tempUrl = objectUrlRef.current.get(img.id)\n if (tempUrl) {\n objectUrlRef.current.delete(img.id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n }\n\n setImages((current) => {\n const sameLength = current.length === prepared.length\n const sameContent =\n sameLength &&\n current.every((item, index) => {\n const next = prepared[index]\n return next && item.id === next.id && item.url === next.url && item.alt === next.alt && item.uploadKey === next.uploadKey\n })\n\n if (sameContent) return current\n\n skipNotifyRef.current = true\n return prepared\n })\n }, [initialFiles])\n\n useEffect(() => {\n if (skipNotifyRef.current) {\n skipNotifyRef.current = false\n return\n }\n\n onChangeRef.current?.(images.map(({ id, url, alt, uploadKey }) => ({ id, url, alt, uploadKey })))\n }, [images])\n\n useEffect(() => {\n onUploadingChangeRef.current?.(images.some((img) => img.status === \"uploading\"))\n }, [images])\n\n useEffect(() => {\n if (fullscreenIndex === null) {\n return\n }\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setFullscreenIndex(null)\n return\n }\n\n if (event.key === \"ArrowRight\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n return\n }\n\n if (event.key === \"ArrowLeft\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n }\n\n window.addEventListener(\"keydown\", handleKey)\n return () => window.removeEventListener(\"keydown\", handleKey)\n }, [fullscreenIndex, images.length])\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const remaining = normalizedMaxFiles === null\n ? Number.POSITIVE_INFINITY\n : Math.max(0, normalizedMaxFiles - imagesRef.current.length)\n const list = Array.from(files).slice(0, remaining)\n if (!list.length) return\n\n const uploads = list.map((file) => {\n const previewUrl = toPreview(file)\n const tempId = crypto.randomUUID()\n\n objectUrlRef.current.set(tempId, previewUrl)\n fileRef.current.set(tempId, file)\n\n const next: FileWithState = {\n id: tempId,\n url: previewUrl,\n renderKey: tempId,\n previewUrl,\n alt: file.name,\n status: \"uploading\",\n progress: 0,\n fileName: file.name,\n mimeType: file.type,\n }\n\n setImages((current) => [...current, next])\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) =>\n item.id === tempId ? { ...item, progress: nextValue, status: \"uploading\" } : item\n )\n )\n }\n\n const finalize = async () => {\n const controller = new AbortController()\n abortRef.current.set(tempId, controller)\n\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(tempId, result.id)\n\n const tempUrl = objectUrlRef.current.get(tempId)\n if (file.type.startsWith(\"image/\")) {\n await preloadImagePreview(result.url)\n }\n\n abortRef.current.delete(tempId)\n fileRef.current.delete(tempId)\n\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? {\n ...item,\n ...result,\n previewUrl: result.url,\n url: result.url,\n status: \"uploaded\",\n progress: 100,\n errorMessage: undefined,\n }\n : item\n )\n )\n\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n window.requestAnimationFrame(() => URL.revokeObjectURL(tempUrl))\n }\n } catch (error) {\n abortRef.current.delete(tempId)\n if (controller.signal.aborted) {\n fileRef.current.delete(tempId)\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n return\n }\n console.error(\"Upload failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? { ...item, status: \"error\", progress: Math.max(0, Math.min(99, item.progress)), errorMessage }\n : item\n )\n )\n }\n }\n\n return finalize()\n })\n\n await Promise.allSettled(uploads)\n }\n\n const onFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!event.target.files) return\n void handleFiles(event.target.files)\n event.target.value = \"\"\n }\n\n const openFileDialog = () => {\n if (disabled) return\n fileInputRef.current?.click()\n }\n\n const removeImage = (id: string) => {\n const controller = abortRef.current.get(id)\n if (controller) {\n abortRef.current.delete(id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n setImages((current) => current.filter((item) => item.id !== id))\n }\n\n const retryUpload = (id: string) => {\n if (disabled) return\n const file = fileRef.current.get(id)\n if (!file) return\n\n const existingController = abortRef.current.get(id)\n if (existingController) {\n try {\n existingController.abort()\n } catch {\n //\n }\n abortRef.current.delete(id)\n }\n\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, status: \"uploading\", progress: 0, errorMessage: undefined } : item))\n )\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, progress: nextValue, status: \"uploading\" } : item))\n )\n }\n\n const controller = new AbortController()\n abortRef.current.set(id, controller)\n\n void (async () => {\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(id, result.id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (file.type.startsWith(\"image/\")) {\n await preloadImagePreview(result.url)\n }\n\n abortRef.current.delete(id)\n fileRef.current.delete(id)\n\n setImages((current) =>\n current.map((item) =>\n item.id === id\n ? { ...item, ...result, previewUrl: result.url, url: result.url, status: \"uploaded\", progress: 100, errorMessage: undefined }\n : item\n )\n )\n\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n window.requestAnimationFrame(() => URL.revokeObjectURL(tempUrl))\n }\n } catch (error) {\n abortRef.current.delete(id)\n if (controller.signal.aborted) return\n console.error(\"Retry failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) => current.map((item) => (item.id === id ? { ...item, status: \"error\", errorMessage } : item)))\n }\n })()\n }\n\n const startFullscreen = (id: string) => {\n const index = images.findIndex((item) => item.id === id)\n if (index !== -1) {\n setFullscreenIndex(index)\n }\n }\n\n const clearPendingDropAnimation = () => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n setDropAnimatingId(null)\n }\n\n const scheduleDropAnimationFallback = (id: string) => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n }\n\n dropAnimationFallbackRef.current = {\n id,\n timeout: window.setTimeout(() => {\n dropAnimationFallbackRef.current = null\n setDropAnimatingId((current) => (current === id ? null : current))\n }, DROP_ANIMATION_FALLBACK_MS),\n }\n }\n\n const finishDrag = (id: string) => {\n if (hasDragOverlayRef.current) {\n setDropAnimatingId(id)\n scheduleDropAnimationFallback(id)\n }\n setActiveId(null)\n }\n\n const handleDragStart = (event: DragStartEvent) => {\n clearPendingDropAnimation()\n setActiveId(String(event.active.id))\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n const activeId = String(active.id)\n\n if (!over) {\n finishDrag(activeId)\n return\n }\n\n const overId = String(over.id)\n\n if (activeId !== overId) {\n setImages((current) => {\n const oldIndex = current.findIndex((item) => item.id === activeId)\n const newIndex = current.findIndex((item) => item.id === overId)\n if (oldIndex === -1 || newIndex === -1) return current\n return arrayMove(current, oldIndex, newIndex)\n })\n }\n\n finishDrag(activeId)\n }\n\n const handleDragCancel = () => {\n if (activeId) {\n finishDrag(activeId)\n return\n }\n\n setActiveId(null)\n }\n\n const clearHoverTimeout = () => {\n if (hoverTimeoutRef.current !== null) {\n window.clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const fullscreenImage = useMemo(() => {\n if (fullscreenIndex === null) return null\n return images[fullscreenIndex] ?? null\n }, [fullscreenIndex, images])\n\n const containerClasses = cn(\n variant === \"bare\"\n ? \"rounded-lg transition-colors\"\n : \"rounded-xl border border-dashed border-slate-300 bg-white/70 p-4 shadow-sm transition-colors dark:border-slate-700 dark:bg-slate-900/60\",\n dragActive && (variant === \"bare\" ? \"bg-primary/5 ring-2 ring-primary/50\" : \"border-primary ring-2 ring-primary/50\"),\n disabled && \"opacity-70\"\n )\n\n const tileBaseClasses = \"group relative size-20 overflow-visible rounded-lg border border-slate-200 bg-slate-50 shadow-inner transition hover:shadow md:size-24 dark:border-slate-700 dark:bg-slate-800\"\n\n const acceptAttr = useMemo(() => {\n if (!accept) return undefined\n if (Array.isArray(accept)) return accept.join(\",\")\n return accept\n }, [accept])\n\n const enableImagePreview = useMemo(() => {\n if (renderItem) return false\n if (!acceptAttr) return false\n const tokens = acceptAttr.split(\",\").map((value) => value.trim()).filter(Boolean)\n if (!tokens.length) return false\n return tokens.every((token) =>\n token === \"image/*\" ||\n token.startsWith(\"image/\") ||\n token === \".heic\" ||\n token === \".heif\" ||\n token === \".heics\" ||\n token === \".heifs\"\n )\n }, [acceptAttr, renderItem])\n\n const canPreviewItem = (item: FileWithState) => enableImagePreview || (!renderItem && isImageItem(item))\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const canAddFiles = !disabled && (normalizedMaxFiles === null || images.length < normalizedMaxFiles)\n const statusItem = images.find((item) => item.status === \"error\") ??\n images.find((item) => item.status === \"uploading\")\n const uploadStatusMessage = statusItem\n ? statusItem.status === \"error\"\n ? getErrorLabel(statusItem.errorMessage)\n : `${statusItem.fileName ?? statusItem.alt ?? \"File\"}: ${statusItem.progress}%`\n : \"\"\n\n const toRenderItemProps = (item: FileWithState): FilesUploadFieldRenderItemProps => ({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n\n const dragOverlayContent = activeId\n ? (() => {\n const activeItem = images.find((item) => item.id === activeId)\n if (!activeItem) return null\n\n if (renderItem) {\n const rendered = renderItem(toRenderItemProps(activeItem))\n if (rendered === null || rendered === undefined || rendered === false) return null\n return (\n <div className=\"pointer-events-none\">\n <div className=\"h-24 w-24 overflow-hidden rounded-lg shadow-2xl\">{rendered}</div>\n </div>\n )\n }\n\n if (!canPreviewItem(activeItem)) return null\n return (\n <div className=\"pointer-events-none\">\n <Image\n src={activeItem.previewUrl}\n alt={activeItem.alt ?? \"Dragged image\"}\n sizes=\"96px\"\n className=\"h-24 w-24 rounded-lg object-cover shadow-2xl\"\n />\n </div>\n )\n })()\n : null\n\n const hasDragOverlay = dragOverlayContent !== null && dragOverlayContent !== undefined\n const hiddenDraggedTileId = hasDragOverlay ? activeId : dropAnimatingId\n hasDragOverlayRef.current = hasDragOverlay\n\n return (\n <div\n onDragOver={(event) => {\n event.preventDefault()\n if (canAddFiles) {\n setDragActive(true)\n }\n }}\n onDragLeave={() => setDragActive(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragActive(false)\n if (canAddFiles && event.dataTransfer.files?.length) {\n void handleFiles(event.dataTransfer.files)\n }\n }}\n className={containerClasses}\n >\n {renderHeader ? <div className=\"mb-3\">{renderHeader()}</div> : null}\n <div role=\"status\" className=\"sr-only\">{uploadStatusMessage}</div>\n\n <DndContext\n sensors={disabled ? undefined : sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext items={images.map((item) => item.id)} strategy={rectSortingStrategy}>\n <div className=\"flex flex-wrap gap-3\">\n {images.map((item) => {\n const isUploading = item.status === \"uploading\"\n const isError = item.status === \"error\"\n\n return (\n <SortableTile\n key={item.renderKey}\n item={item}\n isHovered={hoveredId === item.id}\n enableImagePreview={canPreviewItem(item)}\n renderItem={renderItem}\n onHoverEnter={() => {\n clearHoverTimeout()\n setHoveredId(item.id)\n }}\n onHoverLeave={() => {\n clearHoverTimeout()\n hoverTimeoutRef.current = window.setTimeout(() => {\n setHoveredId((current) => (current === item.id ? null : current))\n hoverTimeoutRef.current = null\n }, 120)\n }}\n onRemove={removeImage}\n onRetry={retryUpload}\n startFullscreen={startFullscreen}\n isUploading={isUploading}\n isError={isError}\n tileClasses={tileBaseClasses}\n disabled={disabled}\n isDraggingExternal={hiddenDraggedTileId === item.id}\n removeButtonAriaLabel={removeButtonAriaLabel}\n />\n )\n })}\n\n {canAddFiles && (variant === \"bare\" && images.length === 0 ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex w-full flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-slate-300 px-4 py-6 text-slate-500 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 dark:border-slate-700 dark:hover:bg-slate-800/50\"\n aria-label={addButtonAriaLabel}\n >\n <Plus className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{addButtonAriaLabel}</span>\n <span className=\"text-[11px] text-slate-400 dark:text-slate-500\">ou glissez-déposez ici</span>\n </button>\n ) : variant === \"bare\" ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex size-20 items-center justify-center rounded-lg border border-dashed border-slate-300 text-slate-400 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 md:size-24 dark:border-slate-700 dark:hover:bg-slate-800/50 dark:hover:text-slate-300\"\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <Plus className=\"h-4 w-4\" />\n <span className=\"text-[11px] font-medium\">Ajouter</span>\n </div>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className={cn(\n tileBaseClasses,\n \"flex items-center justify-center border-dashed bg-white text-slate-500 hover:border-slate-300 dark:bg-slate-900\"\n )}\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex size-9 items-center justify-center rounded-full border border-slate-300 bg-slate-100 text-slate-600 shadow-inner dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <Plus className=\"h-5 w-5\" />\n </div>\n <span className=\"text-xs font-medium\">Ajouter</span>\n </div>\n </button>\n ))}\n </div>\n </SortableContext>\n {(() => {\n const overlay = <DragOverlay dropAnimation={dropAnimationRef.current}>{dragOverlayContent}</DragOverlay>\n\n if (typeof document === \"undefined\") return overlay\n return createPortal(overlay, document.body)\n })()}\n </DndContext>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptAttr}\n multiple={normalizedMaxFiles !== 1}\n disabled={!canAddFiles}\n className=\"hidden\"\n onChange={onFileInputChange}\n aria-hidden\n />\n\n {fullscreenImage && canPreviewItem(fullscreenImage) && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\">\n <button\n type=\"button\"\n className=\"absolute left-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n aria-label=\"Précédent\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M15 18l-6-6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <div className=\"relative max-h-[80vh] max-w-4xl\">\n <Image\n src={fullscreenImage.url}\n alt={fullscreenImage.alt ?? \"Fullscreen\"}\n sizes=\"(max-width: 1024px) 100vw, 1024px\"\n className=\"max-h-[80vh] max-w-full rounded-lg object-contain shadow-2xl\"\n />\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex size-9 items-center justify-center rounded-full bg-black/70 text-white transition hover:bg-black focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() => setFullscreenIndex(null)}\n aria-label=\"Fermer\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"absolute right-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n }\n aria-label=\"Suivant\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M9 6l6 6-6 6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|