@thetechfossil/upfiles 1.0.9 → 1.0.12
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/README.md +10 -2
- package/dist/index.d.mts +54 -7
- package/dist/index.d.ts +54 -7
- package/dist/index.js +1100 -411
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1051 -347
- package/dist/index.mjs.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/Uploader.tsx","../src/ProjectFilesWidget.tsx","../src/projectConnect.ts","../src/ConnectProjectDialog.tsx","../src/files.ts","../src/ImageManager.tsx"],"names":["data","useRef","useMemo","useState","useCallback","f","result","React","jsxs","jsx","useEffect","React3","Dialog","React4","files","Dialog2","Fragment","open"],"mappings":"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","file":"index.js","sourcesContent":["export type PresignResponse = {\n presignedUrl: string;\n fileKey: string;\n publicUrl: string;\n apiKeyId?: string;\n projectId?: string;\n};\n\nexport type UploadedFileResult = {\n publicUrl: string;\n fileKey: string;\n fileName: string;\n fileType: string;\n fileSize: number;\n projectId?: string;\n apiKeyId?: string;\n thumbnails?: Thumbnail[];\n};\n\nexport type Thumbnail = {\n id: string;\n key: string;\n url: string;\n size: number;\n sizeType?: string;\n createdAt?: string;\n};\n\nexport type Folder = {\n id: string;\n name: string;\n parentId: string | null;\n projectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type FileListItem = {\n key: string;\n originalName: string;\n size: number;\n contentType: string;\n uploadedAt: string;\n url: string;\n};\n\n/**\n * Upfiles Client - JavaScript client for Upfiles Plugin API\n * \n * 📚 Full documentation: https://ktw-upfiles-docs.netlify.app/\n * \n * @example\n * ```ts\n * const client = new UpfilesClient({\n * baseUrl: 'https://your-upfiles.example.com',\n * apiKey: 'upk_...',\n * });\n * ```\n */\n\nexport type UpfilesClientOptions = {\n baseUrl?: string; // e.g., https://your-upfiles.example.com. If omitted, uses same-origin.\n presignPath?: string; // default /api/plugin/upload (relative)\n presignUrl?: string; // full absolute URL override, e.g., https://api.example.com/api/upload\n headers?: Record<string, string>; // e.g., { Authorization: `Bearer ${token}` }\n withCredentials?: boolean; // send cookies for session auth\n apiKey?: string; // upk_... value; when provided, sent using apiKeyHeader\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key'; // default 'authorization'\n thumbnailsPath?: string; // default /api/plugin/thumbnails (relative)\n completionPath?: string; // default /api/plugin/files (relative)\n foldersPath?: string; // default /api/plugin/folders (relative)\n callCompletionEndpoint?: boolean; // default false for backward compatibility\n};\n\n/**\n * UpfilesClient - Main client class for interacting with Upfiles Plugin API\n * \n * 📚 Documentation: https://ktw-upfiles-docs.netlify.app/\n * \n * @example\n * ```ts\n * const client = new UpfilesClient({\n * baseUrl: 'https://your-upfiles.example.com',\n * apiKey: 'upk_...',\n * });\n * \n * const result = await client.upload(file, { folderPath: 'uploads/' });\n * ```\n */\nexport class UpfilesClient {\n private baseUrl?: string;\n private presignPath: string;\n private presignUrl?: string;\n private headers?: Record<string, string>;\n private withCredentials?: boolean;\n private apiKey?: string;\n private apiKeyHeader: 'authorization' | 'x-api-key' | 'x-up-api-key';\n private thumbnailsPath: string;\n private completionPath: string;\n private foldersPath: string;\n private callCompletionEndpoint: boolean;\n\n constructor(opts: UpfilesClientOptions) {\n this.baseUrl = opts.baseUrl?.replace(/\\/$/, '');\n this.presignPath = opts.presignPath ?? '/api/plugin/upload';\n this.presignUrl = opts.presignUrl;\n this.headers = opts.headers;\n this.withCredentials = opts.withCredentials;\n this.apiKey = opts.apiKey;\n this.apiKeyHeader = opts.apiKeyHeader ?? 'authorization';\n this.thumbnailsPath = opts.thumbnailsPath ?? '/api/plugin/thumbnails';\n this.completionPath = opts.completionPath ?? '/api/plugin/files';\n this.foldersPath = opts.foldersPath ?? '/api/plugin/folders';\n this.callCompletionEndpoint = opts.callCompletionEndpoint ?? false;\n }\n\n async getPresignedUrl(params: {\n fileName: string;\n fileType: string;\n fileSize: number;\n projectId?: string;\n folderPath?: string;\n }): Promise<PresignResponse> {\n // Validate per Plugin API requirements\n if (!params.fileName) throw new Error('fileName is required');\n if (!params.fileType) throw new Error('fileType is required');\n if (!params.fileSize || params.fileSize <= 0) throw new Error('fileSize must be > 0');\n\n // Determine target URL: explicit presignUrl > baseUrl+presignPath > relative presignPath\n const target = this.presignUrl\n ? this.presignUrl\n : this.baseUrl\n ? `${this.baseUrl}${this.presignPath}`\n : this.presignPath; // relative to current origin\n\n // Compose headers, including API key if provided\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(this.headers || {}),\n };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n // Accept raw upk_... and add Bearer automatically\n headers['authorization'] = this.apiKey.startsWith('upk_')\n ? `Bearer ${this.apiKey}`\n : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify(params),\n });\n if (!res.ok) {\n let msg = 'Failed to get upload URL';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async uploadToS3(presignedUrl: string, file: File): Promise<Response> {\n return fetch(presignedUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n }\n\n // Convenience: perform full flow and return URL/path metadata for DB\n async upload(\n file: File,\n extras?: { projectId?: string; folderPath?: string; fetchThumbnails?: boolean; callCompletionEndpoint?: boolean }\n ): Promise<UploadedFileResult> {\n const presign = await this.getPresignedUrl({\n fileName: file.name,\n fileType: file.type || 'application/octet-stream',\n fileSize: file.size,\n projectId: extras?.projectId,\n folderPath: extras?.folderPath,\n });\n const res = await this.uploadToS3(presign.presignedUrl, file);\n if (!res.ok) {\n throw new Error(`Upload failed with status ${res.status}`);\n }\n\n // Call completion endpoint if enabled (either globally or per-upload)\n const shouldCallCompletion = extras?.callCompletionEndpoint ?? this.callCompletionEndpoint;\n if (shouldCallCompletion) {\n try {\n await this.completeUpload({\n fileKey: presign.fileKey,\n originalName: file.name,\n size: file.size,\n contentType: file.type || 'application/octet-stream',\n projectId: extras?.projectId,\n });\n } catch (error: any) {\n throw new Error(`Upload verification failed: ${error.message}`);\n }\n }\n\n let thumbnails: Thumbnail[] | undefined;\n if (extras?.fetchThumbnails) {\n try {\n const t = await this.getThumbnails(presign.fileKey);\n thumbnails = t;\n } catch { }\n }\n return {\n publicUrl: presign.publicUrl,\n fileKey: presign.fileKey,\n fileName: file.name,\n fileType: file.type,\n fileSize: file.size,\n projectId: presign.projectId,\n apiKeyId: presign.apiKeyId,\n thumbnails,\n };\n }\n\n async completeUpload(params: {\n fileKey: string;\n originalName: string;\n size: number;\n contentType: string;\n projectId?: string;\n }): Promise<{\n success: boolean;\n file: {\n id: string;\n key: string;\n originalName: string;\n size: number;\n contentType: string;\n url: string;\n uploadedAt: string;\n };\n thumbnails?: Thumbnail[];\n masterWebp?: { key: string; url: string };\n }> {\n const target = this.baseUrl ? `${this.baseUrl}${this.completionPath}` : this.completionPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(this.headers || {}),\n };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify(params),\n });\n if (!res.ok) {\n let msg = 'Failed to complete upload';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async getThumbnails(fileKey: string): Promise<Thumbnail[]> {\n const target = this.baseUrl ? `${this.baseUrl}${this.thumbnailsPath}` : this.thumbnailsPath;\n const url = `${target}?fileKey=${encodeURIComponent(fileKey)}`;\n const headers: Record<string, string> = { ...(this.headers || {}) };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch thumbnails';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data?.thumbnails ?? [];\n }\n\n async generateThumbnails(fileKey: string): Promise<{ masterWebp?: { key: string; url: string }; thumbnails: Thumbnail[] }> {\n const target = this.baseUrl ? `${this.baseUrl}${this.thumbnailsPath}` : this.thumbnailsPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(this.headers || {}),\n };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({ fileKey }),\n });\n if (!res.ok) {\n let msg = 'Failed to generate thumbnails';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return { masterWebp: data.masterWebp, thumbnails: data.thumbnails ?? [] };\n }\n\n async getFolders(parentId?: string): Promise<Folder[]> {\n const target = this.baseUrl ? `${this.baseUrl}${this.foldersPath}` : this.foldersPath;\n const url = parentId ? `${target}?parentId=${encodeURIComponent(parentId)}` : target;\n const headers: Record<string, string> = { ...(this.headers || {}) };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch folders';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data?.folders ?? [];\n }\n\n async createFolder(name: string, parentId?: string): Promise<Folder> {\n const target = this.baseUrl ? `${this.baseUrl}${this.foldersPath}` : this.foldersPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(this.headers || {}),\n };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({ name, parentId }),\n });\n if (!res.ok) {\n let msg = 'Failed to create folder';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data.folder;\n }\n\n async getProjectFiles(params?: { folderPath?: string }): Promise<{ files: FileListItem[]; updatedAt: string | null }> {\n // Derive plugin files path based on thumbnailsPath sibling\n const basePath = this.thumbnailsPath.replace(/\\/thumbnails$/, '');\n const filesPath = `${basePath}/files`;\n const target = this.baseUrl ? `${this.baseUrl}${filesPath}` : filesPath;\n const url = params?.folderPath ? `${target}?folderPath=${encodeURIComponent(params.folderPath)}` : target;\n const headers: Record<string, string> = { ...(this.headers || {}) };\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upk_') ? `Bearer ${this.apiKey}` : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch files';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return {\n files: data?.files ?? [],\n updatedAt: res.headers.get('X-Files-Updated-At'),\n };\n }\n\n getEventsUrl(projectId?: string): string {\n const basePath = this.thumbnailsPath.replace(/\\/thumbnails$/, '');\n const eventsPath = `${basePath}/events`;\n const target = this.baseUrl ? `${this.baseUrl}/api/events` : '/api/events';\n\n // Construct URL with auth and projectId\n const url = new URL(target, window.location.href);\n if (this.apiKey) {\n url.searchParams.set('apiKey', this.apiKey);\n }\n if (projectId) {\n url.searchParams.set('projectId', projectId);\n }\n return url.toString();\n }\n}\n","'use client';\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { UpfilesClient, UpfilesClientOptions, PresignResponse } from './client.js';\n\nexport type UploaderFile = {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n progress: number; // 0-100\n status: 'pending' | 'uploading' | 'success' | 'error';\n error?: string;\n publicUrl?: string;\n fileKey?: string;\n projectId?: string;\n apiKeyId?: string;\n};\n\nexport type UploaderProps = {\n clientOptions?: UpfilesClientOptions;\n multiple?: boolean;\n accept?: string[]; // e.g., ['image/*','application/pdf']\n maxFileSize?: number; // bytes\n maxFiles?: number;\n projectId?: string;\n folderPath?: string;\n onComplete?: (files: UploaderFile[]) => void;\n onError?: (error: Error) => void;\n onUploadBegin?: (fileName: string) => void;\n onUploadProgress?: (fileName: string, progress: number) => void;\n onClientUploadComplete?: (file: UploaderFile) => void;\n className?: string;\n buttonClassName?: string;\n dropzoneClassName?: string;\n children?: React.ReactNode; // custom inner content for dropzone\n fetchThumbnails?: boolean; // fetch thumbnails after upload via plugin API\n autoRecordToDb?: boolean; // automatically record file to DB after upload (requires projectId)\n recordUrl?: string; // custom endpoint to record file metadata (default: /api/files)\n autoUpload?: boolean; // automatically start upload when files are added (default: false)\n};\n\nexport const Uploader: React.FC<UploaderProps> = ({\n clientOptions,\n multiple = true,\n accept = ['image/*', 'video/*', 'audio/*', 'application/pdf', 'text/plain', 'application/json'],\n maxFileSize = 100 * 1024 * 1024,\n maxFiles = 10,\n onComplete,\n onError,\n onUploadBegin,\n onUploadProgress,\n onClientUploadComplete,\n className,\n buttonClassName,\n dropzoneClassName,\n children,\n projectId,\n folderPath,\n fetchThumbnails,\n autoRecordToDb = true,\n recordUrl = '/api/files',\n autoUpload = false,\n}) => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const client = useMemo(() => new UpfilesClient(clientOptions ?? {}), [clientOptions]);\n\n const [files, setFiles] = useState<UploaderFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n\n const addFiles = useCallback((incoming: File[]) => {\n const filtered = incoming.filter((f) => {\n if (f.size > maxFileSize) {\n return false;\n }\n return true;\n });\n const limited = filtered.slice(0, Math.max(0, maxFiles - files.length));\n const mapped: UploaderFile[] = limited.map((f) => ({\n id: Math.random().toString(36).slice(2),\n file: f,\n name: f.name,\n size: f.size,\n type: f.type,\n progress: 0,\n status: 'pending',\n }));\n setFiles((prev) => [...prev, ...mapped]);\n }, [files.length, maxFileSize, maxFiles]);\n\n const onInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const fs = Array.from(e.target.files || []);\n addFiles(fs);\n if (inputRef.current) inputRef.current.value = '';\n }, [addFiles]);\n\n const handleDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n addFiles(Array.from(e.dataTransfer.files || []));\n }, [addFiles]);\n\n const uploadOne = useCallback(async (item: UploaderFile): Promise<UploaderFile> => {\n const update = (patch: Partial<UploaderFile>) => {\n setFiles((prev) => prev.map((f) => (f.id === item.id ? { ...f, ...patch } : f)));\n };\n try {\n onUploadBegin?.(item.name);\n update({ status: 'uploading', progress: 1 });\n const presign: PresignResponse = await client.getPresignedUrl({\n fileName: item.name,\n fileType: item.type,\n fileSize: item.size,\n projectId,\n folderPath,\n });\n\n // Use XMLHttpRequest to track upload progress\n await new Promise<void>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', presign.presignedUrl, true);\n xhr.upload.onprogress = (ev) => {\n if (ev.lengthComputable) {\n const pct = Math.min(99, Math.floor((ev.loaded / ev.total) * 100));\n update({ progress: pct });\n onUploadProgress?.(item.name, pct);\n }\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${xhr.status}`));\n }\n };\n xhr.onerror = () => reject(new Error('Network error during upload'));\n xhr.setRequestHeader('Content-Type', item.type || 'application/octet-stream');\n xhr.send(item.file);\n });\n\n // Auto-record to database if enabled - use completion endpoint\n // This MUST happen before generateThumbnails, because the thumbnails endpoint\n // checks if the file exists in the database first\n let completionResult: any = null;\n if (autoRecordToDb && projectId) {\n try {\n completionResult = await client.completeUpload({\n fileKey: presign.fileKey,\n originalName: item.name,\n size: item.size,\n contentType: item.type,\n projectId,\n });\n } catch (e: any) {\n console.error('Failed to complete upload:', e);\n throw new Error(`Upload verification failed: ${e.message}`);\n }\n }\n\n let thumbs;\n let masterWebp;\n\n // Use thumbnails from completion response if available (already generated)\n if (completionResult?.thumbnails?.length > 0) {\n thumbs = completionResult.thumbnails;\n masterWebp = completionResult.masterWebp;\n } else if (fetchThumbnails) {\n // Optionally generate thumbnails via plugin API (after recording to DB)\n // Use the new file key from completion response if available (may have changed to .webp)\n const fileKeyToUse = completionResult?.file?.key || presign.fileKey;\n try {\n const result = await client.generateThumbnails(fileKeyToUse);\n thumbs = result.thumbnails;\n masterWebp = result.masterWebp;\n } catch (e) {\n console.warn('Failed to generate thumbnails:', e);\n }\n }\n\n // Use the final file key and URL from completion response if available\n const finalFileKey = completionResult?.file?.key || presign.fileKey;\n const finalPublicUrl = completionResult?.file?.url || presign.publicUrl;\n\n const result = {\n ...item,\n status: 'success' as const,\n progress: 100,\n fileKey: presign.fileKey,\n publicUrl: presign.publicUrl,\n projectId: presign.projectId,\n apiKeyId: presign.apiKeyId,\n // @ts-ignore - allow downstream to access thumbs if present\n thumbnails: thumbs,\n // @ts-ignore - allow downstream to access masterWebp if present\n masterWebp: masterWebp,\n };\n\n update({ status: 'success', progress: 100, fileKey: presign.fileKey, publicUrl: presign.publicUrl });\n onClientUploadComplete?.(result);\n return result;\n } catch (err: any) {\n const message = err instanceof Error ? err.message : 'Upload failed';\n update({ status: 'error', error: message });\n throw err;\n }\n }, [client, projectId, folderPath, fetchThumbnails, autoRecordToDb, recordUrl, clientOptions, onUploadBegin, onUploadProgress, onClientUploadComplete]);\n\n const uploadAll = useCallback(async () => {\n const targets = files.filter((f) => f.status === 'pending');\n if (!targets.length) return;\n setIsUploading(true);\n try {\n const results: UploaderFile[] = [];\n for (const f of targets) {\n try {\n const done = await uploadOne(f);\n results.push(done);\n } catch (e) {\n // continue uploading others\n }\n }\n onComplete?.(results.filter((f) => f.status === 'success'));\n } catch (e) {\n onError?.(e as Error);\n } finally {\n setIsUploading(false);\n }\n }, [files, onComplete, onError, uploadOne]);\n\n // Auto-upload when autoUpload is enabled and pending files are detected\n React.useEffect(() => {\n if (autoUpload && files.some((f) => f.status === 'pending') && !isUploading) {\n // Small delay to allow UI to update before starting upload\n const timer = setTimeout(() => {\n uploadAll();\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [autoUpload, files, isUploading, uploadAll]);\n\n return (\n <div className={className}>\n <input\n ref={inputRef}\n type=\"file\"\n style={{ display: 'none' }}\n multiple={multiple}\n accept={accept.join(',')}\n onChange={onInputChange}\n />\n\n <div\n className={`${dropzoneClassName} border-2 border-dashed rounded-xl transition-all duration-200 cursor-pointer p-10 flex flex-col items-center justify-center gap-4 ${isDragOver\n ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-200 dark:border-gray-800 hover:border-gray-300 dark:hover:border-gray-700 bg-gray-50/50 dark:bg-gray-900/50'\n }`}\n onDragOver={(e) => { e.preventDefault(); e.stopPropagation(); setIsDragOver(true); }}\n onDragLeave={(e) => { e.preventDefault(); e.stopPropagation(); setIsDragOver(false); }}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n role=\"button\"\n aria-label=\"Upload files\"\n >\n <div className=\"w-16 h-16 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 dark:text-blue-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n {children ?? (\n <div className=\"text-center\">\n <div className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">Drop files here or click to browse</div>\n <div className=\"text-sm text-gray-500 dark:text-gray-400 mt-1\">\n {multiple ? `Up to ${maxFiles} files` : 'Single file'} • Max {(maxFileSize / (1024 * 1024)).toFixed(0)}MB\n </div>\n </div>\n )}\n </div>\n\n {files.length > 0 && (\n <div className=\"mt-8 space-y-4\">\n <div className=\"flex items-center justify-between border-b border-gray-100 dark:border-gray-800 pb-4\">\n <h4 className=\"font-semibold text-gray-900 dark:text-gray-100\">Selected Files</h4>\n <div className=\"flex gap-3\">\n <button\n className=\"px-4 py-2 bg-blue-600 text-white text-sm font-semibold rounded-lg hover:bg-blue-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm\"\n disabled={isUploading || files.every((f) => f.status !== 'pending')}\n onClick={uploadAll}\n >\n {isUploading ? (\n <span className=\"flex items-center gap-2\">\n <svg className=\"animate-spin h-4 w-4 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n Uploading...\n </span>\n ) : 'Upload All'}\n </button>\n <button\n className=\"px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 text-sm font-semibold rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-50 transition-colors\"\n disabled={isUploading}\n onClick={() => setFiles([])}\n >\n Clear\n </button>\n </div>\n </div>\n <div className=\"grid gap-3\">\n {files.map((f) => (\n <div key={f.id} className=\"group relative bg-white dark:bg-gray-900 border border-gray-100 dark:border-gray-800 rounded-xl p-4 transition-all hover:shadow-md\">\n <div className=\"flex items-center gap-4\">\n <div className=\"w-10 h-10 rounded-lg bg-gray-50 dark:bg-gray-800 flex items-center justify-center flex-shrink-0\">\n {f.type.startsWith('image/') ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-indigo-500\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-blue-500\">\n <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"text-sm font-medium text-gray-900 dark:text-gray-100 truncate pr-4\">{f.name}</div>\n <div className=\"text-xs text-gray-500 font-medium whitespace-nowrap\">{(f.size / (1024 * 1024)).toFixed(2)} MB</div>\n </div>\n {f.status === 'error' ? (\n <div className=\"text-xs text-red-500 font-medium mt-1\">{f.error}</div>\n ) : (\n <div className=\"h-1.5 w-full bg-gray-100 dark:bg-gray-800 rounded-full overflow-hidden mt-2\">\n <div\n className={`h-full transition-all duration-300 ${f.status === 'success' ? 'bg-green-500' : 'bg-blue-500'}`}\n style={{ width: `${f.progress}%` }}\n />\n </div>\n )}\n </div>\n <div className=\"flex-shrink-0 ml-4\">\n {f.status === 'success' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n {f.publicUrl && (\n <a\n href={f.publicUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"p-1.5 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-md transition-colors\"\n title=\"View online\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n )}\n </div>\n )}\n {f.status === 'error' && (\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </span>\n )}\n {f.status === 'uploading' && (\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{f.progress}%</span>\n )}\n {f.status === 'pending' && (\n <button\n onClick={(e) => { e.stopPropagation(); setFiles(prev => prev.filter(file => file.id !== f.id)); }}\n className=\"p-1.5 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md transition-colors\"\n title=\"Remove\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default Uploader;\n\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { UpfilesClient, UpfilesClientOptions, FileListItem } from './client.js';\n\nexport type ProjectFilesWidgetProps = {\n clientOptions: UpfilesClientOptions; // baseUrl + apiKey (or cookies via withCredentials)\n folderPath?: string;\n className?: string;\n listClassName?: string;\n itemClassName?: string;\n onSelect: (file: { name: string; key: string; url: string; size: number; contentType: string }) => void;\n // Optional: automatically save the selected file to your backend\n saveUrl?: string; // if provided, will POST the selected file JSON to this URL\n onSave?: (file: { name: string; key: string; url: string; size: number; contentType: string }) => Promise<void> | void;\n onSaved?: (result?: any) => void; // called after successful save\n onDelete?: (key: string) => Promise<void>;\n deleteUrl?: string; // default: /api/files\n showDelete?: boolean; // show delete button (default: false)\n refreshInterval?: number; // poll for updates (ms), default: 5000 (0 to disable)\n};\n\nexport const ProjectFilesWidget: React.FC<ProjectFilesWidgetProps> = ({\n clientOptions,\n folderPath,\n className,\n listClassName,\n itemClassName,\n onSelect,\n saveUrl,\n onSave,\n onSaved,\n onDelete,\n deleteUrl = '/api/files',\n showDelete = false,\n refreshInterval = 5000,\n}) => {\n const client = useMemo(() => new UpfilesClient(clientOptions ?? {}), [clientOptions]);\n const [files, setFiles] = useState<FileListItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [query, setQuery] = useState('');\n const [savingKey, setSavingKey] = useState<string | null>(null);\n const [deletingKey, setDeletingKey] = useState<string | null>(null);\n\n const lastUpdatedRef = React.useRef<string | null>(null);\n const isFetchingRef = React.useRef(false);\n\n const fetchFiles = React.useCallback(async (isPolling = false) => {\n if (isFetchingRef.current) return;\n isFetchingRef.current = true;\n\n if (!isPolling) setLoading(true);\n setError(null);\n try {\n const { files: newFiles, updatedAt } = await client.getProjectFiles({ folderPath });\n\n // Efficiency check: if polling and data hasn't changed, skip update\n if (isPolling && updatedAt && updatedAt === lastUpdatedRef.current) {\n return;\n }\n\n setFiles(newFiles);\n lastUpdatedRef.current = updatedAt;\n } catch (e: any) {\n if (!isPolling) setError(e?.message || 'Failed to load files');\n } finally {\n if (!isPolling) setLoading(false);\n isFetchingRef.current = false;\n }\n }, [client, folderPath]);\n\n useEffect(() => {\n fetchFiles();\n }, [fetchFiles]);\n\n // Polling effect\n useEffect(() => {\n if (!refreshInterval || refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n fetchFiles(true);\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchFiles, refreshInterval]);\n\n const visible = files.filter((f) =>\n !query ? true : (f.originalName || '').toLowerCase().includes(query.toLowerCase())\n );\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this file?')) return;\n try {\n setDeletingKey(key);\n if (onDelete) {\n await onDelete(key);\n } else {\n const baseUrl = clientOptions?.baseUrl || '';\n const url = baseUrl ? `${baseUrl}${deleteUrl}` : deleteUrl;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(clientOptions?.headers || {}),\n };\n if (clientOptions?.apiKey) {\n const keyHeader = clientOptions.apiKeyHeader || 'authorization';\n if (keyHeader === 'authorization') {\n headers['authorization'] = clientOptions.apiKey.startsWith('upk_')\n ? `Bearer ${clientOptions.apiKey}`\n : clientOptions.apiKey;\n } else {\n headers[keyHeader] = clientOptions.apiKey;\n }\n }\n const res = await fetch(url, {\n method: 'DELETE',\n headers,\n credentials: clientOptions?.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({ fileKey: key }),\n });\n if (!res.ok) throw new Error('Delete failed');\n }\n setFiles((prev) => prev.filter((f) => f.key !== key));\n } catch (e: any) {\n alert(e?.message || 'Failed to delete');\n } finally {\n setDeletingKey(null);\n }\n };\n\n return (\n <div className={className}>\n <div style={{ display: 'flex', gap: 8, alignItems: 'center', marginBottom: 8 }}>\n <input\n type=\"text\"\n placeholder=\"Search by filename...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n style={{ flex: 1, padding: 8, border: '1px solid #e5e7eb', borderRadius: 6 }}\n />\n <button\n onClick={() => {\n setQuery('');\n fetchFiles();\n }}\n style={{ padding: '8px 12px', border: '1px solid #e5e7eb', borderRadius: 6, background: '#fff' }}\n >\n Refresh\n </button>\n </div>\n\n {loading && <div style={{ fontSize: 12, color: '#666' }}>Loading files…</div>}\n {error && <div style={{ fontSize: 12, color: '#b91c1c' }}>{error}</div>}\n\n {!loading && !error && (\n <ul className={listClassName} style={{ listStyle: 'none', padding: 0, margin: 0, display: 'grid', gap: 8 }}>\n {visible.map((f) => (\n <li\n key={f.key}\n className={itemClassName}\n style={{ border: '1px solid #e5e7eb', borderRadius: 8, padding: 10, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis' }}>{f.originalName}</div>\n <div style={{ fontSize: 12, color: '#666' }}>{(f.size / (1024 * 1024)).toFixed(2)} MB • {f.contentType}</div>\n </div>\n <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\n <a href={f.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 12, color: '#2563eb' }}>\n View\n </a>\n <button\n onClick={async () => {\n const selected = { name: f.originalName, key: f.key, url: f.url, size: f.size, contentType: f.contentType };\n onSelect(selected);\n if (typeof onSave === 'function' || !!saveUrl) {\n try {\n setSavingKey(f.key);\n if (typeof onSave === 'function') {\n await onSave(selected);\n onSaved?.();\n }\n if (saveUrl) {\n const res = await fetch(saveUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(selected),\n credentials: 'same-origin',\n });\n const data = await res.json().catch(() => undefined);\n if (!res.ok) throw new Error((data as any)?.error || 'Failed to save');\n onSaved?.(data);\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Save selection failed', e);\n alert((e as any)?.message || 'Failed to save');\n } finally {\n setSavingKey(null);\n }\n }\n }}\n disabled={savingKey === f.key}\n style={{ padding: '6px 10px', background: '#2563eb', color: '#fff', border: '1px solid #1d4ed8', borderRadius: 6, opacity: savingKey === f.key ? 0.7 : 1 }}\n >\n {savingKey === f.key ? 'Saving…' : 'Use'}\n </button>\n {showDelete && (\n <button\n onClick={() => handleDelete(f.key)}\n disabled={deletingKey === f.key}\n style={{ padding: '6px 10px', background: '#dc2626', color: '#fff', border: '1px solid #b91c1c', borderRadius: 6, opacity: deletingKey === f.key ? 0.7 : 1 }}\n >\n {deletingKey === f.key ? 'Deleting…' : 'Delete'}\n </button>\n )}\n </div>\n </li>\n ))}\n {visible.length === 0 && (\n <li style={{ fontSize: 12, color: '#666' }}>No files found</li>\n )}\n </ul>\n )}\n </div>\n );\n};\n\nexport default ProjectFilesWidget;\n","import { UpfilesClient } from './client.js';\r\n\r\nexport type ConnectOptions = {\r\n baseUrl: string; // Main app origin, e.g., https://upfiles.example.com\r\n fetch?: typeof fetch; // override for testing\r\n};\r\n\r\nexport type Project = {\r\n id: string;\r\n name: string;\r\n createdAt?: string;\r\n};\r\n\r\nconst f = (globalThis.fetch || fetch).bind(globalThis);\r\n\r\nasync function httpJson(input: RequestInfo | URL, init?: RequestInit, useFetch?: typeof fetch) {\r\n const doFetch = useFetch ?? f;\r\n const res = await doFetch(input, init);\r\n if (!res.ok) {\r\n let msg = `Request failed (${res.status})`;\r\n try {\r\n const j = await res.json();\r\n msg = j?.error || msg;\r\n } catch {}\r\n throw new Error(msg);\r\n }\r\n return res.json();\r\n}\r\n\r\n// Fetch existing projects for the authenticated user (on main app domain)\r\nexport async function listProjects(opts: ConnectOptions): Promise<Project[]> {\r\n const url = `${opts.baseUrl.replace(/\\/$/, '')}/api/projects`;\r\n const data = await httpJson(\r\n url,\r\n { method: 'GET', credentials: 'include' },\r\n opts.fetch\r\n );\r\n return (data?.projects ?? []) as Project[];\r\n}\r\n\r\n// Create a project and immediately create an API key; return plaintext API key\r\nexport async function createProject(opts: ConnectOptions & { name: string; keyName?: string }) {\r\n const base = opts.baseUrl.replace(/\\/$/, '');\r\n // 1) Create project\r\n const created = await httpJson(\r\n `${base}/api/projects`,\r\n {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ name: opts.name }),\r\n },\r\n opts.fetch\r\n );\r\n const projectId = created?.project?.id as string | undefined;\r\n if (!projectId) throw new Error('Failed to create project');\r\n\r\n // 2) Create an API key for it\r\n const keyLabel = opts.keyName || `Plugin key ${new Date().toISOString().slice(0, 10)}`;\r\n const key = await httpJson(\r\n `${base}/api/projects/${projectId}/keys`,\r\n {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ name: keyLabel }),\r\n },\r\n opts.fetch\r\n );\r\n const plaintext = key?.key?.plaintext as string | undefined;\r\n if (!plaintext) throw new Error('Failed to create API key');\r\n return { apiKey: plaintext, projectId };\r\n}\r\n\r\n// For an existing project, create a new API key; return plaintext API key\r\nexport async function connectProject(opts: ConnectOptions & { projectId: string; keyName?: string }) {\r\n const base = opts.baseUrl.replace(/\\/$/, '');\r\n const keyLabel = opts.keyName || `Plugin key ${new Date().toISOString().slice(0, 10)}`;\r\n const key = await httpJson(\r\n `${base}/api/projects/${opts.projectId}/keys`,\r\n {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ name: keyLabel }),\r\n },\r\n opts.fetch\r\n );\r\n const plaintext = key?.key?.plaintext as string | undefined;\r\n if (!plaintext) throw new Error('Failed to create API key');\r\n return { apiKey: plaintext };\r\n}\r\n\r\n// Accept a manually entered key (basic validation)\r\nexport function addApiKeyManually(apiKey: string) {\r\n const k = (apiKey || '').trim();\r\n if (!k) throw new Error('API key is required');\r\n if (!/^upk_[A-Za-z0-9]+/.test(k)) {\r\n // Allow flexibility but nudge format\r\n console.warn('Provided API key does not match expected format upk_*');\r\n }\r\n return { apiKey: k };\r\n}\r\n\r\n// Optional helper to build a client with the key\r\nexport function createClientWithKey(baseUrl: string, apiKey: string) {\r\n return new UpfilesClient({ baseUrl, apiKey, apiKeyHeader: 'authorization' });\r\n}\r\n\r\n// Create a connection using a provided API key (e.g., from env)\r\n// Example usage in a Next.js app:\r\n// const conn = connectUsingApiKey({\r\n// baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n// apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n// });\r\n// conn.client.upload(...)\r\nexport function connectUsingApiKey(opts: {\r\n baseUrl: string;\r\n apiKey: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n}) {\r\n const baseUrl = opts.baseUrl.replace(/\\/$/, '');\r\n const apiKey = (opts.apiKey || '').trim();\r\n if (!apiKey) throw new Error('apiKey is required');\r\n const client = new UpfilesClient({ baseUrl, apiKey, apiKeyHeader: opts.apiKeyHeader ?? 'authorization' });\r\n return { apiKey, client };\r\n}\r\n","import * as React from 'react';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { listProjects, createProject, connectProject, addApiKeyManually, type Project, type ConnectOptions } from './projectConnect.js';\n\nexport type ConnectProjectDialogProps = {\n baseUrl: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConnected: (apiKey: string, meta: { projectId?: string; source: 'existing' | 'new' | 'manual' }) => void;\n fetchImpl?: typeof fetch;\n title?: string;\n description?: string;\n className?: string; // wrapper for content\n};\n\nexport function ConnectProjectDialog(props: ConnectProjectDialogProps) {\n const { baseUrl, open, onOpenChange, onConnected, fetchImpl, title, description, className } = props;\n\n type Mode = 'existing' | 'manual' | 'new';\n const [mode, setMode] = React.useState<Mode>('existing');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const [projects, setProjects] = React.useState<Project[]>([]);\n const [selectedProjectId, setSelectedProjectId] = React.useState<string>('');\n\n const [manualKey, setManualKey] = React.useState('');\n\n const [newProjectName, setNewProjectName] = React.useState('');\n\n const resetState = React.useCallback(() => {\n setMode('existing');\n setLoading(false);\n setError(null);\n setProjects([]);\n setSelectedProjectId('');\n setManualKey('');\n setNewProjectName('');\n }, []);\n\n // Load projects when switching to existing mode and dialog is open\n React.useEffect(() => {\n const run = async () => {\n if (!open || mode !== 'existing') return;\n try {\n setLoading(true);\n setError(null);\n const opts: ConnectOptions = { baseUrl, fetch: fetchImpl };\n const list = await listProjects(opts);\n setProjects(list);\n if (list.length && !selectedProjectId) setSelectedProjectId(list[0].id);\n } catch (e: any) {\n setError(e?.message || 'Failed to fetch projects');\n } finally {\n setLoading(false);\n }\n };\n run();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, mode, baseUrl]);\n\n const handleConnectExisting = async () => {\n try {\n setLoading(true);\n setError(null);\n if (!selectedProjectId) throw new Error('Please select a project');\n const { apiKey } = await connectProject({ baseUrl, projectId: selectedProjectId, fetch: fetchImpl });\n onConnected(apiKey, { projectId: selectedProjectId, source: 'existing' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Failed to connect project');\n } finally {\n setLoading(false);\n }\n };\n\n const handleManual = async () => {\n try {\n setLoading(true);\n setError(null);\n const { apiKey } = addApiKeyManually(manualKey);\n onConnected(apiKey, { source: 'manual' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Invalid API key');\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreate = async () => {\n try {\n setLoading(true);\n setError(null);\n if (!newProjectName.trim()) throw new Error('Project name is required');\n const { apiKey, projectId } = await createProject({ baseUrl, name: newProjectName.trim(), fetch: fetchImpl });\n onConnected(apiKey, { projectId, source: 'new' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Failed to create project');\n } finally {\n setLoading(false);\n }\n };\n\n const ModeSwitcher = (\n <div className=\"grid grid-cols-3 gap-2\">\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'existing' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('existing')}\n >\n Connect existing\n </button>\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'manual' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('manual')}\n >\n Add API key\n </button>\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'new' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('new')}\n >\n Create new\n </button>\n </div>\n );\n\n return (\n <Dialog.Root open={open} onOpenChange={(o) => { if (!o) resetState(); onOpenChange(o); }}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40\" />\n <Dialog.Content className={`fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[95vw] max-w-md rounded-lg border bg-white p-4 shadow-lg ${className ?? ''}`}>\n <div className=\"space-y-3\">\n <Dialog.Title className=\"text-lg font-semibold\">\n {title ?? 'Connect to Upfiles'}\n </Dialog.Title>\n <Dialog.Description className=\"text-sm text-muted-foreground\">\n {description ?? 'Choose how to connect your project to retrieve an API key.'}\n </Dialog.Description>\n\n {ModeSwitcher}\n\n {error && (\n <div className=\"rounded border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">{error}</div>\n )}\n\n {/* Existing project */}\n {mode === 'existing' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"w-full rounded border px-3 py-2 text-sm\"\n value={selectedProjectId}\n onChange={(e) => setSelectedProjectId(e.target.value)}\n disabled={loading}\n >\n {projects.length === 0 && <option value=\"\">{loading ? 'Loading...' : 'No projects found'}</option>}\n {projects.map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleConnectExisting}\n disabled={loading || !selectedProjectId}\n >\n {loading ? 'Connecting…' : 'Connect'}\n </button>\n </div>\n </div>\n )}\n\n {/* Manual key */}\n {mode === 'manual' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">API key</label>\n <input\n className=\"w-full rounded border px-3 py-2 text-sm\"\n placeholder=\"upk_...\"\n value={manualKey}\n onChange={(e) => setManualKey(e.target.value)}\n disabled={loading}\n />\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleManual}\n disabled={loading || !manualKey.trim()}\n >\n {loading ? 'Adding…' : 'Add key'}\n </button>\n </div>\n </div>\n )}\n\n {/* Create new */}\n {mode === 'new' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project name</label>\n <input\n className=\"w-full rounded border px-3 py-2 text-sm\"\n placeholder=\"My project\"\n value={newProjectName}\n onChange={(e) => setNewProjectName(e.target.value)}\n disabled={loading}\n />\n <p className=\"text-xs text-muted-foreground\">A project will be created in your Upfiles account and an API key generated.</p>\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleCreate}\n disabled={loading || !newProjectName.trim()}\n >\n {loading ? 'Creating…' : 'Create & connect'}\n </button>\n </div>\n </div>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nexport default ConnectProjectDialog;\n","import { UpfilesClient, UpfilesClientOptions, FileListItem, Thumbnail } from './client.js';\r\n\r\nexport async function fetchProjectFiles(clientOptions: UpfilesClientOptions, folderPath?: string): Promise<{ files: FileListItem[]; updatedAt: string | null }> {\r\n const client = new UpfilesClient(clientOptions);\r\n return client.getProjectFiles({ folderPath });\r\n}\r\n\r\nexport async function fetchFileThumbnails(clientOptions: UpfilesClientOptions, fileKey: string): Promise<Thumbnail[]> {\r\n const client = new UpfilesClient(clientOptions);\r\n return client.getThumbnails(fileKey);\r\n}\r\n\r\nexport type ImageWithThumbs = FileListItem & { thumbnails?: Thumbnail[] };\r\n\r\nexport async function fetchProjectImagesWithThumbs(\r\n clientOptions: UpfilesClientOptions,\r\n opts?: { folderPath?: string; limitConcurrent?: number }\r\n): Promise<{ items: ImageWithThumbs[]; updatedAt: string | null }> {\r\n const { files, updatedAt } = await fetchProjectFiles(clientOptions, opts?.folderPath);\r\n const limit = Math.max(1, Math.min(opts?.limitConcurrent ?? 6, 12));\r\n\r\n const queue = [...files];\r\n const results: ImageWithThumbs[] = [];\r\n const processed = new Set<string>();\r\n\r\n async function worker() {\r\n while (queue.length) {\r\n const f = queue.shift();\r\n if (!f || processed.has(f.key)) continue;\r\n\r\n processed.add(f.key);\r\n try {\r\n const thumbs = await fetchFileThumbnails(clientOptions, f.key).catch(() => undefined);\r\n results.push({ ...f, thumbnails: thumbs });\r\n } catch {\r\n results.push({ ...f });\r\n }\r\n }\r\n }\r\n\r\n const workers = Math.min(limit, files.length || 1);\r\n await Promise.all(Array.from({ length: workers }, () => worker()));\r\n\r\n // Sort results to maintain original order\r\n const keyToIndex = new Map(files.map((f, i) => [f.key, i]));\r\n results.sort((a, b) => (keyToIndex.get(a.key) ?? 0) - (keyToIndex.get(b.key) ?? 0));\r\n\r\n return { items: results, updatedAt };\r\n}\r\n","'use client';\r\n\r\nimport * as React from 'react';\r\nimport * as Dialog from '@radix-ui/react-dialog';\r\nimport { UpfilesClientOptions, UpfilesClient, Thumbnail, Folder } from './client.js';\r\nimport { Uploader, UploaderFile } from './Uploader.js';\r\nimport { fetchProjectImagesWithThumbs, ImageWithThumbs } from './files.js';\r\n\r\n// --- Icons (Lucide Style) ---\r\n\r\nconst IconGrid = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\r\n </svg>\r\n);\r\n\r\nconst IconList = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n);\r\n\r\nconst IconUploadCloud = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\r\n <path d=\"M12 12v9\" />\r\n <path d=\"m16 16-4-4-4 4\" />\r\n </svg>\r\n);\r\n\r\nconst IconFolder = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"0\" className={className}>\r\n <path d=\"M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z\" />\r\n </svg>\r\n);\r\n\r\nconst IconFolderPlus = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2Z\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"10\" y2=\"16\" />\r\n <line x1=\"9\" x2=\"15\" y1=\"13\" y2=\"13\" />\r\n </svg>\r\n);\r\n\r\nconst IconSearch = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n <path d=\"m21 21-4.3-4.3\" />\r\n </svg>\r\n);\r\n\r\nconst IconRefresh = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n);\r\n\r\nconst IconChevronRight = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n);\r\n\r\nconst IconTrash = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M3 6h18\" />\r\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\r\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\r\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\r\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\r\n </svg>\r\n);\r\n\r\nconst IconX = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n);\r\n\r\nconst IconHome = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\r\n <polyline points=\"9 22 9 12 15 12 15 22\" />\r\n </svg>\r\n);\r\n\r\nconst IconImage = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\r\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\r\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\r\n </svg>\r\n);\r\n\r\nconst IconLoader = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </svg>\r\n);\r\n\r\nconst IconLayers = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\r\n <polyline points=\"2 17 12 22 22 17\" />\r\n <polyline points=\"2 12 12 17 22 12\" />\r\n </svg>\r\n);\r\n\r\n// --- Component ---\r\n\r\nexport type ImageManagerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n clientOptions: UpfilesClientOptions;\r\n projectId?: string;\r\n folderPath?: string;\r\n title?: string;\r\n description?: string;\r\n className?: string; // Content class\r\n gridClassName?: string;\r\n onSelect: (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n thumbnails?: { id: string; key: string; url: string; size: number; sizeType?: string }[];\r\n selectedThumbnail?: { id: string; key: string; url: string; size: number; sizeType?: string };\r\n }) => void;\r\n onDelete?: (key: string) => Promise<void>;\r\n deleteUrl?: string;\r\n autoRecordToDb?: boolean;\r\n fetchThumbnails?: boolean;\r\n maxFileSize?: number;\r\n maxFiles?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n refreshInterval?: number;\r\n};\r\n\r\nexport function ImageManager(props: ImageManagerProps) {\r\n const {\r\n open,\r\n onOpenChange,\r\n clientOptions,\r\n projectId,\r\n folderPath,\r\n title,\r\n description,\r\n className,\r\n gridClassName,\r\n onSelect,\r\n onDelete,\r\n deleteUrl = '/api/files',\r\n autoRecordToDb = true,\r\n fetchThumbnails = true,\r\n maxFileSize = 100 * 1024 * 1024,\r\n maxFiles = 10,\r\n mode = 'full',\r\n showDelete = true,\r\n refreshInterval = 5000,\r\n } = props;\r\n\r\n const [activeView, setActiveView] = React.useState<'browse' | 'upload'>(mode === 'upload' ? 'upload' : 'browse');\r\n const [loading, setLoading] = React.useState(false);\r\n const [error, setError] = React.useState<string | null>(null);\r\n\r\n // Folder state\r\n const [currentFolderId, setCurrentFolderId] = React.useState<string | undefined>(undefined);\r\n const [breadcrumbs, setBreadcrumbs] = React.useState<{ id: string | undefined, name: string }[]>([{ id: undefined, name: 'Home' }]);\r\n\r\n const [files, setFiles] = React.useState<ImageWithThumbs[]>([]);\r\n const [folders, setFolders] = React.useState<Folder[]>([]);\r\n\r\n const [query, setQuery] = React.useState('');\r\n const [deleting, setDeleting] = React.useState<string | null>(null);\r\n\r\n const [showCreateFolder, setShowCreateFolder] = React.useState(false);\r\n const [newFolderName, setNewFolderName] = React.useState('');\r\n const [creatingFolder, setCreatingFolder] = React.useState(false);\r\n\r\n // Delete & Thumbnail Dialogs\r\n const [fileToDelete, setFileToDelete] = React.useState<ImageWithThumbs | null>(null);\r\n const [thumbnailSelectorFile, setThumbnailSelectorFile] = React.useState<ImageWithThumbs | null>(null);\r\n const [selectedThumbnailForFile, setSelectedThumbnailForFile] = React.useState<{ id: string; key: string; url: string; size: number; sizeType?: string } | null>(null);\r\n\r\n // Image Preview Dialog\r\n const [previewFile, setPreviewFile] = React.useState<ImageWithThumbs | null>(null);\r\n\r\n const lastUpdatedRef = React.useRef<string | null>(null);\r\n const isFetchingRef = React.useRef(false);\r\n\r\n // Helper function to deduplicate files by key\r\n const deduplicateFiles = React.useCallback((files: ImageWithThumbs[]): ImageWithThumbs[] => {\r\n const seen = new Set<string>();\r\n return files.filter(file => {\r\n if (seen.has(file.key)) {\r\n return false;\r\n }\r\n seen.add(file.key);\r\n return true;\r\n });\r\n }, []);\r\n\r\n const load = React.useCallback(async (isPolling = false) => {\r\n if (isFetchingRef.current) return;\r\n isFetchingRef.current = true;\r\n\r\n try {\r\n if (!isPolling) setLoading(true);\r\n setError(null);\r\n\r\n const client = new UpfilesClient(clientOptions);\r\n\r\n // Determine folder path prefix\r\n const currentPathPrefix = breadcrumbs.length > 1\r\n ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/'\r\n : undefined;\r\n const effectiveFolderPath = currentPathPrefix || folderPath;\r\n\r\n const [filesData, foldersData] = await Promise.all([\r\n fetchProjectImagesWithThumbs(clientOptions, { folderPath: effectiveFolderPath, limitConcurrent: 6 }),\r\n client.getFolders(currentFolderId)\r\n ]);\r\n\r\n const { items: list, updatedAt } = filesData;\r\n\r\n if (isPolling && updatedAt && updatedAt === lastUpdatedRef.current) {\r\n // Optimization: if not polling or changed, we continue\r\n }\r\n\r\n setFiles(deduplicateFiles(list));\r\n setFolders(foldersData);\r\n lastUpdatedRef.current = updatedAt;\r\n } catch (e: any) {\r\n if (!isPolling) setError(e?.message || 'Failed to load images');\r\n } finally {\r\n if (!isPolling) setLoading(false);\r\n isFetchingRef.current = false;\r\n }\r\n }, [clientOptions, folderPath, currentFolderId, breadcrumbs]);\r\n\r\n React.useEffect(() => {\r\n if (!open) {\r\n setFiles([]);\r\n setFolders([]);\r\n setQuery('');\r\n setError(null);\r\n lastUpdatedRef.current = null;\r\n return;\r\n }\r\n if (mode !== 'upload' && activeView === 'browse') {\r\n load();\r\n }\r\n }, [open, activeView, load, mode]);\r\n\r\n // Real-time updates via SSE\r\n React.useEffect(() => {\r\n if (!open) return;\r\n const client = new UpfilesClient(clientOptions);\r\n const url = client.getEventsUrl(projectId);\r\n const eventSource = new EventSource(url);\r\n\r\n eventSource.onmessage = (event) => {\r\n try {\r\n const payload = JSON.parse(event.data);\r\n if (payload.type === 'file:uploaded') {\r\n const newFile = payload.data.file;\r\n setFiles((prev) => {\r\n // Check for duplicates before adding\r\n if (prev.find(f => f.key === newFile.key)) return prev;\r\n return deduplicateFiles([newFile, ...prev]);\r\n });\r\n } else if (payload.type === 'file:deleted') {\r\n const deletedKey = payload.data.fileKey || payload.data.file?.key;\r\n setFiles((prev) => prev.filter((f) => f.key !== deletedKey));\r\n }\r\n } catch (e) {\r\n console.error('SSE Error parsing message', e);\r\n }\r\n };\r\n return () => eventSource.close();\r\n }, [open, clientOptions, projectId]);\r\n\r\n const visibleFiles = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n return !q ? files : files.filter((i) => (i.originalName || '').toLowerCase().includes(q));\r\n }, [files, query]);\r\n\r\n const visibleFolders = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n return !q ? folders : folders.filter((f) => (f.name || '').toLowerCase().includes(q));\r\n }, [folders, query]);\r\n\r\n const handleDelete = async () => {\r\n if (!fileToDelete) return;\r\n const key = fileToDelete.key;\r\n try {\r\n setDeleting(key);\r\n if (onDelete) {\r\n await onDelete(key);\r\n } else {\r\n const client = new UpfilesClient(clientOptions);\r\n const baseUrl = clientOptions?.baseUrl || '';\r\n const url = baseUrl ? `${baseUrl}${deleteUrl}` : deleteUrl;\r\n const headers: Record<string, string> = {\r\n 'content-type': 'application/json',\r\n ...(clientOptions?.headers || {}),\r\n };\r\n if (clientOptions?.apiKey) {\r\n const keyHeader = clientOptions.apiKeyHeader || 'authorization';\r\n if (keyHeader === 'authorization') {\r\n headers['authorization'] = clientOptions.apiKey.startsWith('upk_')\r\n ? `Bearer ${clientOptions.apiKey}`\r\n : clientOptions.apiKey;\r\n } else {\r\n headers[keyHeader] = clientOptions.apiKey;\r\n }\r\n }\r\n const res = await fetch(url, {\r\n method: 'DELETE',\r\n headers,\r\n credentials: clientOptions?.withCredentials ? 'include' : 'same-origin',\r\n body: JSON.stringify({ fileKey: key }),\r\n });\r\n if (!res.ok) throw new Error('Delete failed');\r\n }\r\n setFiles((prev) => prev.filter((f) => f.key !== key));\r\n setFileToDelete(null);\r\n } catch (e: any) {\r\n alert(e?.message || 'Failed to delete');\r\n } finally {\r\n setDeleting(null);\r\n }\r\n };\r\n\r\n const handleCreateFolder = async () => {\r\n if (!newFolderName.trim()) return;\r\n setCreatingFolder(true);\r\n try {\r\n const client = new UpfilesClient(clientOptions);\r\n await client.createFolder(newFolderName, currentFolderId);\r\n setNewFolderName('');\r\n setShowCreateFolder(false);\r\n load();\r\n } catch (e: any) {\r\n alert(e.message || 'Failed to create folder');\r\n } finally {\r\n setCreatingFolder(false);\r\n }\r\n };\r\n\r\n const handleNavigate = (folder: Folder) => {\r\n setCurrentFolderId(folder.id);\r\n setBreadcrumbs(prev => [...prev, { id: folder.id, name: folder.name }]);\r\n setQuery('');\r\n };\r\n\r\n const handleBreadcrumbClick = (index: number) => {\r\n const target = breadcrumbs[index];\r\n setBreadcrumbs(breadcrumbs.slice(0, index + 1));\r\n setCurrentFolderId(target.id);\r\n setQuery('');\r\n };\r\n\r\n const uploadFoldersList = React.useMemo(() => {\r\n const options = [];\r\n options.push({ id: 'root', name: 'Root ( / )', path: undefined });\r\n if (currentFolderId) {\r\n const currentPath = breadcrumbs.slice(1).map(b => b.name).join('/') + '/';\r\n options.push({ id: 'current', name: `Current ( ${breadcrumbs[breadcrumbs.length - 1].name} )`, path: currentPath });\r\n }\r\n folders.forEach(f => {\r\n const parentPath = breadcrumbs.length > 1 ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/' : '';\r\n options.push({ id: f.id, name: f.name, path: parentPath + f.name + '/' });\r\n });\r\n return options;\r\n }, [breadcrumbs, currentFolderId, folders]);\r\n\r\n const [selectedUploadFolder, setSelectedUploadFolder] = React.useState<string>('current');\r\n const activeBreadcrumbPath = React.useMemo(() => {\r\n return breadcrumbs.length > 1 ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/' : undefined;\r\n }, [breadcrumbs]);\r\n\r\n return (\r\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-all duration-300 flex items-center justify-center\" />\r\n <Dialog.Content\r\n className={`fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[95vw] h-[90vh] max-w-7xl min-w-[800px] min-h-[600px] rounded-2xl bg-white dark:bg-gray-950 shadow-2xl z-[51] overflow-hidden flex flex-row ${className ?? ''}`}\r\n >\r\n {/* Hidden title for accessibility */}\r\n <Dialog.Title\r\n style={{\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0'\r\n }}\r\n >\r\n {title ?? 'Media Library'}\r\n </Dialog.Title>\r\n {/* SIDEBAR */}\r\n <div className=\"w-64 min-w-[256px] bg-gray-50 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800 flex flex-col flex-shrink-0\">\r\n <div className=\"p-6\">\r\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white flex items-center gap-2\">\r\n <IconImage className=\"text-blue-600\" />\r\n {title ?? 'Media Library'}\r\n </h2>\r\n <p className=\"text-xs text-gray-500 mt-1\">{description ?? 'Manage your assets'}</p>\r\n </div>\r\n\r\n <nav className=\"flex-1 px-3 space-y-1\">\r\n <button\r\n onClick={() => setActiveView('browse')}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-lg transition-colors ${activeView === 'browse' ? 'bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 shadow-sm' : 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'}`}\r\n >\r\n <IconGrid className=\"w-4 h-4\" />\r\n All Files\r\n </button>\r\n {mode === 'full' && (\r\n <button\r\n onClick={() => setActiveView('upload')}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-lg transition-colors ${activeView === 'upload' ? 'bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 shadow-sm' : 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'}`}\r\n >\r\n <IconUploadCloud className=\"w-4 h-4\" />\r\n Upload New\r\n </button>\r\n )}\r\n </nav>\r\n\r\n <div className=\"p-4 border-t border-gray-200 dark:border-gray-800\">\r\n <div className=\"text-xs text-center text-gray-400\">\r\n {files.length} files • {folders.length} folders\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* MAIN CONTENT */}\r\n <div className=\"flex-1 flex flex-col bg-white dark:bg-gray-950 relative\">\r\n {/* Toolbar */}\r\n <div className=\"h-16 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between px-6 gap-4\">\r\n <div className=\"flex items-center gap-4 flex-1\">\r\n {activeView === 'browse' && (\r\n <>\r\n {/* Breadcrumbs */}\r\n <div className=\"flex items-center text-sm text-gray-500 overflow-hidden whitespace-nowrap\">\r\n <button onClick={() => handleBreadcrumbClick(0)} className=\"hover:text-blue-600 transition-colors\">\r\n <IconHome className=\"w-4 h-4\" />\r\n </button>\r\n {breadcrumbs.slice(1).map((b, i) => (\r\n <React.Fragment key={`${b.id || 'breadcrumb'}-${i}`}>\r\n <IconChevronRight className=\"w-4 h-4 text-gray-300 mx-1\" />\r\n <button\r\n onClick={() => handleBreadcrumbClick(i + 1)}\r\n className={`hover:text-blue-600 transition-colors truncate max-w-[100px] ${i === breadcrumbs.length - 2 ? 'font-semibold text-gray-900 dark:text-white' : ''}`}\r\n >\r\n {b.name}\r\n </button>\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n\r\n <div className=\"h-4 w-px bg-gray-200 dark:bg-gray-700 mx-2\" />\r\n\r\n <button\r\n onClick={() => load()}\r\n disabled={loading}\r\n className=\"p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-md transition-all disabled:opacity-50\"\r\n title=\"Refresh\"\r\n >\r\n <IconRefresh className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\r\n </button>\r\n\r\n <div className=\"h-4 w-px bg-gray-200 dark:bg-gray-700 mx-2\" />\r\n\r\n {/* Search */}\r\n <div className=\"relative flex-1 max-w-sm group\">\r\n <IconSearch className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 group-focus-within:text-blue-500 transition-colors\" />\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search files...\"\r\n className=\"w-full pl-9 pr-4 py-1.5 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all\"\r\n />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {activeView === 'browse' && (\r\n <>\r\n <button onClick={() => setShowCreateFolder(true)} className=\"p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/10 rounded-lg transition-colors\" title=\"New Folder\">\r\n <IconFolderPlus className=\"w-5 h-5\" />\r\n </button>\r\n <button onClick={() => load()} className={`p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/10 rounded-lg transition-colors ${loading ? 'animate-spin text-blue-600' : ''}`} title=\"Refresh\">\r\n <IconLoader className=\"w-5 h-5\" />\r\n </button>\r\n </>\r\n )}\r\n <Dialog.Close asChild>\r\n <button className=\"ml-2 p-2 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/10 rounded-lg transition-colors\">\r\n <IconX className=\"w-5 h-5\" />\r\n </button>\r\n </Dialog.Close>\r\n </div>\r\n </div>\r\n\r\n {/* Content Area */}\r\n <div className=\"flex-1 overflow-y-auto p-6 bg-gray-50/30 dark:bg-gray-900/30\">\r\n {activeView === 'browse' && (\r\n <>\r\n {error && (\r\n <div className=\"mb-6 bg-red-50 text-red-600 p-4 rounded-lg text-sm border border-red-100 flex items-center gap-2\">\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n <div className={gridClassName ?? \"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-6\"}>\r\n {/* Folders */}\r\n {visibleFolders.map((folder) => (\r\n <div\r\n key={folder.id}\r\n onClick={() => handleNavigate(folder)}\r\n className=\"group flex flex-col items-center gap-3 p-4 rounded-xl border border-gray-200/60 bg-white hover:border-blue-200 hover:shadow-lg hover:shadow-blue-500/5 hover:-translate-y-1 transition-all cursor-pointer\"\r\n >\r\n <div className=\"w-16 h-12 bg-blue-50 rounded-lg flex items-center justify-center text-blue-500 group-hover:scale-110 transition-transform\">\r\n <IconFolder className=\"w-8 h-8 drop-shadow-sm\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-gray-700 truncate w-full text-center\">{folder.name}</span>\r\n </div>\r\n ))}\r\n\r\n {/* Files */}\r\n {visibleFiles.map((f) => {\r\n const fWithThumbs = f as any;\r\n const bestThumb = fWithThumbs.thumbnails?.sort((a: any, b: any) => a.size - b.size).find((t: any) => t.size >= 300) || fWithThumbs.thumbnails?.[fWithThumbs.thumbnails?.length - 1];\r\n const thumbUrl = bestThumb?.url || f.url;\r\n\r\n return (\r\n <div\r\n key={f.key}\r\n onClick={() => setPreviewFile(f)}\r\n className=\"group relative aspect-[4/3] bg-white rounded-xl border border-gray-200 overflow-hidden shadow-sm hover:shadow-xl hover:shadow-gray-200/50 hover:border-blue-300 transition-all duration-300 cursor-pointer\"\r\n >\r\n <img src={thumbUrl} alt={f.originalName} className=\"w-full h-full object-cover transition-transform duration-700 group-hover:scale-105\" />\r\n\r\n {/* Hover Overlay */}\r\n <div className=\"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex flex-col justify-end p-3\">\r\n <div className=\"flex gap-2 justify-center transform translate-y-2 group-hover:translate-y-0 transition-transform duration-300\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSelect({\r\n url: f.url,\r\n key: f.key,\r\n originalName: f.originalName,\r\n size: f.size,\r\n contentType: f.contentType,\r\n thumbnails: f.thumbnails,\r\n });\r\n onOpenChange(false);\r\n }}\r\n className=\"px-3 py-1.5 bg-blue-600 text-white text-xs font-semibold rounded-md hover:bg-blue-500 shadow-lg\"\r\n >\r\n Select\r\n </button>\r\n {fWithThumbs.thumbnails && fWithThumbs.thumbnails.length > 0 && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setThumbnailSelectorFile(f);\r\n setSelectedThumbnailForFile(null);\r\n }}\r\n className=\"p-1.5 bg-white/20 text-white text-xs font-semibold rounded-md hover:bg-purple-500 backdrop-blur-md transition-colors\"\r\n title=\"Select Thumbnail\"\r\n >\r\n <IconLayers className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n {showDelete && (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setFileToDelete(f); }}\r\n className=\"p-1.5 bg-white/20 text-white text-xs font-semibold rounded-md hover:bg-red-500 backdrop-blur-md transition-colors\"\r\n >\r\n <IconTrash className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Info Badge */}\r\n <div className=\"absolute top-2 right-2 bg-black/50 backdrop-blur-md text-white text-[10px] px-1.5 py-0.5 rounded opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {f.originalName.split('.').pop()?.toUpperCase()}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {!loading && visibleFolders.length === 0 && visibleFiles.length === 0 && (\r\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400\">\r\n <div className=\"w-16 h-16 bg-gray-100 rounded-2xl flex items-center justify-center mb-4\">\r\n <IconSearch className=\"w-8 h-8 opacity-40\" />\r\n </div>\r\n <h3 className=\"text-gray-900 font-medium mb-1\">No Assets Found</h3>\r\n <p className=\"text-sm\">Try uploading a file or creating a new folder.</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {activeView === 'upload' && (\r\n <div className=\"h-full flex flex-col items-center justify-center max-w-2xl mx-auto\">\r\n <div className=\"w-full bg-white rounded-2xl border border-gray-200 p-8 shadow-sm\">\r\n <h3 className=\"text-lg font-semibold text-gray-900 mb-6 flex items-center gap-2\">\r\n <IconUploadCloud className=\"text-blue-500\" />\r\n Upload Files\r\n </h3>\r\n\r\n <div className=\"mb-6\">\r\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">Target Folder</label>\r\n <div className=\"flex gap-2\">\r\n <select\r\n value={selectedUploadFolder}\r\n onChange={(e) => setSelectedUploadFolder(e.target.value)}\r\n className=\"block w-full rounded-lg border-gray-200 bg-gray-50 text-gray-900 text-sm focus:ring-blue-500 focus:border-blue-500 p-2.5\"\r\n >\r\n {uploadFoldersList.map(opt => (\r\n <option key={opt.id} value={opt.id}>{opt.name}</option>\r\n ))}\r\n </select>\r\n <button onClick={() => setShowCreateFolder(true)} className=\"px-3 bg-gray-100 hover:bg-gray-200 rounded-lg text-gray-600 transition-colors\">\r\n <IconFolderPlus className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <Uploader\r\n clientOptions={clientOptions}\r\n projectId={projectId}\r\n folderPath={uploadFoldersList.find(o => o.id === selectedUploadFolder)?.path || activeBreadcrumbPath || folderPath}\r\n accept={['image/*']}\r\n maxFileSize={maxFileSize}\r\n maxFiles={maxFiles}\r\n autoRecordToDb={autoRecordToDb}\r\n fetchThumbnails={fetchThumbnails}\r\n autoUpload={true}\r\n onClientUploadComplete={(file: UploaderFile) => {\r\n if (file.status === 'success' && file.publicUrl && file.fileKey) {\r\n const newItem = {\r\n key: file.fileKey,\r\n originalName: file.name,\r\n size: file.size,\r\n contentType: file.type,\r\n uploadedAt: new Date().toISOString(),\r\n url: file.publicUrl,\r\n thumbnails: (file as any).thumbnails,\r\n };\r\n setFiles((prev) => {\r\n // Check for duplicates before adding\r\n if (prev.find(f => f.key === newItem.key)) return prev;\r\n return deduplicateFiles([newItem, ...prev]);\r\n });\r\n }\r\n }}\r\n onComplete={() => {\r\n if (mode === 'full') {\r\n setTimeout(() => {\r\n setActiveView('browse');\r\n load();\r\n }, 1000);\r\n }\r\n }}\r\n dropzoneClassName=\"border-2 border-dashed border-gray-300 bg-gray-50 rounded-xl p-12 text-center cursor-pointer hover:border-blue-500 hover:bg-blue-50/50 transition-all\"\r\n buttonClassName=\"hidden\"\r\n children={\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-12 h-12 bg-blue-100 text-blue-600 rounded-full flex items-center justify-center\">\r\n <IconUploadCloud className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <p className=\"text-gray-900 font-medium\">Click to upload or drag and drop</p>\r\n <p className=\"text-xs text-gray-500 mt-1\">Supports PNG, JPG, GIF up to {Math.round(maxFileSize / 1024 / 1024)}MB</p>\r\n </div>\r\n </div>\r\n }\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n\r\n {/* New Folder Dialog */}\r\n <Dialog.Root open={showCreateFolder} onOpenChange={setShowCreateFolder}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40 z-[60]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-sm rounded-xl bg-white p-6 shadow-2xl z-[61] outline-none\" aria-describedby=\"new-folder-description\">\r\n <Dialog.Title className=\"text-lg font-semibold text-gray-900 mb-4\">New Folder</Dialog.Title>\r\n <Dialog.Description id=\"new-folder-description\" className=\"sr-only\">\r\n Create a new folder to organize your files\r\n </Dialog.Description>\r\n <input\r\n autoFocus\r\n className=\"w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 outline-none mb-6\"\r\n placeholder=\"Folder Name\"\r\n value={newFolderName}\r\n onChange={e => setNewFolderName(e.target.value)}\r\n onKeyDown={e => e.key === 'Enter' && handleCreateFolder()}\r\n />\r\n <div className=\"flex justify-end gap-3\">\r\n <button onClick={() => setShowCreateFolder(false)} className=\"px-4 py-2 text-sm font-medium text-gray-600 hover:bg-gray-100 rounded-lg\">Cancel</button>\r\n <button\r\n onClick={handleCreateFolder}\r\n disabled={creatingFolder || !newFolderName.trim()}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50\"\r\n >\r\n Create\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Delete Dialog */}\r\n <Dialog.Root open={!!fileToDelete} onOpenChange={(open) => !open && setFileToDelete(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40 z-[80]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-md rounded-xl bg-white p-6 shadow-2xl z-[81]\" aria-describedby=\"delete-file-description\">\r\n <Dialog.Title className=\"text-xl font-semibold text-gray-900 mb-2\">Delete File</Dialog.Title>\r\n <Dialog.Description id=\"delete-file-description\" className=\"text-gray-600 mb-6\">\r\n Are you sure you want to delete <span className=\"font-semibold text-gray-900\">\"{fileToDelete?.originalName}\"</span>?\r\n </Dialog.Description>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setFileToDelete(null)}\r\n className=\"px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 rounded-lg\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={!!deleting}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-red-600 text-white hover:bg-red-700 disabled:opacity-70\"\r\n >\r\n {deleting ? 'Deleting...' : 'Delete'}\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Thumbnail Selector Dialog */}\r\n <Dialog.Root open={!!thumbnailSelectorFile} onOpenChange={(open) => !open && setThumbnailSelectorFile(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/50 z-[90]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-4xl max-h-[80vh] rounded-xl bg-white shadow-2xl z-[91] overflow-hidden\" aria-describedby=\"thumbnail-selector-description\">\r\n <div className=\"p-6 border-b border-gray-200\">\r\n <Dialog.Title className=\"text-xl font-semibold text-gray-900 mb-2\">Select Thumbnail</Dialog.Title>\r\n <Dialog.Description id=\"thumbnail-selector-description\" className=\"text-gray-600\">\r\n Choose a thumbnail size for <span className=\"font-semibold text-gray-900\">\"{thumbnailSelectorFile?.originalName}\"</span>\r\n </Dialog.Description>\r\n </div>\r\n\r\n <div className=\"p-6 overflow-y-auto max-h-[60vh]\">\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\r\n {/* Original Image Option */}\r\n <div\r\n onClick={() => setSelectedThumbnailForFile(null)}\r\n className={`group cursor-pointer rounded-lg border-2 overflow-hidden transition-all ${selectedThumbnailForFile === null\r\n ? 'border-blue-500 ring-2 ring-blue-200'\r\n : 'border-gray-200 hover:border-blue-300'\r\n }`}\r\n >\r\n <div className=\"aspect-square bg-gray-100 flex items-center justify-center relative\">\r\n <img\r\n src={thumbnailSelectorFile?.url}\r\n alt=\"Original\"\r\n className=\"w-full h-full object-cover\"\r\n />\r\n {selectedThumbnailForFile === null && (\r\n <div className=\"absolute inset-0 bg-blue-500/20 flex items-center justify-center\">\r\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-4 h-4 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"p-3 bg-white\">\r\n <div className=\"font-medium text-sm text-gray-900\">Original</div>\r\n <div className=\"text-xs text-gray-500\">Full size</div>\r\n </div>\r\n </div>\r\n\r\n {/* Thumbnail Options */}\r\n {thumbnailSelectorFile?.thumbnails?.map((thumbnail) => (\r\n <div\r\n key={thumbnail.id}\r\n onClick={() => setSelectedThumbnailForFile(thumbnail)}\r\n className={`group cursor-pointer rounded-lg border-2 overflow-hidden transition-all ${selectedThumbnailForFile?.id === thumbnail.id\r\n ? 'border-blue-500 ring-2 ring-blue-200'\r\n : 'border-gray-200 hover:border-blue-300'\r\n }`}\r\n >\r\n <div className=\"aspect-square bg-gray-100 flex items-center justify-center relative\">\r\n <img\r\n src={thumbnail.url}\r\n alt={`${thumbnail.size}px thumbnail`}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n {selectedThumbnailForFile?.id === thumbnail.id && (\r\n <div className=\"absolute inset-0 bg-blue-500/20 flex items-center justify-center\">\r\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-4 h-4 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"p-3 bg-white\">\r\n <div className=\"font-medium text-sm text-gray-900\">{thumbnail.size}px</div>\r\n <div className=\"text-xs text-gray-500\">\r\n {thumbnail.sizeType || 'Thumbnail'}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-6 border-t border-gray-200 flex justify-end gap-3\">\r\n <button\r\n onClick={() => setThumbnailSelectorFile(null)}\r\n className=\"px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 rounded-lg\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n if (thumbnailSelectorFile) {\r\n onSelect({\r\n url: selectedThumbnailForFile?.url || thumbnailSelectorFile.url,\r\n key: thumbnailSelectorFile.key,\r\n originalName: thumbnailSelectorFile.originalName,\r\n size: thumbnailSelectorFile.size,\r\n contentType: thumbnailSelectorFile.contentType,\r\n thumbnails: thumbnailSelectorFile.thumbnails,\r\n selectedThumbnail: selectedThumbnailForFile || undefined,\r\n });\r\n onOpenChange(false);\r\n setThumbnailSelectorFile(null);\r\n }\r\n }}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-blue-600 text-white hover:bg-blue-700\"\r\n >\r\n Select {selectedThumbnailForFile ? `${selectedThumbnailForFile.size}px Thumbnail` : 'Original'}\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Image Preview Dialog */}\r\n <Dialog.Root open={!!previewFile} onOpenChange={(open) => !open && setPreviewFile(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/90 z-[100]\" onClick={() => setPreviewFile(null)} />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[90vw] h-[90vh] z-[101] outline-none\" aria-describedby=\"image-preview-description\">\r\n <div className=\"relative w-full h-full flex flex-col\">\r\n {/* Header */}\r\n <div className=\"absolute top-0 left-0 right-0 z-10 bg-gradient-to-b from-black/70 to-transparent p-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"text-white\">\r\n <Dialog.Title className=\"text-xl font-semibold mb-1\">{previewFile?.originalName}</Dialog.Title>\r\n <Dialog.Description id=\"image-preview-description\" className=\"text-sm text-gray-300\">\r\n {previewFile?.size ? `${(previewFile.size / 1024).toFixed(1)} KB` : ''} • {previewFile?.contentType}\r\n </Dialog.Description>\r\n </div>\r\n <button\r\n onClick={() => setPreviewFile(null)}\r\n className=\"p-2 bg-white/10 hover:bg-white/20 rounded-lg backdrop-blur-md transition-colors\"\r\n >\r\n <IconX className=\"w-6 h-6 text-white\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image */}\r\n <div className=\"flex-1 flex items-center justify-center p-6\">\r\n <img\r\n src={previewFile?.url}\r\n alt={previewFile?.originalName}\r\n className=\"max-w-full max-h-full object-contain\"\r\n onError={(e) => {\r\n // If image fails to load, show error message\r\n const target = e.target as HTMLImageElement;\r\n target.style.display = 'none';\r\n const errorDiv = document.createElement('div');\r\n errorDiv.className = 'text-white text-center';\r\n errorDiv.innerHTML = `\r\n <div class=\"text-red-400 mb-2\">Failed to load image</div>\r\n <div class=\"text-sm text-gray-400\">URL: ${previewFile?.url}</div>\r\n `;\r\n target.parentElement?.appendChild(errorDiv);\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"absolute bottom-0 left-0 right-0 z-10 bg-gradient-to-t from-black/70 to-transparent p-6\">\r\n <div className=\"flex gap-3 justify-center\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (previewFile) {\r\n onSelect({\r\n url: previewFile.url,\r\n key: previewFile.key,\r\n originalName: previewFile.originalName,\r\n size: previewFile.size,\r\n contentType: previewFile.contentType,\r\n thumbnails: previewFile.thumbnails,\r\n });\r\n onOpenChange(false);\r\n setPreviewFile(null);\r\n }\r\n }}\r\n className=\"px-6 py-2.5 bg-blue-600 text-white font-semibold rounded-lg hover:bg-blue-500 shadow-lg\"\r\n >\r\n Select Image\r\n </button>\r\n <a\r\n href={previewFile?.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"px-6 py-2.5 bg-white/10 text-white font-semibold rounded-lg hover:bg-white/20 backdrop-blur-md transition-colors\"\r\n >\r\n Open in New Tab\r\n </a>\r\n {(previewFile as any)?.thumbnails && (previewFile as any).thumbnails.length > 0 && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setThumbnailSelectorFile(previewFile);\r\n setSelectedThumbnailForFile(null);\r\n setPreviewFile(null);\r\n }}\r\n className=\"px-6 py-2.5 bg-purple-600 text-white font-semibold rounded-lg hover:bg-purple-500 shadow-lg flex items-center gap-2\"\r\n >\r\n <IconLayers className=\"w-5 h-5\" />\r\n Select Thumbnail\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n </Dialog.Root>\r\n );\r\n}\r\n\r\nexport default ImageManager;\r\n"]}
|