@igorvaryvoda/sirv-upload-widget 0.1.0 → 0.1.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/image-utils.ts","../src/utils/csv-parser.ts","../src/components/DropZone.tsx","../src/components/FileList.tsx","../src/components/FilePicker.tsx","../src/components/SpreadsheetImport.tsx","../src/hooks/useSirvUpload.ts","../src/components/SirvUploader.tsx"],"names":["clsx","jsx","jsxs","useState","useRef","useCallback","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Image utility functions for the Sirv Upload Widget\n */\n\nconst HEIC_TYPES = ['image/heic', 'image/heif']\nconst IMAGE_EXTENSIONS = /\\.(jpe?g|png|gif|webp|heic|heif|bmp|tiff?|avif)$/i\n\nexport const ACCEPTED_IMAGE_FORMATS =\n 'image/jpeg,image/png,image/gif,image/webp,image/bmp,image/tiff,image/heic,image/heif,image/avif,.jpg,.jpeg,.png,.gif,.webp,.bmp,.tif,.tiff,.heic,.heif,.avif'\n\nexport const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024 // 10MB\n\nexport function isImageFile(file: File): boolean {\n if (file.type.startsWith('image/')) return true\n if (IMAGE_EXTENSIONS.test(file.name)) return true\n return false\n}\n\nexport function isHeifFile(file: File): boolean {\n if (HEIC_TYPES.includes(file.type.toLowerCase())) return true\n if (/\\.(heic|heif)$/i.test(file.name)) return true\n return false\n}\n\nexport async function detectHeicByMagicBytes(file: File): Promise<boolean> {\n try {\n const buffer = await file.slice(0, 12).arrayBuffer()\n const view = new DataView(buffer)\n\n if (view.byteLength < 12) return false\n\n const ftypOffset = 4\n const ftyp = String.fromCharCode(\n view.getUint8(ftypOffset),\n view.getUint8(ftypOffset + 1),\n view.getUint8(ftypOffset + 2),\n view.getUint8(ftypOffset + 3)\n )\n\n if (ftyp !== 'ftyp') return false\n\n const brand = String.fromCharCode(\n view.getUint8(8),\n view.getUint8(9),\n view.getUint8(10),\n view.getUint8(11)\n )\n\n const heicBrands = ['heic', 'heix', 'hevc', 'hevx', 'mif1', 'msf1']\n return heicBrands.includes(brand.toLowerCase())\n } catch {\n return false\n }\n}\n\nexport async function convertHeicToJpeg(file: File): Promise<File> {\n const heic2any = (await import('heic2any')).default\n const blob = await heic2any({\n blob: file,\n toType: 'image/jpeg',\n quality: 0.92,\n })\n const resultBlob = Array.isArray(blob) ? blob[0] : blob\n\n if (!resultBlob || resultBlob.size === 0) {\n throw new Error('HEIC conversion produced empty result')\n }\n\n const newName = file.name.replace(/\\.(heic|heif)$/i, '.jpg') || 'converted.jpg'\n return new File([resultBlob], newName.endsWith('.jpg') ? newName : `${newName}.jpg`, {\n type: 'image/jpeg',\n })\n}\n\n/**\n * Convert HEIC with multiple fallback strategies:\n * 1. Client-side heic2any library\n * 2. Browser native support via canvas (Safari)\n * 3. Optional server-side endpoint\n */\nexport async function convertHeicWithFallback(\n file: File,\n serverEndpoint?: string\n): Promise<File> {\n // Try 1: Client-side heic2any library\n try {\n return await convertHeicToJpeg(file)\n } catch (primaryError) {\n console.warn('Primary HEIC conversion (heic2any) failed:', primaryError)\n\n // Try 2: Browser native support via canvas (Safari only)\n try {\n const img = new Image()\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n\n if (!ctx) throw new Error('Canvas not supported')\n\n const objectUrl = URL.createObjectURL(file)\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve()\n img.onerror = () => reject(new Error('Browser cannot decode HEIC natively'))\n img.src = objectUrl\n })\n\n canvas.width = img.naturalWidth\n canvas.height = img.naturalHeight\n ctx.drawImage(img, 0, 0)\n\n URL.revokeObjectURL(objectUrl)\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, 'image/jpeg', 0.92)\n })\n\n if (!blob || blob.size === 0) {\n throw new Error('Canvas conversion produced empty result')\n }\n\n const newName = file.name.replace(/\\.(heic|heif)$/i, '.jpg') || 'converted.jpg'\n return new File([blob], newName.endsWith('.jpg') ? newName : `${newName}.jpg`, {\n type: 'image/jpeg',\n })\n } catch (canvasError) {\n console.warn('Canvas fallback failed:', canvasError)\n\n // Try 3: Server-side conversion if endpoint provided\n if (serverEndpoint) {\n try {\n const formData = new FormData()\n formData.append('file', file)\n\n const response = await fetch(serverEndpoint, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n throw new Error(`Server returned ${response.status}`)\n }\n\n const { dataUrl, filename } = await response.json()\n const base64Data = dataUrl.split(',')[1]\n const binaryString = atob(base64Data)\n const bytes = new Uint8Array(binaryString.length)\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n const blob = new Blob([bytes], { type: 'image/jpeg' })\n\n return new File([blob], filename, { type: 'image/jpeg' })\n } catch (serverError) {\n console.warn('Server-side HEIC conversion failed:', serverError)\n }\n }\n\n const primaryMsg = primaryError instanceof Error ? primaryError.message : String(primaryError)\n throw new Error(\n `Unable to convert HEIC image (${primaryMsg}). Please export as JPEG from your Photos app.`\n )\n }\n }\n}\n\nexport function generateId(): string {\n const array = new Uint8Array(8)\n crypto.getRandomValues(array)\n const randomPart = Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('')\n return `${Date.now()}-${randomPart}`\n}\n\nexport function validateFileSize(\n file: File,\n maxSize: number = DEFAULT_MAX_FILE_SIZE\n): { valid: boolean; error?: string } {\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `File too large. Maximum size is ${Math.round(maxSize / 1024 / 1024)}MB, got ${(file.size / 1024 / 1024).toFixed(1)}MB`,\n }\n }\n return { valid: true }\n}\n\nexport function isValidUrl(url: string | null | undefined): url is string {\n if (!url) return false\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\nexport async function getImageDimensions(\n file: File\n): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n img.onload = () => {\n URL.revokeObjectURL(url)\n resolve({ width: img.naturalWidth, height: img.naturalHeight })\n }\n\n img.onerror = () => {\n URL.revokeObjectURL(url)\n resolve(null)\n }\n\n img.src = url\n })\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\nexport function getFileExtension(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/)\n return match ? match[1].toLowerCase() : ''\n}\n\nexport function getMimeType(file: File): string {\n if (file.type) return file.type\n\n const ext = getFileExtension(file.name)\n const mimeTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n avif: 'image/avif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n heic: 'image/heic',\n heif: 'image/heif',\n }\n\n return mimeTypes[ext] || 'application/octet-stream'\n}\n","/**\n * Client-side CSV/Excel parsing utilities\n * ExcelJS is dynamically imported to avoid bundling ~300KB in initial load\n */\n\nexport type CellValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | { text: string }\n | { result: unknown }\n\nconst DELIMITERS = [',', '\\t', ';', '|'] as const\nexport type CsvDelimiter = (typeof DELIMITERS)[number]\n\n/**\n * Detect the delimiter used in CSV content by analyzing the first few lines\n */\nexport function detectDelimiter(csvContent: string): CsvDelimiter {\n const lines = csvContent.trim().split(/\\r?\\n/).slice(0, 5)\n if (lines.length === 0) return ','\n\n const delimiterCounts: Record<CsvDelimiter, number[]> = {\n ',': [],\n '\\t': [],\n ';': [],\n '|': [],\n }\n\n for (const line of lines) {\n let inQuotes = false\n const counts: Record<CsvDelimiter, number> = { ',': 0, '\\t': 0, ';': 0, '|': 0 }\n\n for (const char of line) {\n if (char === '\"') {\n inQuotes = !inQuotes\n } else if (!inQuotes) {\n if (char in counts) {\n counts[char as CsvDelimiter]++\n }\n }\n }\n\n for (const delim of DELIMITERS) {\n delimiterCounts[delim].push(counts[delim])\n }\n }\n\n let bestDelimiter: CsvDelimiter = ','\n let bestScore = -1\n\n for (const delim of DELIMITERS) {\n const counts = delimiterCounts[delim]\n if (counts.length === 0) continue\n\n const nonZero = counts.filter((c) => c > 0)\n if (nonZero.length === 0) continue\n\n const allSame = nonZero.every((c) => c === nonZero[0])\n const avgCount = nonZero.reduce((a, b) => a + b, 0) / nonZero.length\n const coverage = nonZero.length / counts.length\n\n const score = (allSame ? 100 : 0) + avgCount * coverage\n\n if (score > bestScore && avgCount > 0) {\n bestScore = score\n bestDelimiter = delim\n }\n }\n\n return bestDelimiter\n}\n\n/**\n * Parse a single CSV row, handling quoted fields\n */\nexport function parseCsvRow(line: string, delimiter: CsvDelimiter = ','): string[] {\n const result: string[] = []\n let current = ''\n let inQuotes = false\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i]\n if (char === '\"') {\n inQuotes = !inQuotes\n } else if (char === delimiter && !inQuotes) {\n result.push(current.trim().replace(/^\"|\"$/g, ''))\n current = ''\n } else {\n current += char\n }\n }\n result.push(current.trim().replace(/^\"|\"$/g, ''))\n return result\n}\n\n/**\n * Split comma-separated URLs in a cell value\n */\nexport function splitMultipleUrls(cellValue: string): string[] {\n if (!cellValue) return []\n return cellValue\n .split(',')\n .map((url) => url.trim())\n .filter((url) => url.length > 0 && url.startsWith('http'))\n}\n\n/**\n * Extract pathname from a URL string\n */\nexport function extractPathFromUrl(url: string): string {\n try {\n return new URL(url).pathname\n } catch {\n return url\n }\n}\n\n/**\n * Convert ExcelJS cell value to string\n */\nexport function cellToString(cell: CellValue): string {\n if (cell == null) return ''\n if (typeof cell === 'object' && 'text' in cell) return cell.text\n if (typeof cell === 'object' && 'result' in cell) return String(cell.result ?? '')\n return String(cell)\n}\n\n/**\n * Get headers from CSV content\n */\nexport function getCsvHeaders(csvContent: string, delimiter?: CsvDelimiter): string[] {\n const lines = csvContent.trim().split(/\\r?\\n/)\n if (lines.length === 0) return []\n const delim = delimiter ?? detectDelimiter(csvContent)\n return parseCsvRow(lines[0], delim)\n}\n\n/**\n * Find column index by name (case-insensitive), falling back to \"url\"\n */\nexport function findColumnIndex(headers: string[], column?: string): number {\n const headersLower = headers.map((h) => h.toLowerCase())\n\n if (column) {\n let columnIndex = headersLower.indexOf(column.toLowerCase())\n if (columnIndex !== -1) return columnIndex\n columnIndex = headers.indexOf(column)\n if (columnIndex !== -1) return columnIndex\n }\n\n return headersLower.findIndex((h) => h === 'url')\n}\n\nexport interface ParsedUrlItem {\n url: string\n path: string\n valid: boolean\n error?: string\n}\n\n/**\n * Validate a URL - customizable validator\n */\nexport type UrlValidator = (url: string) => { valid: boolean; error?: string }\n\nexport const defaultUrlValidator: UrlValidator = (url: string) => {\n try {\n const parsed = new URL(url)\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n return { valid: false, error: 'URL must use http or https protocol' }\n }\n return { valid: true }\n } catch {\n return { valid: false, error: 'Invalid URL format' }\n }\n}\n\nexport const sirvUrlValidator: UrlValidator = (url: string) => {\n // Match standard Sirv URL: https://{alias}.sirv.com/{path}\n const sirvMatch = url.match(/^https?:\\/\\/([^.]+)\\.sirv\\.com(\\/[^?#]+)/)\n if (sirvMatch) {\n return { valid: true }\n }\n\n // Match URLs with image extension\n const imageMatch = url.match(\n /^https?:\\/\\/[^/]+(\\/[^?#]+\\.(jpe?g|png|gif|webp|avif|bmp|tiff?))$/i\n )\n if (imageMatch) {\n return { valid: true }\n }\n\n return { valid: false, error: 'Not a valid Sirv or image URL' }\n}\n\n/**\n * Parse Excel buffer in the browser\n * ExcelJS is dynamically imported to reduce initial bundle size\n */\nexport async function parseExcelArrayBuffer(arrayBuffer: ArrayBuffer): Promise<CellValue[][]> {\n const ExcelJS = await import('exceljs')\n const workbook = new ExcelJS.default.Workbook()\n await workbook.xlsx.load(arrayBuffer)\n\n const worksheet = workbook.worksheets[0]\n if (!worksheet) return []\n\n const rows: CellValue[][] = []\n worksheet.eachRow((row) => {\n const values = row.values as CellValue[]\n rows.push(values.slice(1)) // Remove undefined first element (1-indexed)\n })\n\n return rows\n}\n\n/**\n * Get headers from Excel rows\n */\nexport function getExcelHeaders(rows: CellValue[][]): string[] {\n if (rows.length === 0) return []\n return rows[0].map((cell, i) => cellToString(cell) || `Column ${i + 1}`)\n}\n\n/**\n * Get sample rows from Excel\n */\nexport function getExcelSampleRows(rows: CellValue[][], urlColumnIndex: number): string[][] {\n if (rows.length < 2) return []\n\n const sampleRows: string[][] = []\n\n for (let i = 1; i < rows.length && sampleRows.length < 3; i++) {\n const urlCell = cellToString(rows[i][urlColumnIndex]).trim()\n if (urlCell && urlCell.length > 0) {\n sampleRows.push(rows[i].map((cell) => cellToString(cell)))\n }\n }\n\n if (sampleRows.length === 0) {\n return rows.slice(1, 4).map((row) => row.map((cell) => cellToString(cell)))\n }\n\n return sampleRows\n}\n\n/**\n * Get sample rows from CSV\n */\nexport function getCsvSampleRows(\n lines: string[],\n urlColumnIndex: number,\n delimiter: CsvDelimiter = ','\n): string[][] {\n if (lines.length < 2) return []\n\n const sampleRows: string[][] = []\n\n for (let i = 1; i < lines.length && sampleRows.length < 3; i++) {\n const row = parseCsvRow(lines[i], delimiter)\n const urlCell = row[urlColumnIndex]?.trim()\n if (urlCell && urlCell.length > 0) {\n sampleRows.push(row)\n }\n }\n\n if (sampleRows.length === 0) {\n for (let i = 1; i <= Math.min(3, lines.length - 1); i++) {\n sampleRows.push(parseCsvRow(lines[i], delimiter))\n }\n }\n\n return sampleRows\n}\n\n/**\n * Estimate image count in an Excel column\n */\nexport function estimateExcelImageCount(rows: CellValue[][], columnIndex: number): number {\n if (rows.length < 2 || columnIndex < 0) return rows.length - 1\n\n let count = 0\n for (let i = 1; i < rows.length; i++) {\n const cellValue = cellToString(rows[i][columnIndex]).trim()\n if (cellValue) {\n count += splitMultipleUrls(cellValue).length\n }\n }\n return count || rows.length - 1\n}\n\n/**\n * Estimate image count in a CSV column\n */\nexport function estimateCsvImageCount(\n lines: string[],\n columnIndex: number,\n delimiter: CsvDelimiter = ','\n): number {\n if (lines.length < 2 || columnIndex < 0) return lines.length - 1\n\n let count = 0\n for (let i = 1; i < lines.length; i++) {\n const values = parseCsvRow(lines[i], delimiter)\n const cellValue = values[columnIndex]?.trim()\n if (cellValue) {\n count += splitMultipleUrls(cellValue).length\n }\n }\n return count || lines.length - 1\n}\n\nexport interface ClientParseResult {\n headers: string[]\n sampleRows: string[][]\n rowCount: number\n estimatedImageCounts: number[]\n urls: ParsedUrlItem[]\n validCount: number\n invalidCount: number\n totalCount: number\n}\n\nexport interface ParseOptions {\n column?: string\n previewOnly?: boolean\n validator?: UrlValidator\n}\n\n/**\n * Parse CSV content client-side with preview and URL extraction\n */\nexport function parseCsvClient(\n csvContent: string,\n options: ParseOptions = {}\n): ClientParseResult {\n const { validator = defaultUrlValidator } = options\n const lines = csvContent.trim().split(/\\r?\\n/)\n const delimiter = detectDelimiter(csvContent)\n const headers = getCsvHeaders(csvContent, delimiter)\n const rowCount = lines.length - 1\n const headersLower = headers.map((h) => h.toLowerCase())\n\n // Find likely URL column\n let urlColumnIndex = headersLower.findIndex(\n (h) => h === 'url' || h === 'image' || h === 'images' || h === 'image_url'\n )\n if (urlColumnIndex === -1) {\n for (let col = 0; col < headers.length && urlColumnIndex === -1; col++) {\n for (let row = 1; row < Math.min(100, lines.length); row++) {\n const values = parseCsvRow(lines[row], delimiter)\n const cell = values[col]?.trim()\n if (cell && cell.startsWith('http')) {\n urlColumnIndex = col\n break\n }\n }\n }\n }\n if (urlColumnIndex === -1) urlColumnIndex = 0\n\n const sampleRows = getCsvSampleRows(lines, urlColumnIndex, delimiter)\n const estimatedImageCounts = headers.map((_, colIndex) =>\n estimateCsvImageCount(lines, colIndex, delimiter)\n )\n\n if (options.previewOnly) {\n return {\n headers,\n sampleRows,\n rowCount,\n estimatedImageCounts,\n urls: [],\n validCount: 0,\n invalidCount: 0,\n totalCount: 0,\n }\n }\n\n const columnIndex = findColumnIndex(headers, options.column)\n if (columnIndex === -1) {\n throw new Error('Column not found in CSV')\n }\n\n const urls: ParsedUrlItem[] = []\n for (let i = 1; i < lines.length; i++) {\n const values = parseCsvRow(lines[i], delimiter)\n const cellValue = values[columnIndex]?.trim()\n if (cellValue) {\n for (const url of splitMultipleUrls(cellValue)) {\n const validation = validator(url)\n urls.push({\n url,\n path: extractPathFromUrl(url),\n valid: validation.valid,\n error: validation.error,\n })\n }\n }\n }\n\n const validCount = urls.filter((u) => u.valid).length\n\n return {\n headers,\n sampleRows,\n rowCount,\n estimatedImageCounts,\n urls,\n validCount,\n invalidCount: urls.length - validCount,\n totalCount: urls.length,\n }\n}\n\n/**\n * Parse Excel file client-side with preview and URL extraction\n */\nexport async function parseExcelClient(\n arrayBuffer: ArrayBuffer,\n options: ParseOptions = {}\n): Promise<ClientParseResult> {\n const { validator = defaultUrlValidator } = options\n const rows = await parseExcelArrayBuffer(arrayBuffer)\n const headers = getExcelHeaders(rows)\n const rowCount = rows.length - 1\n const headersLower = headers.map((h) => h.toLowerCase())\n\n // Find likely URL column\n let urlColumnIndex = headersLower.findIndex(\n (h) => h === 'url' || h === 'image' || h === 'images' || h === 'image_url'\n )\n if (urlColumnIndex === -1) {\n for (let col = 0; col < headers.length && urlColumnIndex === -1; col++) {\n for (let row = 1; row < Math.min(100, rows.length); row++) {\n const cell = cellToString(rows[row][col]).trim()\n if (cell && cell.startsWith('http')) {\n urlColumnIndex = col\n break\n }\n }\n }\n }\n if (urlColumnIndex === -1) urlColumnIndex = 0\n\n const sampleRows = getExcelSampleRows(rows, urlColumnIndex)\n const estimatedImageCounts = headers.map((_, colIndex) =>\n estimateExcelImageCount(rows, colIndex)\n )\n\n if (options.previewOnly) {\n return {\n headers,\n sampleRows,\n rowCount,\n estimatedImageCounts,\n urls: [],\n validCount: 0,\n invalidCount: 0,\n totalCount: 0,\n }\n }\n\n const columnIndex = findColumnIndex(headers, options.column)\n if (columnIndex === -1) {\n throw new Error('Column not found in Excel file')\n }\n\n const urls: ParsedUrlItem[] = []\n for (let i = 1; i < rows.length; i++) {\n const cellValue = cellToString(rows[i][columnIndex]).trim()\n if (cellValue) {\n for (const url of splitMultipleUrls(cellValue)) {\n const validation = validator(url)\n urls.push({\n url,\n path: extractPathFromUrl(url),\n valid: validation.valid,\n error: validation.error,\n })\n }\n }\n }\n\n const validCount = urls.filter((u) => u.valid).length\n\n return {\n headers,\n sampleRows,\n rowCount,\n estimatedImageCounts,\n urls,\n validCount,\n invalidCount: urls.length - validCount,\n totalCount: urls.length,\n }\n}\n\n/**\n * Detect if a file is a spreadsheet type\n */\nexport function isSpreadsheetFile(file: File): boolean {\n const ext = file.name.toLowerCase()\n return (\n ext.endsWith('.csv') ||\n ext.endsWith('.xlsx') ||\n ext.endsWith('.xls') ||\n ext.endsWith('.txt') ||\n file.type === 'text/csv' ||\n file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n file.type === 'application/vnd.ms-excel'\n )\n}\n","import { useCallback, useState, useRef } from 'react'\nimport clsx from 'clsx'\nimport {\n isImageFile,\n isHeifFile,\n convertHeicWithFallback,\n validateFileSize,\n generateId,\n getImageDimensions,\n ACCEPTED_IMAGE_FORMATS,\n} from '../utils/image-utils'\nimport { isSpreadsheetFile } from '../utils/csv-parser'\nimport type { SirvFile } from '../types'\n\nexport interface DropZoneProps {\n onFiles: (files: SirvFile[]) => void\n onSpreadsheet?: (file: File) => void\n accept?: string[]\n maxFiles?: number\n maxFileSize?: number\n disabled?: boolean\n compact?: boolean\n className?: string\n labels?: {\n dropzone?: string\n dropzoneHint?: string\n browse?: string\n }\n children?: React.ReactNode\n}\n\nexport function DropZone({\n onFiles,\n onSpreadsheet,\n accept = ['image/*'],\n maxFiles = 50,\n maxFileSize = 10 * 1024 * 1024,\n disabled = false,\n compact = false,\n className,\n labels = {},\n children,\n}: DropZoneProps) {\n const [isDragOver, setIsDragOver] = useState(false)\n const [isConverting, setIsConverting] = useState(false)\n const [convertingCount, setConvertingCount] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const processFiles = useCallback(\n async (fileList: FileList | File[]) => {\n const files = Array.from(fileList).slice(0, maxFiles)\n\n // Check for spreadsheet files\n const spreadsheetFile = files.find(isSpreadsheetFile)\n if (spreadsheetFile && onSpreadsheet) {\n onSpreadsheet(spreadsheetFile)\n return\n }\n\n // Filter to image files only\n const imageFiles = files.filter(isImageFile)\n if (imageFiles.length === 0) return\n\n // Check for HEIF files that need conversion\n const heifFiles = imageFiles.filter(isHeifFile)\n const regularFiles = imageFiles.filter((f) => !isHeifFile(f))\n\n setIsConverting(heifFiles.length > 0)\n setConvertingCount(heifFiles.length)\n\n const processedFiles: SirvFile[] = []\n\n // Process regular files\n for (const file of regularFiles) {\n const sizeValidation = validateFileSize(file, maxFileSize)\n if (!sizeValidation.valid) {\n processedFiles.push({\n id: generateId(),\n file,\n filename: file.name,\n previewUrl: '',\n status: 'error',\n progress: 0,\n error: sizeValidation.error,\n })\n continue\n }\n\n const dimensions = await getImageDimensions(file)\n processedFiles.push({\n id: generateId(),\n file,\n filename: file.name,\n previewUrl: URL.createObjectURL(file),\n dimensions: dimensions || undefined,\n size: file.size,\n status: 'pending',\n progress: 0,\n })\n }\n\n // Convert HEIF files\n for (const file of heifFiles) {\n try {\n const converted = await convertHeicWithFallback(file)\n const sizeValidation = validateFileSize(converted, maxFileSize)\n if (!sizeValidation.valid) {\n processedFiles.push({\n id: generateId(),\n file: converted,\n filename: converted.name,\n previewUrl: '',\n status: 'error',\n progress: 0,\n error: sizeValidation.error,\n })\n continue\n }\n\n const dimensions = await getImageDimensions(converted)\n processedFiles.push({\n id: generateId(),\n file: converted,\n filename: converted.name,\n previewUrl: URL.createObjectURL(converted),\n dimensions: dimensions || undefined,\n size: converted.size,\n status: 'pending',\n progress: 0,\n })\n } catch (err) {\n processedFiles.push({\n id: generateId(),\n file,\n filename: file.name,\n previewUrl: '',\n status: 'error',\n progress: 0,\n error: err instanceof Error ? err.message : 'Failed to convert HEIC file',\n })\n }\n setConvertingCount((c) => c - 1)\n }\n\n setIsConverting(false)\n setConvertingCount(0)\n\n if (processedFiles.length > 0) {\n onFiles(processedFiles)\n }\n },\n [maxFiles, maxFileSize, onFiles, onSpreadsheet]\n )\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!disabled) {\n setIsDragOver(true)\n }\n },\n [disabled]\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(false)\n\n if (disabled) return\n\n const { files } = e.dataTransfer\n if (files.length > 0) {\n await processFiles(files)\n }\n },\n [disabled, processFiles]\n )\n\n const handleChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target\n if (files && files.length > 0) {\n await processFiles(files)\n }\n // Reset input so same file can be selected again\n e.target.value = ''\n },\n [processFiles]\n )\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n inputRef.current?.click()\n }\n }, [disabled])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault()\n inputRef.current?.click()\n }\n },\n [disabled]\n )\n\n const acceptString = accept.join(',') || ACCEPTED_IMAGE_FORMATS\n\n return (\n <div\n className={clsx(\n 'sirv-dropzone',\n isDragOver && 'sirv-dropzone--drag-over',\n disabled && 'sirv-dropzone--disabled',\n compact && 'sirv-dropzone--compact',\n isConverting && 'sirv-dropzone--converting',\n className\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n aria-label={labels.dropzone || 'Drop files here or click to browse'}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={acceptString}\n multiple={maxFiles > 1}\n onChange={handleChange}\n disabled={disabled}\n className=\"sirv-dropzone__input\"\n aria-hidden=\"true\"\n />\n\n {children || (\n <div className=\"sirv-dropzone__content\">\n {isConverting ? (\n <>\n <div className=\"sirv-dropzone__spinner\" />\n <p className=\"sirv-dropzone__text\">\n Converting {convertingCount} HEIC file{convertingCount !== 1 ? 's' : ''}...\n </p>\n </>\n ) : (\n <>\n <svg\n className=\"sirv-dropzone__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\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 <p className=\"sirv-dropzone__text\">\n {labels.dropzone || 'Drop files here or click to browse'}\n </p>\n {!compact && (\n <p className=\"sirv-dropzone__hint\">\n {labels.dropzoneHint || 'Supports JPG, PNG, WebP, GIF, HEIC up to 10MB'}\n </p>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { formatFileSize } from '../utils/image-utils'\nimport type { SirvFile } from '../types'\n\nexport interface FileListProps {\n files: SirvFile[]\n onRemove?: (id: string) => void\n onRetry?: (id: string) => void\n showThumbnails?: boolean\n className?: string\n labels?: {\n retry?: string\n remove?: string\n uploading?: string\n processing?: string\n success?: string\n error?: string\n }\n}\n\nexport function FileList({\n files,\n onRemove,\n onRetry,\n showThumbnails = true,\n className,\n labels = {},\n}: FileListProps) {\n if (files.length === 0) return null\n\n return (\n <div className={clsx('sirv-filelist', className)}>\n {files.map((file) => (\n <FileItem\n key={file.id}\n file={file}\n onRemove={onRemove}\n onRetry={onRetry}\n showThumbnail={showThumbnails}\n labels={labels}\n />\n ))}\n </div>\n )\n}\n\ninterface FileItemProps {\n file: SirvFile\n onRemove?: (id: string) => void\n onRetry?: (id: string) => void\n showThumbnail?: boolean\n labels: FileListProps['labels']\n}\n\nfunction FileItem({ file, onRemove, onRetry, showThumbnail, labels = {} }: FileItemProps) {\n const statusText = {\n pending: '',\n uploading: labels.uploading || 'Uploading...',\n processing: labels.processing || 'Processing...',\n success: labels.success || 'Uploaded',\n error: labels.error || 'Failed',\n conflict: 'Conflict',\n }\n\n return (\n <div\n className={clsx(\n 'sirv-filelist__item',\n `sirv-filelist__item--${file.status}`,\n file.error && 'sirv-filelist__item--has-error'\n )}\n >\n {showThumbnail && file.previewUrl && (\n <div className=\"sirv-filelist__thumbnail\">\n <img src={file.previewUrl} alt=\"\" />\n </div>\n )}\n\n <div className=\"sirv-filelist__info\">\n <div className=\"sirv-filelist__name\" title={file.filename}>\n {file.filename}\n </div>\n <div className=\"sirv-filelist__meta\">\n {file.size && <span className=\"sirv-filelist__size\">{formatFileSize(file.size)}</span>}\n {file.dimensions && (\n <span className=\"sirv-filelist__dimensions\">\n {file.dimensions.width} × {file.dimensions.height}\n </span>\n )}\n {file.status !== 'pending' && (\n <span className={`sirv-filelist__status sirv-filelist__status--${file.status}`}>\n {statusText[file.status]}\n </span>\n )}\n </div>\n {file.error && <div className=\"sirv-filelist__error\">{file.error}</div>}\n </div>\n\n {/* Progress bar */}\n {(file.status === 'uploading' || file.status === 'processing') && (\n <div className=\"sirv-filelist__progress\">\n <div\n className=\"sirv-filelist__progress-bar\"\n style={{ width: `${file.progress}%` }}\n />\n </div>\n )}\n\n {/* Actions */}\n <div className=\"sirv-filelist__actions\">\n {file.status === 'error' && onRetry && (\n <button\n type=\"button\"\n className=\"sirv-filelist__action sirv-filelist__action--retry\"\n onClick={() => onRetry(file.id)}\n aria-label={labels.retry || 'Retry upload'}\n title={labels.retry || 'Retry'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 4v6h6\" />\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" />\n </svg>\n </button>\n )}\n {onRemove && file.status !== 'uploading' && (\n <button\n type=\"button\"\n className=\"sirv-filelist__action sirv-filelist__action--remove\"\n onClick={() => onRemove(file.id)}\n aria-label={labels.remove || 'Remove file'}\n title={labels.remove || 'Remove'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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 {file.status === 'success' && (\n <span className=\"sirv-filelist__check\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n )}\n </div>\n </div>\n )\n}\n\nexport interface FileListSummaryProps {\n files: SirvFile[]\n className?: string\n}\n\nexport function FileListSummary({ files, className }: FileListSummaryProps) {\n const pending = files.filter((f) => f.status === 'pending').length\n const uploading = files.filter((f) => f.status === 'uploading' || f.status === 'processing').length\n const success = files.filter((f) => f.status === 'success').length\n const error = files.filter((f) => f.status === 'error').length\n\n if (files.length === 0) return null\n\n return (\n <div className={clsx('sirv-filelist-summary', className)}>\n <span className=\"sirv-filelist-summary__total\">{files.length} files</span>\n {pending > 0 && <span className=\"sirv-filelist-summary__pending\">{pending} pending</span>}\n {uploading > 0 && (\n <span className=\"sirv-filelist-summary__uploading\">{uploading} uploading</span>\n )}\n {success > 0 && <span className=\"sirv-filelist-summary__success\">{success} uploaded</span>}\n {error > 0 && <span className=\"sirv-filelist-summary__error\">{error} failed</span>}\n </div>\n )\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport clsx from 'clsx'\nimport { formatFileSize } from '../utils/image-utils'\nimport type { BrowseItem, BrowseResponse } from '../types'\n\nexport interface FilePickerProps {\n endpoint: string\n isOpen: boolean\n onClose: () => void\n onSelect: (items: BrowseItem[]) => void\n fileType?: 'image' | 'video' | 'all'\n multiple?: boolean\n initialPath?: string\n className?: string\n labels?: {\n title?: string\n select?: string\n cancel?: string\n search?: string\n empty?: string\n loading?: string\n error?: string\n }\n}\n\nexport function FilePicker({\n endpoint,\n isOpen,\n onClose,\n onSelect,\n fileType = 'image',\n multiple = false,\n initialPath = '/',\n className,\n labels = {},\n}: FilePickerProps) {\n const [currentPath, setCurrentPath] = useState(initialPath)\n const [items, setItems] = useState<BrowseItem[]>([])\n const [selectedItems, setSelectedItems] = useState<BrowseItem[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n const fetchItems = useCallback(\n async (path: string, search?: string) => {\n setIsLoading(true)\n setError(null)\n\n try {\n const params = new URLSearchParams({ path })\n if (fileType !== 'all') params.set('type', fileType)\n if (search) params.set('search', search)\n\n const response = await fetch(`${endpoint}/browse?${params}`)\n if (!response.ok) {\n throw new Error(`Failed to load files: ${response.status}`)\n }\n\n const data: BrowseResponse = await response.json()\n if (!data.success) {\n throw new Error(data.error || 'Failed to load files')\n }\n\n setItems(data.items || [])\n setCurrentPath(data.path)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load files')\n setItems([])\n } finally {\n setIsLoading(false)\n }\n },\n [endpoint, fileType]\n )\n\n // Load initial path when opened\n useEffect(() => {\n if (isOpen) {\n setSelectedItems([])\n setSearchQuery('')\n fetchItems(initialPath)\n }\n }, [isOpen, initialPath, fetchItems])\n\n // Debounced search\n useEffect(() => {\n if (!isOpen) return\n\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current)\n }\n\n searchTimeoutRef.current = setTimeout(() => {\n fetchItems(currentPath, searchQuery || undefined)\n }, 300)\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current)\n }\n }\n }, [searchQuery, currentPath, isOpen, fetchItems])\n\n const handleNavigate = useCallback((path: string) => {\n setSearchQuery('')\n setCurrentPath(path)\n }, [])\n\n const handleGoUp = useCallback(() => {\n const parentPath = currentPath.split('/').slice(0, -1).join('/') || '/'\n handleNavigate(parentPath)\n }, [currentPath, handleNavigate])\n\n const handleItemClick = useCallback(\n (item: BrowseItem) => {\n if (item.type === 'folder') {\n handleNavigate(item.path)\n return\n }\n\n // File selection\n if (multiple) {\n setSelectedItems((prev) => {\n const isSelected = prev.some((i) => i.path === item.path)\n if (isSelected) {\n return prev.filter((i) => i.path !== item.path)\n }\n return [...prev, item]\n })\n } else {\n setSelectedItems([item])\n }\n },\n [multiple, handleNavigate]\n )\n\n const handleSelect = useCallback(() => {\n if (selectedItems.length > 0) {\n onSelect(selectedItems)\n onClose()\n }\n }, [selectedItems, onSelect, onClose])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n },\n [onClose]\n )\n\n // Build breadcrumb parts\n const breadcrumbs = currentPath.split('/').filter(Boolean)\n\n if (!isOpen) return null\n\n return (\n <div\n className={clsx('sirv-filepicker-overlay', className)}\n onClick={onClose}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={labels.title || 'Select files from Sirv'}\n >\n <div className=\"sirv-filepicker\" onClick={(e) => e.stopPropagation()}>\n {/* Header */}\n <div className=\"sirv-filepicker__header\">\n <h2 className=\"sirv-filepicker__title\">{labels.title || 'Select from Sirv'}</h2>\n <button\n type=\"button\"\n className=\"sirv-filepicker__close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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 </div>\n\n {/* Breadcrumbs & Search */}\n <div className=\"sirv-filepicker__toolbar\">\n <div className=\"sirv-filepicker__breadcrumbs\">\n <button\n type=\"button\"\n className=\"sirv-filepicker__breadcrumb\"\n onClick={() => handleNavigate('/')}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n </button>\n {breadcrumbs.map((part, index) => (\n <span key={index}>\n <span className=\"sirv-filepicker__breadcrumb-separator\">/</span>\n <button\n type=\"button\"\n className=\"sirv-filepicker__breadcrumb\"\n onClick={() => handleNavigate('/' + breadcrumbs.slice(0, index + 1).join('/'))}\n >\n {part}\n </button>\n </span>\n ))}\n </div>\n\n <div className=\"sirv-filepicker__search\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={labels.search || 'Search...'}\n className=\"sirv-filepicker__search-input\"\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"sirv-filepicker__content\">\n {isLoading ? (\n <div className=\"sirv-filepicker__loading\">\n <div className=\"sirv-filepicker__spinner\" />\n <p>{labels.loading || 'Loading...'}</p>\n </div>\n ) : error ? (\n <div className=\"sirv-filepicker__error\">\n <p>{error}</p>\n <button type=\"button\" onClick={() => fetchItems(currentPath)}>\n Retry\n </button>\n </div>\n ) : items.length === 0 ? (\n <div className=\"sirv-filepicker__empty\">\n <p>{labels.empty || 'No files found'}</p>\n </div>\n ) : (\n <div className=\"sirv-filepicker__grid\">\n {/* Up button */}\n {currentPath !== '/' && (\n <button\n type=\"button\"\n className=\"sirv-filepicker__item sirv-filepicker__item--folder\"\n onClick={handleGoUp}\n >\n <div className=\"sirv-filepicker__item-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </div>\n <div className=\"sirv-filepicker__item-name\">..</div>\n </button>\n )}\n\n {/* Items */}\n {items.map((item) => {\n const isSelected = selectedItems.some((i) => i.path === item.path)\n return (\n <button\n type=\"button\"\n key={item.path}\n className={clsx(\n 'sirv-filepicker__item',\n `sirv-filepicker__item--${item.type}`,\n isSelected && 'sirv-filepicker__item--selected'\n )}\n onClick={() => handleItemClick(item)}\n >\n {item.type === 'folder' ? (\n <div className=\"sirv-filepicker__item-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n </div>\n ) : item.thumbnail ? (\n <div className=\"sirv-filepicker__item-thumbnail\">\n <img src={item.thumbnail} alt=\"\" />\n </div>\n ) : (\n <div className=\"sirv-filepicker__item-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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 </div>\n )}\n <div className=\"sirv-filepicker__item-name\" title={item.name}>\n {item.name}\n </div>\n {item.size && (\n <div className=\"sirv-filepicker__item-size\">{formatFileSize(item.size)}</div>\n )}\n {isSelected && (\n <div className=\"sirv-filepicker__item-check\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"sirv-filepicker__footer\">\n <span className=\"sirv-filepicker__selection-count\">\n {selectedItems.length > 0\n ? `${selectedItems.length} file${selectedItems.length !== 1 ? 's' : ''} selected`\n : 'No files selected'}\n </span>\n <div className=\"sirv-filepicker__actions\">\n <button type=\"button\" className=\"sirv-filepicker__btn\" onClick={onClose}>\n {labels.cancel || 'Cancel'}\n </button>\n <button\n type=\"button\"\n className=\"sirv-filepicker__btn sirv-filepicker__btn--primary\"\n onClick={handleSelect}\n disabled={selectedItems.length === 0}\n >\n {labels.select || 'Select'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { useState, useCallback, useRef } from 'react'\nimport clsx from 'clsx'\nimport {\n parseCsvClient,\n parseExcelClient,\n isSpreadsheetFile,\n type ClientParseResult,\n} from '../utils/csv-parser'\n\nexport interface SpreadsheetImportProps {\n onUrls: (urls: string[]) => void\n className?: string\n labels?: {\n drop?: string\n hint?: string\n validUrls?: string\n invalidUrls?: string\n import?: string\n clear?: string\n }\n}\n\nexport function SpreadsheetImport({\n onUrls,\n className,\n labels = {},\n}: SpreadsheetImportProps) {\n const [isDragOver, setIsDragOver] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<ClientParseResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [selectedColumn, setSelectedColumn] = useState<string>('')\n const inputRef = useRef<HTMLInputElement>(null)\n\n const processFile = useCallback(async (file: File) => {\n setIsLoading(true)\n setError(null)\n setResult(null)\n\n try {\n let parseResult: ClientParseResult\n\n if (file.name.endsWith('.csv') || file.name.endsWith('.txt')) {\n const text = await file.text()\n parseResult = parseCsvClient(text, { previewOnly: true })\n } else if (file.name.endsWith('.xlsx') || file.name.endsWith('.xls')) {\n const buffer = await file.arrayBuffer()\n parseResult = await parseExcelClient(buffer, { previewOnly: true })\n } else {\n throw new Error('Unsupported file type. Please use CSV, XLSX, or TXT.')\n }\n\n setResult(parseResult)\n\n // Auto-select column with most URLs\n const maxIndex = parseResult.estimatedImageCounts.indexOf(\n Math.max(...parseResult.estimatedImageCounts)\n )\n if (maxIndex >= 0 && parseResult.headers[maxIndex]) {\n setSelectedColumn(parseResult.headers[maxIndex])\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to parse file')\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setIsDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setIsDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragOver(false)\n\n const file = e.dataTransfer.files[0]\n if (file && isSpreadsheetFile(file)) {\n await processFile(file)\n } else {\n setError('Please drop a CSV or Excel file')\n }\n },\n [processFile]\n )\n\n const handleChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n await processFile(file)\n }\n e.target.value = ''\n },\n [processFile]\n )\n\n const handleImport = useCallback(async () => {\n if (!result || !selectedColumn) return\n\n setIsLoading(true)\n try {\n // Re-parse with URL extraction\n // For now, use the URLs from the preview result\n // In a real implementation, we'd re-parse with the selected column\n const validUrls = result.urls.filter((u) => u.valid).map((u) => u.url)\n onUrls(validUrls)\n setResult(null)\n setSelectedColumn('')\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to import URLs')\n } finally {\n setIsLoading(false)\n }\n }, [result, selectedColumn, onUrls])\n\n const handleClear = useCallback(() => {\n setResult(null)\n setSelectedColumn('')\n setError(null)\n }, [])\n\n return (\n <div className={clsx('sirv-spreadsheet', className)}>\n {!result ? (\n <>\n <div\n className={clsx(\n 'sirv-spreadsheet__drop',\n isDragOver && 'sirv-spreadsheet__drop--active'\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n inputRef.current?.click()\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept=\".csv,.xlsx,.xls,.txt\"\n onChange={handleChange}\n style={{ display: 'none' }}\n />\n\n {isLoading ? (\n <div className=\"sirv-dropzone__spinner\" />\n ) : (\n <>\n <svg\n className=\"sirv-spreadsheet__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n <p className=\"sirv-spreadsheet__text\">\n {labels.drop || 'Drop CSV or Excel file here'}\n </p>\n <p className=\"sirv-spreadsheet__hint\">\n {labels.hint || 'File should contain a column with image URLs'}\n </p>\n </>\n )}\n </div>\n\n {error && (\n <div className=\"sirv-filelist__error\" style={{ padding: '8px 16px' }}>\n {error}\n </div>\n )}\n </>\n ) : (\n <div className=\"sirv-spreadsheet__preview\">\n {/* Column selector */}\n <div style={{ marginBottom: '12px' }}>\n <label style={{ display: 'block', marginBottom: '4px', fontWeight: 500 }}>\n Select URL column:\n </label>\n <select\n value={selectedColumn}\n onChange={(e) => setSelectedColumn(e.target.value)}\n style={{\n width: '100%',\n padding: '8px',\n borderRadius: '4px',\n border: '1px solid var(--sirv-border)',\n }}\n >\n <option value=\"\">Select a column</option>\n {result.headers.map((header, i) => (\n <option key={i} value={header}>\n {header} ({result.estimatedImageCounts[i]} URLs)\n </option>\n ))}\n </select>\n </div>\n\n {/* Preview table */}\n <table className=\"sirv-spreadsheet__table\">\n <thead>\n <tr>\n {result.headers.map((header, i) => (\n <th\n key={i}\n style={{\n background:\n header === selectedColumn\n ? 'var(--sirv-primary-light)'\n : undefined,\n }}\n >\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.sampleRows.slice(0, 3).map((row, i) => (\n <tr key={i}>\n {row.map((cell, j) => (\n <td\n key={j}\n style={{\n background:\n result.headers[j] === selectedColumn\n ? 'var(--sirv-primary-light)'\n : undefined,\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Stats */}\n <div className=\"sirv-spreadsheet__stats\">\n <span>Total rows: {result.rowCount}</span>\n {selectedColumn && (\n <>\n <span className=\"sirv-spreadsheet__stat--valid\">\n {labels.validUrls || 'Valid URLs'}:{' '}\n {result.estimatedImageCounts[result.headers.indexOf(selectedColumn)] || 0}\n </span>\n </>\n )}\n </div>\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: '8px', marginTop: '12px' }}>\n <button type=\"button\" className=\"sirv-btn\" onClick={handleClear}>\n {labels.clear || 'Clear'}\n </button>\n <button\n type=\"button\"\n className=\"sirv-btn sirv-btn--primary\"\n onClick={handleImport}\n disabled={!selectedColumn || isLoading}\n >\n {isLoading ? 'Importing...' : labels.import || 'Import URLs'}\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import { useState, useCallback, useRef } from 'react'\nimport { generateId, getMimeType } from '../utils/image-utils'\nimport type {\n SirvFile,\n UploadStatus,\n ConflictResolution,\n PresignResponse,\n UploadResponse,\n} from '../types'\n\nexport interface UseSirvUploadOptions {\n /** Endpoint to get presigned URLs (recommended) */\n presignEndpoint?: string\n /** Full proxy endpoint (alternative) */\n proxyEndpoint?: string\n /** Default upload folder */\n folder: string\n /** Conflict resolution strategy */\n onConflict: ConflictResolution | 'ask'\n /** Max concurrent uploads */\n concurrency: number\n /** Auto-upload on file add */\n autoUpload: boolean\n /** Max file size */\n maxFileSize: number\n /** Callback on successful uploads */\n onUpload?: (files: SirvFile[]) => void\n /** Callback on errors */\n onError?: (error: string, file?: SirvFile) => void\n}\n\nexport interface UseSirvUploadReturn {\n files: SirvFile[]\n addFiles: (newFiles: SirvFile[]) => void\n addUrls: (urls: string[]) => void\n removeFile: (id: string) => void\n clearFiles: () => void\n uploadAll: () => Promise<void>\n uploadFile: (id: string) => Promise<void>\n retryFile: (id: string) => Promise<void>\n cancelUpload: (id: string) => void\n progress: number\n isUploading: boolean\n isComplete: boolean\n}\n\nexport function useSirvUpload(options: UseSirvUploadOptions): UseSirvUploadReturn {\n const {\n presignEndpoint,\n proxyEndpoint,\n folder,\n onConflict,\n concurrency,\n autoUpload,\n onUpload,\n onError,\n } = options\n\n const [files, setFiles] = useState<SirvFile[]>([])\n const abortControllers = useRef<Map<string, AbortController>>(new Map())\n const uploadQueue = useRef<string[]>([])\n const activeUploads = useRef<number>(0)\n\n // Update a file's state\n const updateFile = useCallback((id: string, updates: Partial<SirvFile>) => {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...updates } : f))\n )\n }, [])\n\n // Upload using presigned URL (direct to Sirv S3)\n const uploadWithPresign = useCallback(\n async (file: SirvFile, signal: AbortSignal): Promise<void> => {\n if (!presignEndpoint) throw new Error('No presign endpoint configured')\n if (!file.file) throw new Error('No file data')\n\n // 1. Get presigned URL from user's backend\n const presignRes = await fetch(presignEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n filename: file.filename,\n contentType: getMimeType(file.file),\n folder,\n size: file.file.size,\n }),\n signal,\n })\n\n if (!presignRes.ok) {\n const err = await presignRes.json().catch(() => ({}))\n throw new Error(err.error || `Failed to get upload URL: ${presignRes.status}`)\n }\n\n const { uploadUrl, publicUrl, path, error }: PresignResponse = await presignRes.json()\n if (error) throw new Error(error)\n if (!uploadUrl) throw new Error('No upload URL returned')\n\n // 2. Upload directly to Sirv S3\n updateFile(file.id, { status: 'uploading', progress: 10 })\n\n const uploadRes = await fetch(uploadUrl, {\n method: 'PUT',\n body: file.file,\n headers: {\n 'Content-Type': getMimeType(file.file),\n },\n signal,\n })\n\n if (!uploadRes.ok) {\n throw new Error(`Upload failed: ${uploadRes.status}`)\n }\n\n // 3. Success\n updateFile(file.id, {\n status: 'success',\n progress: 100,\n sirvUrl: publicUrl,\n sirvPath: path,\n })\n },\n [presignEndpoint, folder, updateFile]\n )\n\n // Upload using proxy (file data goes through user's server)\n const uploadWithProxy = useCallback(\n async (file: SirvFile, signal: AbortSignal): Promise<void> => {\n if (!proxyEndpoint) throw new Error('No proxy endpoint configured')\n if (!file.file) throw new Error('No file data')\n\n updateFile(file.id, { status: 'uploading', progress: 10 })\n\n // Convert file to base64\n const arrayBuffer = await file.file.arrayBuffer()\n const base64 = btoa(\n new Uint8Array(arrayBuffer).reduce((data, byte) => data + String.fromCharCode(byte), '')\n )\n\n updateFile(file.id, { progress: 30 })\n\n const res = await fetch(`${proxyEndpoint}/upload`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n data: base64,\n filename: file.filename,\n folder,\n contentType: getMimeType(file.file),\n onConflict: onConflict === 'ask' ? 'rename' : onConflict,\n }),\n signal,\n })\n\n updateFile(file.id, { progress: 80 })\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}))\n throw new Error(err.error || `Upload failed: ${res.status}`)\n }\n\n const result: UploadResponse = await res.json()\n if (!result.success) {\n throw new Error(result.error || 'Upload failed')\n }\n\n updateFile(file.id, {\n status: 'success',\n progress: 100,\n sirvUrl: result.url,\n sirvPath: result.path,\n })\n },\n [proxyEndpoint, folder, onConflict, updateFile]\n )\n\n // Main upload function\n const uploadFile = useCallback(\n async (id: string): Promise<void> => {\n const file = files.find((f) => f.id === id)\n if (!file || file.status === 'uploading' || file.status === 'success') return\n\n const controller = new AbortController()\n abortControllers.current.set(id, controller)\n\n try {\n updateFile(id, { status: 'uploading', progress: 0, error: undefined })\n\n if (presignEndpoint) {\n await uploadWithPresign(file, controller.signal)\n } else if (proxyEndpoint) {\n await uploadWithProxy(file, controller.signal)\n } else {\n throw new Error('No upload endpoint configured')\n }\n\n // Notify success\n const updatedFile = files.find((f) => f.id === id)\n if (updatedFile && onUpload) {\n onUpload([{ ...updatedFile, status: 'success' }])\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n updateFile(id, { status: 'pending', progress: 0 })\n return\n }\n\n const errorMsg = err instanceof Error ? err.message : 'Upload failed'\n updateFile(id, { status: 'error', progress: 0, error: errorMsg })\n onError?.(errorMsg, file)\n } finally {\n abortControllers.current.delete(id)\n activeUploads.current--\n processQueue()\n }\n },\n [files, presignEndpoint, proxyEndpoint, uploadWithPresign, uploadWithProxy, updateFile, onUpload, onError]\n )\n\n // Process upload queue with concurrency limit\n const processQueue = useCallback(() => {\n while (activeUploads.current < concurrency && uploadQueue.current.length > 0) {\n const id = uploadQueue.current.shift()\n if (id) {\n activeUploads.current++\n uploadFile(id)\n }\n }\n }, [concurrency, uploadFile])\n\n // Upload all pending files\n const uploadAll = useCallback(async (): Promise<void> => {\n const pendingFiles = files.filter((f) => f.status === 'pending' || f.status === 'error')\n uploadQueue.current = pendingFiles.map((f) => f.id)\n processQueue()\n }, [files, processQueue])\n\n // Add files to the list\n const addFiles = useCallback(\n (newFiles: SirvFile[]) => {\n setFiles((prev) => [...prev, ...newFiles])\n\n if (autoUpload) {\n // Queue new files for upload\n uploadQueue.current.push(...newFiles.map((f) => f.id))\n processQueue()\n }\n },\n [autoUpload, processQueue]\n )\n\n // Add URLs (from CSV/spreadsheet)\n const addUrls = useCallback(\n (urls: string[]) => {\n const newFiles: SirvFile[] = urls.map((url) => {\n const filename = url.split('/').pop() || 'image.jpg'\n return {\n id: generateId(),\n filename,\n previewUrl: url,\n sirvUrl: url,\n status: 'success' as UploadStatus,\n progress: 100,\n }\n })\n\n setFiles((prev) => [...prev, ...newFiles])\n },\n []\n )\n\n // Remove a file\n const removeFile = useCallback((id: string) => {\n // Cancel if uploading\n const controller = abortControllers.current.get(id)\n if (controller) {\n controller.abort()\n }\n\n // Remove from queue\n uploadQueue.current = uploadQueue.current.filter((qid) => qid !== id)\n\n // Remove from list\n setFiles((prev) => prev.filter((f) => f.id !== id))\n }, [])\n\n // Clear all files\n const clearFiles = useCallback(() => {\n // Cancel all uploads\n abortControllers.current.forEach((controller) => controller.abort())\n abortControllers.current.clear()\n uploadQueue.current = []\n activeUploads.current = 0\n setFiles([])\n }, [])\n\n // Retry a failed upload\n const retryFile = useCallback(\n async (id: string): Promise<void> => {\n uploadQueue.current.push(id)\n processQueue()\n },\n [processQueue]\n )\n\n // Cancel an upload\n const cancelUpload = useCallback((id: string) => {\n const controller = abortControllers.current.get(id)\n if (controller) {\n controller.abort()\n }\n }, [])\n\n // Calculate overall progress\n const progress = files.length > 0\n ? Math.round(files.reduce((sum, f) => sum + f.progress, 0) / files.length)\n : 0\n\n const isUploading = files.some((f) => f.status === 'uploading' || f.status === 'processing')\n const isComplete = files.length > 0 && files.every((f) => f.status === 'success')\n\n return {\n files,\n addFiles,\n addUrls,\n removeFile,\n clearFiles,\n uploadAll,\n uploadFile,\n retryFile,\n cancelUpload,\n progress,\n isUploading,\n isComplete,\n }\n}\n","import { useState, useCallback } from 'react'\nimport clsx from 'clsx'\nimport { DropZone } from './DropZone'\nimport { FileList, FileListSummary } from './FileList'\nimport { FilePicker } from './FilePicker'\nimport { SpreadsheetImport } from './SpreadsheetImport'\nimport { useSirvUpload } from '../hooks/useSirvUpload'\nimport type { SirvUploaderProps, SirvFile, BrowseItem } from '../types'\nimport { generateId } from '../utils/image-utils'\n\ntype TabMode = 'upload' | 'urls'\n\nconst DEFAULT_LABELS = {\n dropzone: 'Drop files here or click to browse',\n dropzoneHint: 'Supports JPG, PNG, WebP, GIF, HEIC up to 10MB',\n browse: 'Browse',\n uploadFiles: 'Upload Files',\n importUrls: 'Import URLs',\n selectFromSirv: 'Select from Sirv',\n uploading: 'Uploading...',\n processing: 'Processing...',\n success: 'Uploaded',\n error: 'Failed',\n retry: 'Retry',\n remove: 'Remove',\n cancel: 'Cancel',\n overwrite: 'Overwrite',\n rename: 'Rename',\n skip: 'Skip',\n conflictTitle: 'File exists',\n conflictMessage: 'A file with this name already exists.',\n}\n\nexport function SirvUploader({\n presignEndpoint,\n proxyEndpoint,\n sirvAccount,\n folder = '/',\n onUpload,\n onError,\n onSelect,\n onRemove,\n features = {},\n maxFiles = 50,\n maxFileSize = 10 * 1024 * 1024,\n accept = ['image/*'],\n onConflict = 'rename',\n autoUpload = true,\n concurrency = 3,\n className,\n disabled = false,\n compact = false,\n labels: customLabels = {},\n children,\n}: SirvUploaderProps) {\n const labels = { ...DEFAULT_LABELS, ...customLabels }\n const {\n batch = true,\n csvImport = true,\n filePicker = true,\n dragDrop = true,\n } = features\n\n const [activeTab, setActiveTab] = useState<TabMode>('upload')\n const [isPickerOpen, setIsPickerOpen] = useState(false)\n\n // Validate configuration\n if (!presignEndpoint && !proxyEndpoint) {\n console.warn('SirvUploader: Either presignEndpoint or proxyEndpoint must be provided')\n }\n\n const upload = useSirvUpload({\n presignEndpoint,\n proxyEndpoint,\n folder,\n onConflict,\n concurrency,\n autoUpload,\n maxFileSize,\n onUpload,\n onError,\n })\n\n // Handle files from DropZone\n const handleFiles = useCallback(\n (files: SirvFile[]) => {\n upload.addFiles(files)\n onSelect?.(files)\n },\n [upload, onSelect]\n )\n\n // Handle spreadsheet file\n const handleSpreadsheet = useCallback(() => {\n setActiveTab('urls')\n }, [])\n\n // Handle URLs from spreadsheet\n const handleUrls = useCallback(\n (urls: string[]) => {\n upload.addUrls(urls)\n },\n [upload]\n )\n\n // Handle file picker selection\n const handlePickerSelect = useCallback(\n (items: BrowseItem[]) => {\n const files: SirvFile[] = items.map((item) => ({\n id: generateId(),\n filename: item.name,\n previewUrl: item.thumbnail || '',\n sirvUrl: `https://${sirvAccount}.sirv.com${item.path}`,\n sirvPath: item.path,\n size: item.size,\n status: 'success' as const,\n progress: 100,\n }))\n\n upload.addFiles(files)\n onSelect?.(files)\n },\n [sirvAccount, upload, onSelect]\n )\n\n // Handle file removal\n const handleRemove = useCallback(\n (id: string) => {\n const file = upload.files.find((f) => f.id === id)\n upload.removeFile(id)\n if (file) onRemove?.(file)\n },\n [upload, onRemove]\n )\n\n // Handle upload all\n const handleUploadAll = useCallback(() => {\n upload.uploadAll()\n }, [upload])\n\n // Handle clear all\n const handleClearAll = useCallback(() => {\n upload.clearFiles()\n }, [upload])\n\n const hasFiles = upload.files.length > 0\n const hasPendingFiles = upload.files.some((f) => f.status === 'pending' || f.status === 'error')\n const showTabs = csvImport && batch\n\n // Determine browse endpoint\n const browseEndpoint = proxyEndpoint || (presignEndpoint ? presignEndpoint.replace(/\\/presign$/, '') : '')\n\n return (\n <div className={clsx('sirv-uploader', className)}>\n {/* Tabs */}\n {showTabs && (\n <div className=\"sirv-tabs\">\n <button\n type=\"button\"\n className={clsx('sirv-tabs__tab', activeTab === 'upload' && 'sirv-tabs__tab--active')}\n onClick={() => setActiveTab('upload')}\n >\n {labels.uploadFiles}\n </button>\n <button\n type=\"button\"\n className={clsx('sirv-tabs__tab', activeTab === 'urls' && 'sirv-tabs__tab--active')}\n onClick={() => setActiveTab('urls')}\n >\n {labels.importUrls}\n </button>\n </div>\n )}\n\n {/* Upload Tab */}\n {activeTab === 'upload' && (\n <>\n {dragDrop && (\n <DropZone\n onFiles={handleFiles}\n onSpreadsheet={csvImport ? handleSpreadsheet : undefined}\n accept={accept}\n maxFiles={batch ? maxFiles : 1}\n maxFileSize={maxFileSize}\n disabled={disabled}\n compact={compact}\n labels={{\n dropzone: labels.dropzone,\n dropzoneHint: labels.dropzoneHint,\n browse: labels.browse,\n }}\n >\n {children}\n </DropZone>\n )}\n\n {/* File List */}\n {hasFiles && (\n <FileList\n files={upload.files}\n onRemove={handleRemove}\n onRetry={upload.retryFile}\n labels={{\n retry: labels.retry,\n remove: labels.remove,\n uploading: labels.uploading,\n processing: labels.processing,\n success: labels.success,\n error: labels.error,\n }}\n />\n )}\n </>\n )}\n\n {/* URLs Tab */}\n {activeTab === 'urls' && csvImport && (\n <SpreadsheetImport onUrls={handleUrls} />\n )}\n\n {/* Toolbar */}\n {(hasFiles || filePicker) && (\n <div className=\"sirv-uploader__toolbar\">\n <div className=\"sirv-uploader__toolbar-left\">\n {filePicker && browseEndpoint && (\n <button\n type=\"button\"\n className=\"sirv-btn\"\n onClick={() => setIsPickerOpen(true)}\n disabled={disabled}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n {labels.selectFromSirv}\n </button>\n )}\n </div>\n\n <div className=\"sirv-uploader__toolbar-right\">\n {hasFiles && (\n <button\n type=\"button\"\n className=\"sirv-btn\"\n onClick={handleClearAll}\n disabled={disabled || upload.isUploading}\n >\n Clear All\n </button>\n )}\n {hasPendingFiles && !autoUpload && (\n <button\n type=\"button\"\n className=\"sirv-btn sirv-btn--primary\"\n onClick={handleUploadAll}\n disabled={disabled || upload.isUploading}\n >\n {upload.isUploading ? labels.uploading : 'Upload All'}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Summary */}\n {hasFiles && <FileListSummary files={upload.files} />}\n\n {/* File Picker Modal */}\n {filePicker && browseEndpoint && (\n <FilePicker\n endpoint={browseEndpoint}\n isOpen={isPickerOpen}\n onClose={() => setIsPickerOpen(false)}\n onSelect={handlePickerSelect}\n multiple={batch}\n initialPath={folder}\n labels={{\n title: labels.selectFromSirv,\n cancel: labels.cancel,\n }}\n />\n )}\n </div>\n )\n}\n"]}