{"version":3,"sources":["../src/lib/use-upload.ts","../src/file-upload/file-upload.tsx"],"names":["useState","useCallback","uploadFile","generateId","cva","React","jsxs","cn","jsx","Upload","formatBytes","CheckCircle","XCircle","File","RefreshCw","X"],"mappings":"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","file":"chunk-SKAQRB6T.cjs","sourcesContent":["import { useCallback, useState } from \"react\";\nimport type { UploadConfig, UploadFile, UploadHandler, UploadStatus } from \"./types\";\nimport { generateId } from \"./utils\";\n\ninterface UseUploadOptions extends UploadConfig {\n  handler: UploadHandler;\n}\n\ninterface UseUploadReturn {\n  files: UploadFile[];\n  isUploading: boolean;\n  addFiles: (files: File[]) => void;\n  removeFile: (id: string) => void;\n  retryFile: (id: string) => void;\n  clearFiles: () => void;\n  clearCompleted: () => void;\n}\n\nexport function useUpload(options: UseUploadOptions): UseUploadReturn {\n  const {\n    handler,\n    maxSize = 10 * 1024 * 1024,\n    maxFiles = 10,\n    accept,\n  } = options;\n\n  const [files, setFiles] = useState<UploadFile[]>([]);\n\n  const updateFile = useCallback(\n    (id: string, updates: Partial<UploadFile>) => {\n      setFiles((prev) =>\n        prev.map((f) => (f.id === id ? { ...f, ...updates } : f))\n      );\n    },\n    []\n  );\n\n  const uploadFile = useCallback(\n    async (uploadFile: UploadFile) => {\n      const { file, id } = uploadFile;\n\n      try {\n        // Validate file size\n        if (file.size > maxSize) {\n          updateFile(id, {\n            status: \"error\",\n            error: `File too large. Maximum size is ${Math.round(maxSize / 1024 / 1024)}MB`,\n          });\n          return;\n        }\n\n        // Update status to uploading\n        updateFile(id, { status: \"uploading\" });\n\n        // Get presigned URL\n        const { uploadUrl, assetId } = await handler.getUploadUrl(file);\n\n        // Upload to presigned URL with progress tracking\n        await new Promise<void>((resolve, reject) => {\n          const xhr = new XMLHttpRequest();\n\n          xhr.upload.onprogress = (e) => {\n            if (e.lengthComputable) {\n              const progress = Math.round((e.loaded / e.total) * 100);\n              updateFile(id, { progress });\n            }\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\n          xhr.onerror = () => reject(new Error(\"Upload failed\"));\n          xhr.ontimeout = () => reject(new Error(\"Upload timed out\"));\n\n          xhr.open(\"PUT\", uploadUrl);\n          xhr.setRequestHeader(\n            \"Content-Type\",\n            file.type || \"application/octet-stream\"\n          );\n          xhr.send(file);\n        });\n\n        // Update status to processing\n        updateFile(id, { status: \"processing\", progress: 100, assetId });\n\n        // Confirm upload if handler provided\n        let finalUrl: string | undefined;\n        if (handler.onUploadComplete && assetId) {\n          const result = await handler.onUploadComplete(assetId, file);\n          finalUrl = result.url;\n        }\n\n        // Update status to complete\n        updateFile(id, { status: \"complete\", url: finalUrl });\n      } catch (error) {\n        const errorMessage =\n          error instanceof Error ? error.message : \"Upload failed\";\n        updateFile(id, { status: \"error\", error: errorMessage });\n        handler.onError?.(\n          error instanceof Error ? error : new Error(errorMessage),\n          file\n        );\n      }\n    },\n    [handler, maxSize, updateFile]\n  );\n\n  const addFiles = useCallback(\n    (newFiles: File[]) => {\n      // Filter files based on accept types\n      let filesToAdd = newFiles;\n\n      if (accept && accept.length > 0) {\n        filesToAdd = newFiles.filter((file) => {\n          return accept.some((type) => {\n            if (type.startsWith(\".\")) {\n              return file.name.toLowerCase().endsWith(type.toLowerCase());\n            }\n            if (type.endsWith(\"/*\")) {\n              return file.type.startsWith(type.slice(0, -1));\n            }\n            return file.type === type;\n          });\n        });\n      }\n\n      // Limit number of files\n      const currentCount = files.length;\n      const availableSlots = maxFiles - currentCount;\n      filesToAdd = filesToAdd.slice(0, availableSlots);\n\n      if (filesToAdd.length === 0) return;\n\n      const uploadFiles: UploadFile[] = filesToAdd.map((file) => ({\n        id: generateId(),\n        file,\n        progress: 0,\n        status: \"pending\" as UploadStatus,\n      }));\n\n      setFiles((prev) => [...prev, ...uploadFiles]);\n\n      // Start uploading each file\n      for (const fileToUpload of uploadFiles) {\n        void uploadFile(fileToUpload);\n      }\n    },\n    [accept, files.length, maxFiles, uploadFile]\n  );\n\n  const removeFile = useCallback((id: string) => {\n    setFiles((prev) => prev.filter((f) => f.id !== id));\n  }, []);\n\n  const retryFile = useCallback(\n    (id: string) => {\n      const file = files.find((f) => f.id === id);\n      if (file && file.status === \"error\") {\n        const newFile: UploadFile = {\n          ...file,\n          progress: 0,\n          status: \"pending\",\n          error: undefined,\n        };\n        setFiles((prev) =>\n          prev.map((f) => (f.id === id ? newFile : f))\n        );\n        void uploadFile(newFile);\n      }\n    },\n    [files, uploadFile]\n  );\n\n  const clearFiles = useCallback(() => {\n    setFiles([]);\n  }, []);\n\n  const clearCompleted = useCallback(() => {\n    setFiles((prev) => prev.filter((f) => f.status !== \"complete\"));\n  }, []);\n\n  const isUploading = files.some(\n    (f) => f.status === \"uploading\" || f.status === \"processing\"\n  );\n\n  return {\n    files,\n    isUploading,\n    addFiles,\n    removeFile,\n    retryFile,\n    clearFiles,\n    clearCompleted,\n  };\n}\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { CheckCircle, File, RefreshCw, Upload, X, XCircle } from \"lucide-react\";\nimport * as React from \"react\";\nimport type { UploadConfig, UploadFile, UploadHandler } from \"../lib/types\";\nimport { useUpload } from \"../lib/use-upload\";\nimport { cn, formatBytes } from \"../lib/utils\";\n\nconst dropzoneVariants = cva(\"relative rounded-lg border-2 border-dashed transition-colors cursor-pointer\", {\n  variants: {\n    variant: {\n      default: \"border-muted-foreground/25 hover:border-muted-foreground/50\",\n      active: \"border-primary bg-primary/5\",\n      error: \"border-destructive bg-destructive/5\",\n    },\n    size: {\n      sm: \"p-4\",\n      default: \"p-6\",\n      lg: \"p-8\",\n    },\n  },\n  defaultVariants: {\n    variant: \"default\",\n    size: \"default\",\n  },\n});\n\nconst progressVariants = cva(\"h-1 rounded-full transition-all\", {\n  variants: {\n    status: {\n      uploading: \"bg-primary\",\n      processing: \"bg-primary animate-pulse\",\n      complete: \"bg-green-500\",\n      error: \"bg-destructive\",\n      pending: \"bg-muted\",\n      idle: \"bg-muted\",\n    },\n  },\n  defaultVariants: {\n    status: \"pending\",\n  },\n});\n\nexport interface FileUploadProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">,\n    VariantProps<typeof dropzoneVariants> {\n  /**\n   * Upload handler configuration\n   */\n  handler: UploadHandler;\n  /**\n   * Upload configuration (max size, accepted types, etc.)\n   */\n  config?: UploadConfig;\n  /**\n   * Called when files change (added, removed, status changed)\n   */\n  onChange?: (files: UploadFile[]) => void;\n  /**\n   * Called when all uploads complete\n   */\n  onComplete?: (files: UploadFile[]) => void;\n  /**\n   * Whether to show the file list\n   * @default true\n   */\n  showFileList?: boolean;\n  /**\n   * Custom dropzone content\n   */\n  children?: React.ReactNode;\n  /**\n   * Disabled state\n   */\n  disabled?: boolean;\n}\n\nexport function FileUpload({\n  handler,\n  config,\n  onChange,\n  onComplete,\n  showFileList = true,\n  children,\n  disabled = false,\n  className,\n  size,\n  ...props\n}: FileUploadProps) {\n  const [isDragging, setIsDragging] = React.useState(false);\n  const inputRef = React.useRef<HTMLInputElement>(null);\n\n  const { files, isUploading, addFiles, removeFile, retryFile, clearCompleted } = useUpload({\n    handler,\n    ...config,\n  });\n\n  // Track changes\n  const prevFilesRef = React.useRef<UploadFile[]>([]);\n  React.useEffect(() => {\n    if (JSON.stringify(files) !== JSON.stringify(prevFilesRef.current)) {\n      prevFilesRef.current = files;\n      onChange?.(files);\n\n      // Check if all uploads are complete\n      const allComplete = files.length > 0 && files.every((f) => f.status === \"complete\" || f.status === \"error\");\n      if (allComplete && !isUploading) {\n        onComplete?.(files);\n      }\n    }\n  }, [files, isUploading, onChange, onComplete]);\n\n  const handleDragOver = React.useCallback(\n    (e: React.DragEvent) => {\n      e.preventDefault();\n      if (!disabled) {\n        setIsDragging(true);\n      }\n    },\n    [disabled],\n  );\n\n  const handleDragLeave = React.useCallback((e: React.DragEvent) => {\n    e.preventDefault();\n    setIsDragging(false);\n  }, []);\n\n  const handleDrop = React.useCallback(\n    (e: React.DragEvent) => {\n      e.preventDefault();\n      setIsDragging(false);\n\n      if (disabled) return;\n\n      const droppedFiles = Array.from(e.dataTransfer.files);\n      addFiles(droppedFiles);\n    },\n    [addFiles, disabled],\n  );\n\n  const handleClick = React.useCallback(() => {\n    if (!disabled) {\n      inputRef.current?.click();\n    }\n  }, [disabled]);\n\n  const handleFileSelect = React.useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      const selectedFiles = Array.from(e.target.files || []);\n      addFiles(selectedFiles);\n      e.target.value = \"\";\n    },\n    [addFiles],\n  );\n\n  const acceptString = config?.accept?.join(\",\");\n\n  return (\n    <div className={cn(\"space-y-4\", className)} {...props}>\n      {/* Dropzone */}\n      <div\n        role=\"button\"\n        tabIndex={disabled ? -1 : 0}\n        onDragOver={handleDragOver}\n        onDragLeave={handleDragLeave}\n        onDrop={handleDrop}\n        onClick={handleClick}\n        onKeyDown={(e) => {\n          if (e.key === \"Enter\" || e.key === \" \") {\n            handleClick();\n          }\n        }}\n        className={cn(\n          dropzoneVariants({\n            variant: isDragging ? \"active\" : \"default\",\n            size,\n          }),\n          disabled && \"opacity-50 cursor-not-allowed\",\n          \"focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\",\n        )}\n      >\n        <input\n          ref={inputRef}\n          type=\"file\"\n          multiple={config?.maxFiles !== 1}\n          accept={acceptString}\n          onChange={handleFileSelect}\n          className=\"hidden\"\n          disabled={disabled}\n        />\n\n        {children || (\n          <div className=\"flex flex-col items-center justify-center text-center\">\n            <Upload className=\"h-10 w-10 text-muted-foreground mb-4\" />\n            <p className=\"text-sm text-muted-foreground mb-1\">\n              <span className=\"font-medium text-foreground\">Click to upload</span> or drag and drop\n            </p>\n            {config?.accept && <p className=\"text-xs text-muted-foreground\">{config.accept.join(\", \")}</p>}\n            {config?.maxSize && <p className=\"text-xs text-muted-foreground\">Max {formatBytes(config.maxSize)}</p>}\n          </div>\n        )}\n      </div>\n\n      {/* File list */}\n      {showFileList && files.length > 0 && (\n        <div className=\"space-y-2\">\n          {files.map((uploadFile) => (\n            <FileUploadItem\n              key={uploadFile.id}\n              file={uploadFile}\n              onRemove={() => removeFile(uploadFile.id)}\n              onRetry={() => retryFile(uploadFile.id)}\n            />\n          ))}\n\n          {/* Clear completed button */}\n          {files.some((f) => f.status === \"complete\") && (\n            <button\n              type=\"button\"\n              onClick={clearCompleted}\n              className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n            >\n              Clear completed\n            </button>\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n\ninterface FileUploadItemProps {\n  file: UploadFile;\n  onRemove: () => void;\n  onRetry: () => void;\n}\n\nfunction FileUploadItem({ file, onRemove, onRetry }: FileUploadItemProps) {\n  return (\n    <div className=\"flex items-center gap-3 p-3 rounded-lg bg-muted/50\">\n      {/* Icon */}\n      <div className=\"h-10 w-10 rounded bg-muted flex items-center justify-center flex-shrink-0\">\n        {file.status === \"complete\" ? (\n          <CheckCircle className=\"h-5 w-5 text-green-500\" />\n        ) : file.status === \"error\" ? (\n          <XCircle className=\"h-5 w-5 text-destructive\" />\n        ) : (\n          <File className=\"h-5 w-5 text-muted-foreground\" />\n        )}\n      </div>\n\n      {/* Info */}\n      <div className=\"flex-1 min-w-0\">\n        <div className=\"flex items-center justify-between gap-2\">\n          <span className=\"text-sm font-medium truncate\">{file.file.name}</span>\n          <span className=\"text-xs text-muted-foreground flex-shrink-0\">{formatBytes(file.file.size)}</span>\n        </div>\n\n        {/* Progress bar */}\n        {(file.status === \"uploading\" || file.status === \"processing\") && (\n          <div className=\"mt-2 h-1 w-full bg-muted rounded-full overflow-hidden\">\n            <div className={cn(progressVariants({ status: file.status }))} style={{ width: `${file.progress}%` }} />\n          </div>\n        )}\n\n        {/* Status text */}\n        {file.status === \"processing\" && <p className=\"text-xs text-muted-foreground mt-1\">Processing...</p>}\n\n        {file.status === \"error\" && <p className=\"text-xs text-destructive mt-1\">{file.error}</p>}\n      </div>\n\n      {/* Actions */}\n      <div className=\"flex items-center gap-1 flex-shrink-0\">\n        {file.status === \"error\" && (\n          <button\n            type=\"button\"\n            onClick={onRetry}\n            className=\"h-8 w-8 flex items-center justify-center rounded-md hover:bg-muted transition-colors\"\n          >\n            <RefreshCw className=\"h-4 w-4\" />\n          </button>\n        )}\n\n        {(file.status === \"pending\" || file.status === \"error\" || file.status === \"complete\") && (\n          <button\n            type=\"button\"\n            onClick={onRemove}\n            className=\"h-8 w-8 flex items-center justify-center rounded-md hover:bg-muted transition-colors\"\n          >\n            <X className=\"h-4 w-4\" />\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\nFileUpload.displayName = \"FileUpload\";\n"]}