@muhgholy/next-drive 3.12.0 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -16
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/index.cjs +1 -0
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.css +1 -59
- package/dist/client/index.css.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/package.json +8 -2
- package/dist/client/styles.css +0 -81
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/context.tsx","../../src/client/hooks/useUpload.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/dialog-fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/dialog.tsx","../../src/client/components/ui/dropdown-menu.tsx","../../src/client/components/ui/alert.tsx","../../src/client/components/ui/input.tsx","../../src/client/components/ui/label.tsx","../../src/client/components/dialog.tsx","../../src/client/components/drive/RenameAccountDialog.tsx","../../src/client/components/drive/dnd-provider.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/CreateFolderDialog.tsx","../../src/client/components/drive/RenameDialog.tsx","../../src/client/components/drive/file-grid.tsx","../../src/client/components/drive/header.tsx","../../src/client/components/drive/path-bar.tsx","../../src/client/components/drive/upload.tsx","../../src/client/components/drive/storage/indicator.tsx","../../src/client/file-chooser.tsx","../../src/client/components/drive/sidebar.tsx","../../src/client/components/drive/explorer.tsx"],"names":["createContext","React","useState","useCallback","driveCreateUrl","driveCreateSrcSet","jsx","useContext","useRef","useEffect","cva","Slot","cn","DialogPrimitive","jsxs","X","SheetPrimitive","React2","DialogPrimitive2","DropdownMenuPrimitive","React3","ChevronRight","Check","Circle","Label","LabelPrimitive","AlertCircle","useForm","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","pointerWithin","ProgressPrimitive","ContextMenuPrimitive","React5","useSortable","CSS","Fragment","getFileIcon","formatBytes","RotateCcw","Trash2","Pencil","useMemo","matchesMimeFilter","startOfWeek","subWeeks","isToday","isYesterday","isAfter","items","Loader2","Folder","SortableContext","rectSortingStrategy","FolderPlus","Menu","Group","ArrowUpDown","Calendar","ArrowDownAZ","ArrowUpAZ","ArrowDown01","ArrowUp01","LayoutGrid","List","useDroppable","CheckCircle2","Clock","FileText","RefreshCw","UploadIcon","Cloud","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen","SortableItem","oldIndex","newIndex","closestCenter"],"mappings":"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","file":"index.cjs","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\nimport { driveCreateUrl, driveCreateSrcSet } from '@/client/utils';\n\n// ** Context Types\nexport type TDriveContext = {\n apiEndpoint: string;\n withCredentials: boolean;\n\n // ** Navigation\n currentFolderId: string | null;\n path: TDrivePathItem[];\n navigateToFolder: (item: { id: string | null; name: string } | null) => void;\n navigateUp: () => void;\n\n // ** Items\n items: TDatabaseDrive[];\n setItems: React.Dispatch<React.SetStateAction<TDatabaseDrive[]>>;\n isLoading: boolean;\n error: string | null;\n fetchItems: () => Promise<void>;\n triggerFetch: () => void;\n\n // ** Accounts\n accounts: { id: string; name: string; email: string; provider: 'GOOGLE' }[];\n activeAccountId: string | null;\n setActiveAccountId: (id: string | null) => void;\n refreshAccounts: () => Promise<void>;\n availableProviders: { google: boolean };\n\n // ** Storage\n quota: TDriveQuota | null;\n refreshQuota: () => Promise<void>;\n\n // ** UI State\n viewMode: 'GRID' | 'LIST';\n setViewMode: (mode: 'GRID' | 'LIST') => void;\n currentView: 'BROWSE' | 'TRASH' | 'SEARCH';\n setCurrentView: (view: 'BROWSE' | 'TRASH' | 'SEARCH') => void;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchScope: 'ACTIVE' | 'TRASH';\n setSearchScope: (scope: 'ACTIVE' | 'TRASH') => void;\n groupBy: 'NONE' | 'CREATED_AT';\n setGroupBy: (group: 'NONE' | 'CREATED_AT') => void;\n sortBy: { field: string; order: number };\n setSortBy: (sort: { field: string; order: number }) => void;\n\n // ** Selection\n selectionMode: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n selectedFileIds: string[];\n setSelectedFileIds: React.Dispatch<React.SetStateAction<string[]>>;\n\n // ** Pagination\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n\n // ** Utilities\n createUrl: (driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => string;\n createSrcSet: (driveFile: TDriveFile, format?: TImageFormat) => { srcSet: string; sizes: string };\n callAPI: <T>(action: string, options?: RequestInit & { query?: Record<string, string> }) => Promise<TDriveAPIResponse<T>>;\n\n // ** Actions (Optimistic)\n createFolder: (name: string) => Promise<void>;\n renameItem: (id: string, newName: string) => Promise<void>;\n deleteItem: (id: string) => Promise<void>;\n moveItem: (id: string, targetFolderId: string) => Promise<void>;\n restoreItem: (id: string) => Promise<void>;\n};\n\nconst DriveContext = createContext<TDriveContext | null>(null);\n\n// ** Provider\nexport const DriveProvider = (props: Readonly<{\n children: ReactNode;\n apiEndpoint: string;\n initialActiveAccountId?: string | null;\n initialSelectionMode?: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n defaultSelectedFileIds?: string[];\n withCredentials?: boolean;\n lazyFetch?: boolean;\n}>) => {\n const {\n children,\n apiEndpoint,\n initialActiveAccountId = null,\n initialSelectionMode = { type: 'SINGLE' },\n defaultSelectedFileIds = [],\n withCredentials = false,\n lazyFetch = false\n } = props;\n\n // Track if initial fetch has been triggered (for lazy mode)\n const [hasFetched, setHasFetched] = React.useState(!lazyFetch);\n\n // =========================================================================\n // STATE\n // =========================================================================\n\n // ** Items - Simple flat array for current view\n const [items, setItems] = useState<TDatabaseDrive[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // ** Navigation\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [path, setPath] = useState<TDrivePathItem[]>([{ id: null, name: 'Home' }]);\n\n // ** Accounts\n const [accounts, setAccounts] = useState<{ id: string; name: string; email: string; provider: 'GOOGLE' }[]>([]);\n const [activeAccountId, setActiveAccountIdState] = useState<string | null>(initialActiveAccountId);\n const [availableProviders, setAvailableProviders] = useState<{ google: boolean }>({ google: false });\n\n // ** Storage\n const [quota, setQuota] = useState<TDriveQuota | null>(null);\n\n // ** UI State\n const [viewMode, setViewMode] = useState<'GRID' | 'LIST'>(() => {\n if (typeof window !== 'undefined') return window.innerWidth < 768 ? 'LIST' : 'GRID';\n return 'GRID';\n });\n const [currentView, setCurrentView] = useState<'BROWSE' | 'TRASH' | 'SEARCH'>('BROWSE');\n const [searchQuery, setSearchQuery] = useState('');\n const [searchScope, setSearchScope] = useState<'ACTIVE' | 'TRASH'>('ACTIVE');\n const [groupBy, setGroupBy] = useState<'NONE' | 'CREATED_AT'>('NONE');\n const [sortBy, setSortBy] = useState<{ field: string; order: number }>({ field: 'createdAt', order: -1 });\n\n // ** Selection\n const [selectionMode] = useState(initialSelectionMode);\n const [selectedFileIds, setSelectedFileIds] = useState<string[]>(defaultSelectedFileIds);\n\n // ** Pagination\n const [hasMore, setHasMore] = useState(false);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // =========================================================================\n // API HELPER\n // =========================================================================\n\n const callAPI = useCallback(async <T,>(\n action: string,\n options?: RequestInit & { query?: Record<string, string> }\n ): Promise<TDriveAPIResponse<T>> => {\n const { query, ...fetchOptions } = options || {};\n const params = new URLSearchParams({ action, ...query });\n const url = `${apiEndpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...((fetchOptions?.headers as Record<string, string>) || {})\n };\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n return await res.json();\n } catch (err) {\n return { status: 0, message: err instanceof Error ? err.message : 'Network error' };\n }\n }, [apiEndpoint, activeAccountId, withCredentials]);\n\n // =========================================================================\n // FETCH FUNCTIONS\n // =========================================================================\n\n const fetchItems = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n let res: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'TRASH') {\n res = await callAPI('trash');\n } else if (currentView === 'SEARCH' && searchQuery) {\n res = await callAPI('search', { query: { q: searchQuery, limit: '50' } });\n } else {\n res = await callAPI('list', { query: { folderId: currentFolderId || 'root', limit: '50' } });\n }\n\n if (res.status === 200 && res.data) {\n setItems(res.data.items);\n setHasMore(!!res.data.hasMore);\n } else {\n setError(res.message || 'Failed to load');\n setItems([]);\n }\n\n setIsLoading(false);\n }, [callAPI, currentFolderId, currentView, searchQuery]);\n\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading || isLoadingMore) return;\n\n const lastItem = items[items.length - 1];\n if (!lastItem) return;\n\n setIsLoadingMore(true);\n\n const res = await callAPI<{ items: TDatabaseDrive[]; hasMore?: boolean }>('list', {\n query: { folderId: currentFolderId || 'root', limit: '50', afterId: lastItem.id }\n });\n\n if (res.status === 200 && res.data) {\n setItems(prev => [...prev, ...res.data!.items]);\n setHasMore(!!res.data.hasMore);\n }\n\n setIsLoadingMore(false);\n }, [callAPI, currentFolderId, hasMore, isLoading, isLoadingMore, items]);\n\n const refreshAccounts = useCallback(async () => {\n const res = await callAPI<{ accounts: typeof accounts }>('listAccounts');\n if (res.status === 200 && res.data) setAccounts(res.data.accounts);\n\n // Also fetch available providers\n const infoRes = await callAPI<{ providers: { google: boolean } }>('information');\n if (infoRes.status === 200 && infoRes.data) setAvailableProviders(infoRes.data.providers);\n }, [callAPI]);\n\n const refreshQuota = useCallback(async () => {\n const res = await callAPI<TDriveQuota>('quota');\n if (res.status === 200 && res.data) setQuota(res.data);\n }, [callAPI]);\n\n // =========================================================================\n // NAVIGATION\n // =========================================================================\n\n const setActiveAccountId = useCallback((id: string | null) => {\n setActiveAccountIdState(id);\n if (id) localStorage.setItem('drive_active_account', id);\n else localStorage.removeItem('drive_active_account');\n // Reset state\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setItems([]);\n setSelectedFileIds([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n\n if (!item) {\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n return;\n }\n\n setCurrentFolderId(item.id);\n setPath(prev => {\n const idx = prev.findIndex(p => p.id === item.id);\n return idx !== -1 ? prev.slice(0, idx + 1) : [...prev, { id: item.id, name: item.name }];\n });\n }, []);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n const newPath = path.slice(0, -1);\n setPath(newPath);\n setCurrentFolderId(newPath[newPath.length - 1]?.id || null);\n }, [path]);\n\n // =========================================================================\n // OPTIMISTIC ACTIONS\n // =========================================================================\n\n const createFolder = useCallback(async (name: string) => {\n // Optimistic: Add temp folder\n const tempId = `temp-${Date.now()}`;\n const tempFolder = {\n id: tempId,\n name,\n parentId: currentFolderId,\n information: { type: 'FOLDER' as const },\n createdAt: new Date(),\n trashedAt: null,\n } as TDatabaseDrive;\n setItems(prev => [tempFolder, ...prev]);\n\n // API call\n const res = await callAPI<{ item: TDatabaseDrive }>('createFolder', {\n method: 'POST',\n body: JSON.stringify({ name, parentId: currentFolderId || 'root' })\n });\n\n // Replace temp with real\n if ((res.status === 200 || res.status === 201) && res.data?.item) {\n setItems(prev => prev.map(i => i.id === tempId ? res.data!.item : i));\n } else {\n // Rollback\n setItems(prev => prev.filter(i => i.id !== tempId));\n }\n }, [callAPI, currentFolderId]);\n\n const renameItem = useCallback(async (id: string, newName: string) => {\n // Optimistic: Update name immediately\n setItems(prev => prev.map(i => i.id === id ? { ...i, name: newName } : i));\n\n // API call (fire and forget, already updated)\n await callAPI('rename', {\n method: 'PATCH',\n query: { id },\n body: JSON.stringify({ newName })\n });\n }, [callAPI]);\n\n const deleteItem = useCallback(async (id: string) => {\n // Optimistic: Remove from list immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call\n if (currentView === 'TRASH') {\n await callAPI('deletePermanent', { query: { id } });\n } else {\n await callAPI('delete', { query: { id } });\n }\n }, [callAPI, currentView]);\n\n const moveItem = useCallback(async (id: string, targetFolderId: string) => {\n // Optimistic: Remove from current view (it's moving away)\n setItems(prev => prev.filter(i => i.id !== id));\n\n // API call\n await callAPI('move', {\n method: 'POST',\n body: JSON.stringify({ ids: [id], targetFolderId })\n });\n }, [callAPI]);\n\n const restoreItem = useCallback(async (id: string) => {\n // Optimistic: Remove from trash view immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call in background\n await callAPI('restore', { method: 'POST', query: { id } });\n }, [callAPI]);\n\n // =========================================================================\n // UTILITIES\n // =========================================================================\n\n const createUrl = useCallback((driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => {\n return driveCreateUrl(driveFile, apiEndpoint, options);\n }, [apiEndpoint]);\n\n const createSrcSet = useCallback((driveFile: TDriveFile, format?: TImageFormat) => {\n return driveCreateSrcSet(driveFile, apiEndpoint, format);\n }, [apiEndpoint]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n\n // Load stored account on mount\n React.useEffect(() => {\n const stored = localStorage.getItem('drive_active_account');\n if (stored) setActiveAccountIdState(stored);\n }, []);\n\n // Fetch items when view/folder/account changes (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n fetchItems();\n }, [fetchItems, hasFetched]);\n\n // Fetch accounts & quota on mount and account change (skip if lazy and not yet triggered)\n React.useEffect(() => { \n if (!hasFetched) return;\n refreshAccounts(); \n }, [refreshAccounts, hasFetched]);\n React.useEffect(() => { \n if (!hasFetched) return;\n refreshQuota(); \n }, [refreshQuota, activeAccountId, hasFetched]);\n\n // Trigger initial fetch (used by components to start fetching in lazy mode)\n const triggerFetch = React.useCallback(() => {\n if (!hasFetched) setHasFetched(true);\n }, [hasFetched]);\n\n // =========================================================================\n // RENDER\n // =========================================================================\n\n return (\n <DriveContext.Provider value={{\n apiEndpoint,\n withCredentials,\n\n // Navigation\n currentFolderId,\n path,\n navigateToFolder,\n navigateUp,\n\n // Items\n items,\n setItems,\n isLoading,\n error,\n fetchItems,\n triggerFetch,\n\n // Accounts\n accounts,\n activeAccountId,\n setActiveAccountId,\n refreshAccounts,\n availableProviders,\n\n // Storage\n quota,\n refreshQuota,\n\n // UI\n viewMode,\n setViewMode,\n currentView,\n setCurrentView,\n searchQuery,\n setSearchQuery,\n searchScope,\n setSearchScope,\n groupBy,\n setGroupBy,\n sortBy,\n setSortBy,\n\n // Selection\n selectionMode,\n selectedFileIds,\n setSelectedFileIds,\n\n // Pagination\n hasMore,\n isLoadingMore,\n loadMore,\n\n // Utilities\n createUrl,\n createSrcSet,\n callAPI,\n\n // Optimistic Actions\n createFolder,\n renameItem,\n deleteItem,\n moveItem,\n restoreItem,\n }}>\n {children}\n </DriveContext.Provider>\n );\n};\n\n// ** Hook\nexport const useDrive = (): TDriveContext => {\n const context = useContext(DriveContext);\n if (!context) throw new Error('useDrive must be used within a DriveProvider');\n return context;\n};\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nconst getChunkSize = (fileSize: number) => {\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\n return 16 * 1024 * 1024;\n};\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: any) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n\n // ** Refs for data storage\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null }>>(new Map());\n\n const updateUpload = useCallback((id: string, updates: Partial<TDriveUploadState>) => {\n setUploads(prev => prev.map(u => (u.id === id ? { ...u, ...updates } : u)));\n }, []);\n\n const addLog = useCallback((id: string, type: 'info' | 'warning' | 'error' | 'success', message: string) => {\n setUploads(prev => prev.map(u => {\n if (u.id !== id) return u;\n const logs = u.logs || [];\n return { ...u, logs: [...logs, { type, message, timestamp: Date.now() }] };\n }));\n }, []);\n\n const uploadChunk = async (uploadId: string, formData: FormData): Promise<[boolean, any, boolean]> => {\n try {\n const headers: Record<string, string> = {};\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n const url = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\n addLog(uploadId, 'info', `Sending chunk to ${url}`);\n\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const text = await response.text();\n addLog(uploadId, 'error', `HTTP ${response.status}: ${response.statusText}`);\n try {\n const json = JSON.parse(text);\n const msg = json.message || json.error?.message || `Status ${response.status}`;\n addLog(uploadId, 'error', `Server response: ${msg}`);\n\n // Retry on Gateway errors (502, 503, 504) or Request Timeout (408) or Too Many Requests (429)\n const canRetry = [408, 429, 502, 503, 504].includes(response.status);\n if (canRetry) {\n addLog(uploadId, 'warning', `Error is retryable (status ${response.status})`);\n }\n return [false, msg, canRetry];\n } catch {\n // If parsing fails, it's likely a severe server error (500 HTML) or network glitch response?\n // Assume retryable for 5xx range, non-retryable for 4xx?\n addLog(uploadId, 'error', `Failed to parse error response: ${text.slice(0, 100)}`);\n const isRetryable = response.status >= 500 || response.status === 429;\n return [false, `Server error ${response.status}: ${text.slice(0, 100)}`, isRetryable];\n }\n }\n\n const data = await response.json();\n if (data.status !== 200) {\n addLog(uploadId, 'error', `Upload API error: ${data.message || 'Unknown error'}`);\n return [false, data.message || 'Upload failed', false]; // Business logic errors are fatal\n }\n\n addLog(uploadId, 'success', `Chunk uploaded successfully`);\n return [true, data.data, false];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Network error';\n addLog(uploadId, 'error', `Network/Fetch error: ${errorMsg}`);\n return [false, errorMsg, true]; // Network errors are retryable\n }\n };\n\n const processItem = async (item: TDriveUploadState, file: File, folderId: string | null) => {\n const controller = new AbortController();\n abortControllers.current.set(item.id, controller);\n\n addLog(item.id, 'info', `Starting upload: ${file.name} (${file.size} bytes)`);\n updateUpload(item.id, { status: 'uploading' });\n\n const chunkSize = getChunkSize(file.size);\n const totalChunks = Math.ceil(file.size / chunkSize);\n addLog(item.id, 'info', `File split into ${totalChunks} chunks of ${chunkSize} bytes each`);\n\n let driveId = item.driveId;\n\n try {\n for (let i = item.currentChunk; i < totalChunks; i++) {\n if (controller.signal.aborted) throw new Error('Cancelled');\n\n updateUpload(item.id, { currentChunk: i });\n addLog(item.id, 'info', `Processing chunk ${i + 1}/${totalChunks}`);\n\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n const formData = new FormData();\n formData.append('chunk', chunk);\n formData.append('chunkIndex', String(i));\n formData.append('totalChunks', String(totalChunks));\n formData.append('fileName', file.name);\n formData.append('fileSize', String(file.size));\n formData.append('fileType', file.type);\n formData.append('folderId', folderId || 'root');\n if (driveId) formData.append('driveId', driveId);\n\n // Smart retry logic\n let attempts = 0;\n let success = false;\n while (!success && attempts < 3 && !controller.signal.aborted) {\n const [ok, result, canRetry] = await uploadChunk(item.id, formData);\n if (ok) {\n success = true;\n if (result.type === 'UPLOAD_STARTED' && result.driveId) {\n driveId = result.driveId;\n updateUpload(item.id, { driveId });\n addLog(item.id, 'success', `Upload session started with ID: ${driveId}`);\n } else if (result.type === 'UPLOAD_COMPLETE') {\n // Single chunk upload complete\n addLog(item.id, 'success', `Upload completed successfully`);\n if (onUploadComplete) onUploadComplete(result.item);\n }\n } else {\n if (!canRetry) {\n addLog(item.id, 'error', `Non-retryable error: ${result as string}`);\n throw new Error(result as string); // Immediate failure for non-retryable errors\n }\n\n attempts++;\n addLog(item.id, 'warning', `Retry attempt ${attempts}/3 after error`);\n if (attempts === 3) {\n addLog(item.id, 'error', `Max retry attempts reached: ${result as string}`);\n throw new Error(result as string);\n }\n await new Promise(r => setTimeout(r, 1000 * attempts));\n }\n }\n }\n addLog(item.id, 'success', `All ${totalChunks} chunks uploaded successfully`);\n updateUpload(item.id, { status: 'complete', currentChunk: totalChunks });\n // Since we don't get the item in the final chunk response here easily without parsing the loop result,\n // wait, the server returns UPLOAD_COMPLETE with item in the last chunk response.\n // But loop logic handles it?\n // \"if (result.type === 'UPLOAD_COMPLETE')\" is handled inside the loop for single files OR last chunk.\n // So onUploadComplete is called there.\n // Wait, chunked upload response handling loop (lines 96-103) ONLY handles UPLOAD_STARTED.\n // I need to update the loop to checks for UPLOAD_COMPLETE too.\n } catch (error: any) {\n if (error.message === 'Cancelled') {\n addLog(item.id, 'warning', 'Upload cancelled by user');\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n addLog(item.id, 'error', `Upload failed: ${error.message}`);\n updateUpload(item.id, { status: 'error', error: error.message });\n }\n } finally {\n abortControllers.current.delete(item.id);\n }\n };\n\n const uploadFiles = useCallback(async (files: File[], folderId: string | null) => {\n const newUploads: TDriveUploadState[] = [];\n files.forEach(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const chunkSize = getChunkSize(file.size);\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n newUploads.push({\n id,\n name: file.name,\n size: file.size,\n status: 'queued',\n currentChunk: 0,\n totalChunks: Math.ceil(file.size / chunkSize),\n logs: [],\n });\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const cancelUpload = useCallback(\n async (id: string) => {\n const controller = abortControllers.current.get(id);\n if (controller) {\n controller.abort();\n } else {\n updateUpload(id, { status: 'cancelled' });\n }\n\n const upload = uploads.find(u => u.id === id);\n if (upload?.driveId) {\n fetch(`${apiEndpoint.replace(/\\/$/, '')}?action=cancel&id=${upload.driveId}`, {\n method: 'POST',\n credentials: withCredentials ? 'include' : 'same-origin',\n }).catch(() => { });\n }\n },\n [apiEndpoint, updateUpload, uploads, withCredentials],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['queued', 'uploading', 'pending'].includes(u.status)) {\n cancelUpload(u.id);\n }\n });\n }, [uploads, cancelUpload]);\n\n // ** Robust Scheduler\n useEffect(() => {\n const activeCount = uploads.filter(u => u.status === 'uploading').length;\n\n if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued');\n\n if (queued) {\n const file = filesRef.current.get(queued.id);\n const meta = metaRef.current.get(queued.id);\n\n if (file) {\n processItem(queued, file, meta?.folderId || null);\n }\n }\n // eslint-disable-next-line\n }, [uploads]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads };\n};\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/client/utils\"\n\n// ** Dialog2 - Modern fullscreen dialog on mobile, centered on desktop\nfunction Dialog2({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog2\" {...props} />\n}\n\nfunction Dialog2Trigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog2-trigger\" {...props} />\n}\n\nfunction Dialog2Close({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog2-close\" {...props} />\n}\n\nfunction Dialog2Content({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPrimitive.Portal data-slot=\"dialog2-portal\">\n {/* Overlay with higher z-index for proper stacking */}\n <DialogPrimitive.Overlay\n data-slot=\"dialog2-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\"\n )}\n />\n {/* Content: Fullscreen on mobile, centered modal on desktop */}\n <DialogPrimitive.Content\n data-slot=\"dialog2-content\"\n className={cn(\n // Base styles\n \"fixed z-50 flex flex-col bg-background shadow-2xl outline-none\",\n // Mobile: Full screen\n \"inset-0 rounded-none\",\n // Desktop: Centered modal with max dimensions\n \"md:inset-auto md:top-[50%] md:left-[50%] md:translate-x-[-50%] md:translate-y-[-50%]\",\n \"md:max-w-5xl md:w-[95vw] md:max-h-[90vh] md:rounded-xl md:border\",\n // Animations\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:slide-out-to-bottom-2 data-[state=open]:slide-in-from-bottom-2\",\n \"md:data-[state=closed]:zoom-out-95 md:data-[state=open]:zoom-in-95\",\n \"md:data-[state=closed]:slide-out-to-bottom-0 md:data-[state=open]:slide-in-from-bottom-0\",\n \"duration-200\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog2-close\"\n className={cn(\n \"absolute top-3 right-3 z-10\",\n \"flex items-center justify-center size-8 rounded-full\",\n \"bg-muted/80 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n \"md:top-4 md:right-4 md:size-7 md:rounded-md md:bg-transparent\"\n )}\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\n}\n\nfunction Dialog2Header({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-header\"\n className={cn(\n \"flex items-center justify-between shrink-0 px-4 h-14 border-b bg-background/95 backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Body({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-body\"\n className={cn(\"flex-1 min-h-0 overflow-hidden\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Footer({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-footer\"\n className={cn(\n \"flex items-center justify-end gap-2 shrink-0 px-4 py-3 border-t bg-background/95 backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Title({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog2-title\"\n className={cn(\"text-base font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Description({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog2-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog2,\n Dialog2Close,\n Dialog2Content,\n Dialog2Body,\n Dialog2Description,\n Dialog2Footer,\n Dialog2Header,\n Dialog2Title,\n Dialog2Trigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, hideCloseButton, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from \"react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import { useEffect, useState } from 'react';\nimport { AlertCircle } from \"lucide-react\";\nimport { Alert, AlertDescription, AlertTitle } from \"./ui/alert\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\n// ** Define input type with required field\ntype TInputDefinition = {\n type: 'INPUT',\n id: string,\n name: string,\n default?: string,\n required?: boolean\n};\n\n// ** Helper type to extract input values based on input definitions\ntype TInputValues<T extends readonly TInputDefinition[]> = { [K in T[number]['id']]: string };\n\nexport const DialogConfirmation = <T extends readonly TInputDefinition[] | undefined = undefined>(\n props: Readonly<{\n title: string\n description: string\n open: boolean\n onClose: () => void\n inputs?: T\n onConfirm: T extends readonly TInputDefinition[]\n ? (inputs: Readonly<TInputValues<T>>) => Promise<[true] | [false, string]>\n : () => Promise<[true] | [false, string]>\n disableEscapeKeyDown?: boolean\n }>\n) => {\n // ** Deconstruct Props\n const { title, description, onConfirm, disableEscapeKeyDown, inputs, onClose, open } = props\n\n // ** State\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [inputsValue, setInputsValue] = useState<{ [key: string]: string }>(() =>\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n\n // ** Function\n const handleConfirm = async () => {\n setIsLoading(true);\n setError(null);\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await (inputs ? (onConfirm as any)(inputsValue) : (onConfirm as any)());\n if (response[0]) {\n onClose();\n } else {\n setError(response[1]);\n }\n } catch (err) {\n setError(String(err));\n } finally {\n setIsLoading(false);\n }\n }\n\n const handleClose = () => {\n if (isLoading) return\n onClose()\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n }\n\n const handleKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && isFormValid()) {\n event.preventDefault()\n handleConfirm()\n }\n }\n\n const isFormValid = (): boolean => {\n if (!inputs) return true\n return inputs.every(input =>\n !input.required || (inputsValue[input.id] && inputsValue[input.id].trim() !== '')\n )\n }\n\n // ** Effect to reset input values when inputs change or dialog opens\n useEffect(() => {\n if (open) {\n setInputsValue(\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n setError(null)\n }\n }, [inputs, open])\n\n // ** Render\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {inputs && inputs.length > 0 && (\n <div className=\"grid gap-4 py-4\">\n {inputs.map((input, index) => (\n <div key={input.id} className=\"grid gap-2\">\n <Label htmlFor={input.id}>{input.name}</Label>\n <Input\n id={input.id}\n required={input.required}\n value={inputsValue[input.id] || ''}\n onChange={(e) =>\n setInputsValue({ ...inputsValue, [input.id]: e.target.value })\n }\n onKeyDown={index === inputs.length - 1 ? handleKeyPress : undefined}\n />\n </div>\n ))}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose} disabled={isLoading}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading || !isFormValid()}\n >\n Confirm\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype RenameAccountFormData = {\n name: string;\n};\n\ntype Account = {\n id: string;\n name: string;\n email: string;\n provider: 'GOOGLE';\n};\n\nexport const RenameAccountDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n account: Account | null;\n onConfirm: (account: Account, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, account, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameAccountFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or account changes\n useEffect(() => {\n if (open && account) {\n reset({ name: account.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById(\n 'rename-account-input'\n ) as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, account, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameAccountFormData) => {\n if (!account) return;\n\n try {\n await onConfirm(account, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename account:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename Account</DialogTitle>\n <DialogDescription>\n Enter a new display name for this storage account.\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"rename-account-input\">Account name</Label>\n <Input\n id=\"rename-account-input\"\n {...register('name', {\n required: 'Account name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Account name cannot be empty';\n if (trimmed.length > 255)\n return 'Account name is too long';\n return true;\n },\n })}\n placeholder=\"Enter account name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** Drive DnD Provider - Wraps PathBar and FileGrid for drag-drop between them\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useDrive } from '@/client/context';\nimport {\n DndContext,\n pointerWithin,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null\n});\n\nexport const useDriveDnd = () => useContext(DriveDndContext);\n\n// ** Provider Component\nexport const DriveDndProvider = (props: Readonly<{ children: React.ReactNode }>) => {\n // ** Deconstruct Props\n const { children } = props;\n\n const { items, setItems, sortBy, setSortBy, moveItem, callAPI, currentView } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n\n // ** DnD Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handlers\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n }, []);\n\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n\n const overId = over.id as string;\n\n // Check if hovering over a path item\n if (overId.startsWith('path-')) {\n setDragOverFolderId(overId);\n return;\n }\n\n // Check if hovering over a folder in the grid\n const overItem = items.find((i: { id: string }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n }, [items, draggingItemId]);\n\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) return;\n\n const overId = over.id as string;\n\n // Dropping on path bar item (e.g., \"path-root\" or \"path-abc123\")\n if (overId.startsWith('path-')) {\n const pathId = overId.slice(5); // Remove \"path-\" prefix\n const targetFolderId = pathId === 'root' || pathId === 'null' ? 'root' : pathId;\n await moveItem(active.id as string, targetFolderId);\n return;\n }\n\n // Dropping on a folder in the grid\n const overItem = items.find((i: { id: string; information: { type: string } }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER') {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Reordering items (optimistic)\n const oldIndex = items.findIndex((i: { id: string }) => i.id === active.id);\n const newIndex = items.findIndex((i: { id: string }) => i.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const reordered = arrayMove(items, oldIndex, newIndex);\n\n setItems(reordered);\n if (sortBy.field !== 'order') setSortBy({ field: 'order', order: 1 });\n\n // API call in background\n await callAPI('reorder', { method: 'POST', body: JSON.stringify({ ids: reordered.map((i: { id: string }) => i.id) }) });\n }, [items, setItems, sortBy, setSortBy, moveItem, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId }}>\n {enableDnd ? (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n ) : (\n children\n )}\n </DriveDndContext.Provider>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Progress({\n className,\n value,\n indicatorClassName,\n indeterminate = false,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & {\n indicatorClassName?: string;\n indeterminate?: boolean;\n}) {\n const isIndeterminate = indeterminate || value === undefined;\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"bg-primary h-full flex-1 transition-all\",\n isIndeterminate && \"w-1/3 animate-[indeterminate_1.5s_ease-in-out_infinite]\",\n !isIndeterminate && \"w-full\",\n indicatorClassName\n )}\n style={isIndeterminate ? undefined : { transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName =\n ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const CreateFolderDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n onConfirm: (name: string) => Promise<void>;\n}>) => {\n const { open, onClose, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<CreateFolderFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens\n useEffect(() => {\n if (open) {\n reset();\n // Focus input after a short delay to ensure dialog is rendered\n setTimeout(() => setFocus('name'), 100);\n }\n }, [open, reset, setFocus]);\n\n const handleFormSubmit = async (data: CreateFolderFormData) => {\n try {\n await onConfirm(data.name);\n reset();\n onClose();\n } catch (error) {\n // Error will be handled by parent component\n console.error('Failed to create folder:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Create New Folder</DialogTitle>\n <DialogDescription>\n Enter a name for the new folder\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"folder-name\">Folder name</Label>\n <Input\n id=\"folder-name\"\n {...register('name', {\n required: 'Folder name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Folder name cannot be empty';\n if (trimmed.length > 255)\n return 'Folder name is too long';\n return true;\n },\n })}\n placeholder=\"Enter folder name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\nimport type { TDatabaseDrive } from '@/types/server';\n\ntype RenameFormData = {\n name: string;\n};\n\nexport const RenameDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n item: TDatabaseDrive | null;\n onConfirm: (id: string, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, item, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or item changes\n useEffect(() => {\n if (open && item) {\n reset({ name: item.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById('rename-input') as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, item, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameFormData) => {\n if (!item) return;\n\n try {\n await onConfirm(item.id, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename item:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n const itemType = item?.information.type === 'FOLDER' ? 'Folder' : 'File';\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename {itemType}</DialogTitle>\n <DialogDescription>Enter a new name for this {itemType.toLowerCase()}</DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"rename-input\">Name</Label>\n <Input\n id=\"rename-input\"\n {...register('name', {\n required: 'Name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Name cannot be empty';\n if (trimmed.length > 255) return 'Name is too long';\n return true;\n },\n })}\n placeholder=\"Enter name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Renaming...' : 'Rename'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** DriveFileGrid Component - Pure file display (no chrome)\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useDriveDnd } from '@/client/components/drive/dnd-provider';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight, Pencil, Trash2 } from 'lucide-react';\nimport { Progress } from '@/client/components/ui/progress';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator\n} from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled });\n\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\n// ** File Item Component\nconst FileItem = (props: Readonly<{\n item: TDatabaseDrive;\n isSelected: boolean;\n isDragOver: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onDoubleClick: (e: React.MouseEvent) => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, onSelect, onDoubleClick, onRename, onDelete, onRestore } = props;\n\n const { apiEndpoint, viewMode, currentView } = useDrive();\n const isFolder = item.information.type === 'FOLDER';\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=small${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n className={cn(\n \"group relative cursor-pointer transition-all select-none\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary\",\n viewMode === 'GRID'\n ? \"flex flex-col rounded-lg sm:rounded-xl border bg-card dark:bg-card/50 hover:bg-accent/50 dark:hover:bg-accent/30 overflow-hidden\"\n : \"flex items-center gap-2 sm:gap-3 p-1.5 sm:p-2 rounded-lg border border-transparent hover:bg-accent/50 dark:hover:bg-accent/30 hover:border-border\",\n isSelected && \"ring-2 ring-primary border-primary/50 bg-primary/5 dark:bg-primary/10\",\n isDragOver && \"ring-2 ring-primary border-primary scale-[1.02] bg-primary/10 shadow-lg\"\n )}\n onClick={onSelect}\n onDoubleClick={onDoubleClick}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"aspect-square w-full bg-muted/30 dark:bg-muted/20 flex items-center justify-center overflow-hidden relative\">\n {isThumbnailable ? (\n <img\n src={thumbnailUrl}\n alt={item.name}\n className=\"size-full object-cover transition-transform group-hover:scale-105 duration-300\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"transition-transform group-hover:scale-110 duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-8 sm:size-10 md:size-12 text-muted-foreground/60\")}\n </div>\n )}\n {isSelected && (\n <div className=\"absolute top-1.5 right-1.5 sm:top-2 sm:right-2 size-5 bg-primary rounded-full flex items-center justify-center shadow-md animate-in zoom-in-50\">\n <div className=\"size-2 bg-primary-foreground rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"absolute bottom-1.5 right-1.5 sm:bottom-2 sm:right-2 lg:hidden size-5 sm:size-6 bg-primary/90 rounded-full flex items-center justify-center shadow-md\">\n <ChevronRight className=\"size-3 sm:size-3.5 text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"p-1.5 sm:p-2\">\n <p className=\"text-sm font-medium truncate leading-tight\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"size-10 shrink-0 rounded-lg overflow-hidden bg-muted/50 dark:bg-muted/30 flex items-center justify-center\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-cover\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-5 text-muted-foreground\")\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"size-4 text-muted-foreground lg:hidden shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={onRestore}>\n <RotateCcw className=\"mr-2 size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={onRename}>\n <Pencil className=\"mr-2 size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n};\n\n// ** Main FileGrid Component\nexport const DriveFileGrid = (props: Readonly<{\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, selectableFolders = false, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state from shared context\n const { dragOverFolderId } = useDriveDnd();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({ newFolder: false, rename: false, delete: false });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n\n\n // ** Process Items\n const processedItems = useMemo(() => {\n let filtered = items;\n if (mimeFilter) {\n filtered = filtered.filter(item =>\n matchesMimeFilter(\n item.information.type === 'FILE' ? item.information.mime : '',\n item.information.type === 'FOLDER',\n mimeFilter\n )\n );\n }\n\n return [...filtered].sort((a, b) => {\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n if (sortBy.field === 'order') return 0;\n\n let valA: any, valB: any;\n if (sortBy.field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (sortBy.field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else {\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n if (valA < valB) return -1 * sortBy.order;\n if (valA > valB) return 1 * sortBy.order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [], 'Yesterday': [], 'Earlier this Week': [], 'Last Week': [], 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n // Single tap/click on folder opens it, on file selects it\n // Double click also works for folders (desktop)\n const handleItemSelect = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n return;\n }\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n toggleSelection(item);\n onItemClick?.(item);\n };\n\n const toggleSelection = (item: TDatabaseDrive) => {\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n // ** Loading State (initial load - no items yet)\n if (isLoading && items.length === 0) {\n return (\n <div className={cn(\"flex-1 flex flex-col\", className)}>\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n </div>\n </div>\n );\n }\n\n // ** Error State\n if (error) {\n return (\n <div className={cn(\"flex-1 flex items-center justify-center p-8\", className)}>\n <p className=\"text-destructive font-medium text-center\">{error}</p>\n </div>\n );\n }\n\n // ** Empty State\n if (processedItems.length === 0) {\n return (\n <div className={cn(\"flex-1 flex flex-col items-center justify-center p-8 text-center\", className)}>\n <div className=\"size-16 rounded-2xl bg-muted/50 dark:bg-muted/30 flex items-center justify-center mb-4\">\n <Folder className=\"size-8 text-muted-foreground/60\" />\n </div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'This folder is empty'}\n </p>\n </div>\n );\n }\n\n // ** Main Grid\n return (\n <>\n {/* Loading Progress Bar - shows when navigating/searching with existing items */}\n {isLoading && (\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n )}\n\n <div className={cn(\"flex-1 overflow-y-auto min-h-0 p-2 sm:p-3 md:p-4\", className)}>\n <div className=\"space-y-4 sm:space-y-6\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName}>\n {groupBy !== 'NONE' && (\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-2 sm:mb-3 px-1\">\n {groupName} <span className=\"opacity-50\">({groupItems.length})</span>\n </h3>\n )}\n <SortableContext items={groupItems.map(i => i.id)} strategy={rectSortingStrategy} disabled={!enableDrag}>\n <div className={cn(\n viewMode === 'GRID'\n ? \"grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-7 gap-2 sm:gap-3\"\n : \"flex flex-col gap-1\"\n )}>\n {groupItems.map(item => (\n <SortableItem\n key={item.id}\n id={item.id}\n disabled={!enableDrag}\n isDragOverTarget={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n >\n <FileItem\n item={item}\n isSelected={selectedFileIds.includes(item.id)}\n isDragOver={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n onSelect={(e) => handleItemSelect(e, item)}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n onRename={() => { setItemToRename(item); setDialogs(prev => ({ ...prev, rename: true })); }}\n onDelete={() => { setItemToDelete(item); setDialogs(prev => ({ ...prev, delete: true })); }}\n onRestore={() => restoreItem(item.id)}\n />\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div ref={observerTarget} className=\"flex justify-center py-6\">\n {isLoadingMore && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />}\n </div>\n )}\n </div>\n\n {/* Dialogs */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => { setDialogs(prev => ({ ...prev, rename: false })); setItemToRename(null); }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => { setDialogs(prev => ({ ...prev, delete: false })); setItemToDelete(null); }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`}\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </>\n );\n};\n","// ** Drive Header\n'use client';\n\nimport React, { useState } from 'react';\nimport {\n Trash2, ArrowUpDown, LayoutGrid, List, Group, Calendar,\n ArrowDownAZ, ArrowUpAZ, ArrowDown01, ArrowUp01, Check, RotateCcw, Menu, FolderPlus\n} from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger\n} from '@/client/components/ui/dropdown-menu';\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\n\nexport const DriveHeader = ({ className }: { className?: string }) => {\n const {\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n selectedFileIds, setItems, setSelectedFileIds,\n currentView, setCurrentView, searchQuery, setSearchQuery,\n searchScope, setSearchScope, deleteItem, restoreItem, callAPI, createFolder\n } = useDrive();\n\n const [dialogs, setDialogs] = useState({ delete: false, emptyTrash: false, newFolder: false });\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2 bg-muted/30 dark:bg-muted/20 p-2\", className)}>\n {/* New Folder Button - Only in BROWSE view */}\n {currentView === 'BROWSE' && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}\n >\n <FolderPlus className=\"size-4\" />\n <span className=\"hidden sm:inline\">New Folder</span>\n </Button>\n )}\n\n {/* Actions Dropdown - Only show if there are actions available */}\n {(selectedFileIds.length > 0 || currentView === 'TRASH') && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Menu className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {/* Restore (Contextual) */}\n {selectedFileIds.length > 0 && currentView === 'TRASH' && (\n <DropdownMenuItem\n onClick={async () => {\n for (const id of selectedFileIds) {\n await restoreItem(id);\n }\n setSelectedFileIds([]);\n }}\n >\n <RotateCcw className=\"size-3.5 mr-2\" />\n Restore ({selectedFileIds.length})\n </DropdownMenuItem>\n )}\n\n {/* Delete (Contextual) */}\n {selectedFileIds.length > 0 && (\n <DropdownMenuItem\n onClick={() => setDialogs(prev => ({ ...prev, delete: true }))}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-3.5 mr-2\" />\n {currentView === 'TRASH' ? 'Delete Forever' : 'Delete'} ({selectedFileIds.length})\n </DropdownMenuItem>\n )}\n\n {/* Empty Trash (Contextual) */}\n {currentView === 'TRASH' && selectedFileIds.length === 0 && (\n <DropdownMenuItem\n onClick={() => setDialogs(prev => ({ ...prev, emptyTrash: true }))}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-3.5 mr-2\" />\n Empty Trash\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Group By Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant={groupBy !== \"NONE\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Group className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">\n {groupBy === \"NONE\" ? 'Group' : 'Grouped'}\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={() => setGroupBy(\"NONE\")}>\n {groupBy === \"NONE\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(groupBy !== \"NONE\" && \"pl-5.5\")}>\n No Grouping\n </span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setGroupBy(\"CREATED_AT\")}>\n {groupBy === \"CREATED_AT\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(groupBy !== \"CREATED_AT\" && \"pl-5.5\")}>\n Created Date\n </span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Search */}\n <div className=\"flex-1 min-w-0 sm:min-w-50 relative\">\n <Input\n type=\"text\"\n placeholder=\"Search files...\"\n className=\"w-full pl-8 pr-7 h-9\"\n value={searchQuery}\n onChange={(e) => {\n const val = e.target.value;\n setSearchQuery(val);\n if (val.trim().length > 0) {\n if (currentView !== 'SEARCH') {\n setSearchScope(currentView === 'TRASH' ? 'TRASH' : 'ACTIVE');\n }\n setCurrentView('SEARCH');\n } else if (currentView === 'SEARCH') {\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }\n }}\n />\n <div className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-search\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>\n </div>\n {searchQuery && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0.5 top-1/2 -translate-y-1/2 h-7 w-7 text-muted-foreground\"\n onClick={() => {\n setSearchQuery('');\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-x\"><path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" /></svg>\n </Button>\n )}\n </div>\n\n {/* Sort Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"gap-1.5\">\n <ArrowUpDown className=\"size-3.5\" />\n <span className=\"hidden sm:inline max-w-24 truncate\">\n {sortBy.field === \"id\" ? 'Default' :\n sortBy.field === \"order\" ? 'Custom' :\n sortBy.field === \"createdAt\" ? (sortBy.order === -1 ? 'Date: Newest' : 'Date: Oldest') :\n sortBy.field === \"name\" ? (sortBy.order === 1 ? 'Name: A to Z' : 'Name: Z to A') :\n sortBy.field === \"size\" ? (sortBy.order === -1 ? 'Size: Large' : 'Size: Small') :\n 'Sort'}\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setSortBy({ field: \"order\", order: 1 })}>\n {sortBy.field === \"order\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(sortBy.field !== \"order\" && \"pl-5.5\")}>Custom Order</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"id\", order: 1 })}>\n {sortBy.field === \"id\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(sortBy.field !== \"id\" && \"pl-5.5\")}>Default</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"createdAt\", order: -1 })}>\n {sortBy.field === \"createdAt\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <Calendar className={cn(\"size-3.5 mr-2\", sortBy.field === \"createdAt\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Date: Newest\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"createdAt\", order: 1 })}>\n {sortBy.field === \"createdAt\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <Calendar className={cn(\"size-3.5 mr-2\", sortBy.field === \"createdAt\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Date: Oldest\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"name\", order: 1 })}>\n {sortBy.field === \"name\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowDownAZ className={cn(\"size-3.5 mr-2\", sortBy.field === \"name\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Name: A to Z\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"name\", order: -1 })}>\n {sortBy.field === \"name\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowUpAZ className={cn(\"size-3.5 mr-2\", sortBy.field === \"name\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Name: Z to A\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"size\", order: -1 })}>\n {sortBy.field === \"size\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowDown01 className={cn(\"size-3.5 mr-2\", sortBy.field === \"size\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Size: Large\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"size\", order: 1 })}>\n {sortBy.field === \"size\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowUp01 className={cn(\"size-3.5 mr-2\", sortBy.field === \"size\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Size: Small\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"w-px h-5 bg-border\" />\n\n {/* View Toggles */}\n <div className=\"flex bg-muted/50 dark:bg-muted/30 rounded-md p-0.5 gap-0.5\">\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"h-8 w-8\",\n viewMode === \"GRID\" && \"bg-background shadow-sm hover:bg-background dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"GRID\")}\n aria-label=\"Grid View\"\n aria-pressed={viewMode === \"GRID\"}\n >\n <LayoutGrid className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"h-8 w-8\",\n viewMode === \"LIST\" && \"bg-background shadow-sm hover:bg-background dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"LIST\")}\n aria-label=\"List View\"\n aria-pressed={viewMode === \"LIST\"}\n >\n <List className=\"size-4\" />\n </Button>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => setDialogs(prev => ({ ...prev, delete: false }))}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete ${selectedFileIds.length} item(s). You cannot undo this action.`\n : `Are you sure you want to move ${selectedFileIds.length} item(s) to trash?`\n }\n onConfirm={async () => {\n if (selectedFileIds.length === 0) return [false, 'No files selected'];\n for (const id of selectedFileIds) {\n await deleteItem(id);\n }\n return [true];\n }}\n />\n\n {/* Empty Trash Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.emptyTrash}\n onClose={() => setDialogs(prev => ({ ...prev, emptyTrash: false }))}\n title=\"Empty Trash?\"\n description=\"All items in the trash will be permanently deleted. This action cannot be undone.\"\n onConfirm={async () => {\n await callAPI('emptyTrash', { method: 'POST' });\n setItems([]);\n return [true];\n }}\n />\n\n {/* New Folder Dialog */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n </div>\n );\n};\n\n// ** Content Progress Bar - Shows loading state at top of content area\nimport { Progress } from '@/client/components/ui/progress';\n\nexport const DriveContentProgress = () => {\n const { isLoading } = useDrive();\n\n if (!isLoading) return null;\n\n return (\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n );\n};\n","// ** PathBar Component\n'use client';\n\nimport React from 'react';\nimport { useDrive } from '@/client/context';\nimport { useDroppable } from '@dnd-kit/core';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\n\n// ** Droppable Path Item\nconst DroppablePathItem = (props: Readonly<{\n id: string | null;\n name: string;\n isLast: boolean;\n onClick: () => void;\n}>) => {\n // ** Deconstruct Props\n const { id, name, isLast, onClick } = props;\n const { currentFolderId } = useDrive();\n const droppableId = `path-${id ?? 'root'}`;\n\n const { isOver, setNodeRef } = useDroppable({\n id: droppableId,\n data: { type: 'pathItem', folderId: id }\n });\n\n // Don't allow drop on current folder\n const isCurrentFolder = id === currentFolderId;\n\n if (isLast) {\n return (\n <span\n ref={setNodeRef}\n className={cn(\n \"font-medium text-foreground px-1 text-xs sm:text-sm truncate max-w-30 sm:max-w-none\",\n isOver && !isCurrentFolder && \"bg-primary/20 rounded\"\n )}\n aria-current=\"page\"\n title={name}\n >\n {name}\n </span>\n );\n }\n\n return (\n <Button\n ref={setNodeRef}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-6 font-normal text-xs sm:text-sm px-1.5 sm:px-2 truncate max-w-25 sm:max-w-37.5\",\n isOver && !isCurrentFolder && \"ring-2 ring-primary bg-primary/10 scale-105\"\n )}\n onClick={onClick}\n type=\"button\"\n title={name}\n >\n {name}\n </Button>\n );\n};\n\nexport const DrivePathBar = ({ className }: { className?: string }) => {\n const { path, navigateToFolder } = useDrive();\n\n return (\n <ol className={cn(\"flex items-center gap-1 sm:gap-1.5 text-sm text-muted-foreground overflow-x-auto flex-nowrap min-w-0\", className)} aria-label=\"Breadcrumb\" role=\"navigation\">\n {path.map((item, index) => {\n const isLast = index === path.length - 1;\n return (\n <li key={item.id ?? 'root'} className=\"flex items-center gap-1 sm:gap-1.5 shrink-0\">\n {index > 0 && <span className=\"text-muted-foreground/50 text-xs\" aria-hidden=\"true\">/</span>}\n <DroppablePathItem\n id={item.id}\n name={item.name}\n isLast={isLast}\n onClick={() => navigateToFolder(item)}\n />\n </li>\n );\n })}\n </ol>\n );\n};\n","// ** Upload Component\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/useUpload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock, RefreshCw, FileText } from 'lucide-react';\nimport { cn, matchesMimeFilter } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/client/components/ui/dialog';\nimport type { TDriveUploadState } from '@/types/client';\n\nconst UploadStatusIcon = (props: Readonly<{ status: TDriveUploadState['status'] }>) => {\n const { status } = props;\n\n switch (status) {\n case 'complete':\n return <CheckCircle2 className=\"size-4 text-emerald-500\" />;\n case 'error':\n return <AlertCircle className=\"size-4 text-destructive\" />;\n case 'cancelled':\n return <X className=\"size-4 text-muted-foreground\" />;\n case 'uploading':\n return <Loader2 className=\"size-4 text-primary animate-spin\" />;\n default:\n return <Clock className=\"size-4 text-muted-foreground\" />;\n }\n};\n\nconst LogViewerDialog = (props: Readonly<{ upload: TDriveUploadState; open: boolean; onOpenChange: (open: boolean) => void }>) => {\n const { upload, open, onOpenChange } = props;\n const logs = upload.logs || [];\n\n const handleCopy = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n navigator.clipboard.writeText(logText);\n };\n\n const handleDownload = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n const blob = new Blob([logText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${upload.name}-logs.txt`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg p-0 gap-0 max-h-[85vh] flex flex-col\">\n <DialogHeader className=\"px-4 py-3 border-b\">\n <DialogTitle className=\"text-base truncate\">{upload.name}</DialogTitle>\n </DialogHeader>\n <div className=\"sticky top-0 z-10 bg-background px-4 py-2 border-b flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCopy}\n disabled={logs.length === 0}\n >\n Copy\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDownload}\n disabled={logs.length === 0}\n >\n Download\n </Button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-4 space-y-2\">\n {logs.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-8\">No logs available</p>\n )}\n {logs.map((log, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-start gap-2 p-2 rounded-md border text-sm\",\n log.type === 'error' && \"bg-destructive/5 border-destructive/20\",\n log.type === 'warning' && \"bg-yellow-500/5 border-yellow-500/20\",\n log.type === 'success' && \"bg-emerald-500/5 border-emerald-500/20\",\n log.type === 'info' && \"bg-muted/50 border-border\"\n )}\n >\n <div className={cn(\n \"shrink-0 size-1.5 rounded-full mt-1.5\",\n log.type === 'error' && \"bg-destructive\",\n log.type === 'warning' && \"bg-yellow-500\",\n log.type === 'success' && \"bg-emerald-500\",\n log.type === 'info' && \"bg-muted-foreground\"\n )} />\n <div className=\"flex-1 min-w-0 space-y-1\">\n <p className=\"break-words whitespace-pre-wrap\">{log.message}</p>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </p>\n </div>\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const DriveUpload = (props: Readonly<{\n compact?: boolean;\n onComplete?: (item: unknown) => void;\n accept?: string;\n}>) => {\n // ** Deconstruct Props\n const { compact = false, onComplete, accept } = props;\n\n const [isDragging, setIsDragging] = useState(false);\n const [showUploadsDialog, setShowUploadsDialog] = useState(false);\n const [logViewerUpload, setLogViewerUpload] = useState<TDriveUploadState | null>(null);\n const [manuallyOpened, setManuallyOpened] = useState(false);\n const hasAutoClosedRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { currentFolderId, setItems, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {\n // Optimistically add the uploaded item to the items list\n if (uploadedItem) {\n setItems(prev => [uploadedItem as TDatabaseDrive, ...prev]);\n }\n onComplete?.(uploadedItem);\n });\n\n // Auto-hide dialog when all uploads are finished (only once, and not if manually opened)\n React.useEffect(() => {\n if (!showUploadsDialog || uploads.length === 0 || manuallyOpened || hasAutoClosedRef.current) return;\n\n const allFinished = uploads.every(u =>\n ['complete', 'error', 'cancelled'].includes(u.status)\n );\n\n if (allFinished) {\n const timer = setTimeout(() => {\n setShowUploadsDialog(false);\n hasAutoClosedRef.current = true;\n }, 2000);\n return () => clearTimeout(timer);\n }\n }, [uploads, showUploadsDialog, manuallyOpened]);\n\n // Filter files based on accept prop\n const filterFiles = useCallback((files: File[]): File[] => {\n if (!accept) return files;\n return files.filter(file => matchesMimeFilter(file.type, false, accept));\n }, [accept]);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files || files.length === 0) return;\n const filteredFiles = filterFiles(Array.from(files));\n if (filteredFiles.length === 0) return;\n uploadFiles(filteredFiles, currentFolderId);\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, filterFiles]);\n\n const handleDrag = useCallback((e: React.DragEvent, dragging: boolean) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(dragging);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(false); handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const hasUploadsInProgress = uploads.some(u => ['uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['uploading', 'queued', 'pending'].includes(u.status));\n\n const renderDialog = () => (\n <Dialog open={showUploadsDialog} onOpenChange={setShowUploadsDialog}>\n <DialogContent className=\"sm:max-w-md p-0 gap-0\" showCloseButton={false}>\n <DialogHeader className=\"px-4 py-3 border-b flex-row items-center justify-between space-y-0\">\n <DialogTitle className=\"text-base\">Upload Status</DialogTitle>\n {hasUploadsInProgress && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-destructive hover:text-destructive\"\n onClick={cancelAllUploads}\n >\n Cancel All\n </Button>\n )}\n </DialogHeader>\n\n <div className=\"divide-y max-h-80 overflow-y-auto\">\n {uploads.length === 0 && (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">No uploads</div>\n )}\n {uploads.map((upload) => {\n const percent = upload.status === 'complete' ? 100 : (upload.status === 'error' || !upload.totalChunks) ? 0 : Math.round((upload.currentChunk / upload.totalChunks) * 100);\n return (\n <div key={upload.id} className=\"px-4 py-2.5\">\n <div className=\"flex items-start gap-2 mb-1.5\">\n <UploadStatusIcon status={upload.status} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{upload.name}</p>\n <p className={cn(\n \"text-xs break-words\",\n upload.status === 'error' ? \"text-destructive\" : \"text-muted-foreground\"\n )}>\n {upload.status === 'uploading' && 'Uploading...'}\n {upload.status === 'queued' && 'Waiting in queue'}\n {upload.status === 'pending' && 'Preparing...'}\n {upload.status === 'complete' && 'Upload complete'}\n {upload.status === 'error' && (upload.error || 'Upload failed')}\n {upload.status === 'cancelled' && 'Upload cancelled'}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {(upload.logs && upload.logs.length > 0) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setLogViewerUpload(upload)}\n title=\"View logs\"\n >\n <FileText className=\"size-3.5\" />\n </Button>\n )}\n {['uploading', 'queued', 'pending'].includes(upload.status) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => cancelUpload(upload.id)}\n title=\"Cancel\"\n >\n <X className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n {upload.status === 'uploading' && (\n <div className=\"flex items-center gap-2 pl-6\">\n <Progress value={percent} className=\"flex-1\" />\n <span className=\"text-xs tabular-nums text-muted-foreground w-8\">\n {percent}%\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </DialogContent>\n </Dialog>\n );\n\n if (compact) {\n return (\n <>\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n {activeAccountId && (\n <Button\n onClick={() => fetchItems()}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLoading}\n title=\"Refresh\"\n >\n <RefreshCw className={cn(\"!size-4 shrink-0\", isLoading && \"animate-spin\")} />\n </Button>\n )}\n <Button\n onClick={() => inputRef.current?.click()}\n type=\"button\"\n size=\"sm\"\n disabled={hasUploadsInProgress}\n >\n <UploadIcon className=\"!size-4 shrink-0\" />\n <span>Upload</span>\n </Button>\n\n {uploads.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}\n >\n {activeUploads.length > 0 ? (\n <Loader2 className=\"!size-4 shrink-0 animate-spin\" />\n ) : (\n <CheckCircle2 className=\"!size-4 shrink-0\" />\n )}\n <span>\n {activeUploads.length > 0\n ? `(${activeUploads.length})`\n : 'Status'\n }\n </span>\n </Button>\n )}\n </div>\n {renderDialog()}\n </>\n );\n }\n\n return (\n <div className=\"w-full\">\n <div\n className={cn(\n \"flex flex-col items-center justify-center p-8 border-2 border-dashed rounded-lg cursor-pointer transition-colors\",\n isDragging ? \"border-primary bg-primary/5\" : \"border-muted-foreground/25 hover:border-primary/50 hover:bg-muted/50\"\n )}\n onDragEnter={(e) => handleDrag(e, true)} onDragLeave={(e) => handleDrag(e, false)} onDragOver={(e) => handleDrag(e, true)} onDrop={handleDrop}\n onClick={() => inputRef.current?.click()} role=\"button\" tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"p-3 rounded-full bg-background border shadow-sm\">\n <UploadIcon className=\"size-6 text-muted-foreground\" />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {isDragging ? 'Drop files here' : 'Click or drag files to upload'}\n </div>\n </div>\n </div>\n\n {hasUploadsInProgress && (\n <div className=\"mt-4 text-center\">\n <Button variant=\"link\" onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}>View Upload Progress</Button>\n </div>\n )}\n {renderDialog()}\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n </div>\n );\n};\n","// ** DriveStorageIndicator Component\n'use client';\n\nimport React, { useEffect } from 'react';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, cn } from '@/client/utils';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Cloud, AlertCircle } from 'lucide-react';\n\nexport const DriveStorageIndicator = (props: Readonly<{ compact?: boolean; className?: string }>) => {\n // ** Deconstruct Props\n const { compact = false, className } = props;\n\n const { quota, refreshQuota } = useDrive();\n\n useEffect(() => { refreshQuota(); }, []);\n\n if (!quota) return null;\n const { usedInBytes, totalInBytes, percentage } = quota;\n\n const isNearFull = percentage >= 90;\n const isFull = percentage >= 100;\n\n const stateColor = isFull ? \"text-destructive\" : isNearFull ? \"text-yellow-600 dark:text-yellow-500\" : \"text-primary\";\n const solidColor = isFull ? \"bg-destructive\" : isNearFull ? \"bg-yellow-500\" : \"bg-primary\";\n\n if (compact) {\n return (\n <div className={cn(\"flex items-center gap-3 text-xs font-medium text-muted-foreground\", className)}>\n <span className=\"shrink-0 flex items-center gap-1.5\">\n <Cloud className=\"size-3.5\" />\n Storage\n </span>\n <Progress value={percentage} indicatorClassName={cn(\"bg-gradient-to-r from-blue-500 to-cyan-500\", isNearFull && \"from-yellow-500 to-orange-500\", isFull && \"bg-destructive\")} className=\"w-24 sm:w-32\" />\n <span className=\"shrink-0 whitespace-nowrap\">{formatBytes(usedInBytes)} / {formatBytes(totalInBytes)}</span>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2\">\n <Cloud className={cn(\"size-4\", stateColor)} />\n <span className=\"text-xs font-medium text-muted-foreground\">Storage</span>\n </div>\n <span className=\"text-xs font-semibold tabular-nums\">\n {percentage}%\n </span>\n </div>\n\n <Progress\n value={percentage}\n className=\"h-1.5\"\n indicatorClassName={cn(\n \"transition-all duration-500\",\n isFull ? \"bg-destructive\" : isNearFull ? \"bg-yellow-500\" : \"bg-gradient-to-r from-blue-500 to-purple-500\"\n )}\n />\n\n <div className=\"flex justify-between items-center mt-1.5\">\n <span className=\"text-[10px] text-muted-foreground tabular-nums\">\n {formatBytes(usedInBytes)}\n </span>\n <span className=\"text-[10px] text-muted-foreground tabular-nums\">\n {formatBytes(totalInBytes)}\n </span>\n </div>\n\n {isNearFull && (\n <div className={cn(\n \"flex items-center gap-1.5 text-[10px] font-medium px-2 py-1 rounded-md mt-2\",\n isFull ? \"bg-destructive/10 text-destructive\" : \"bg-yellow-500/10 text-yellow-600 dark:text-yellow-500\"\n )}>\n <AlertCircle className=\"size-3 shrink-0\" />\n <span>{isFull ? \"Storage full\" : \"Almost full\"}</span>\n </div>\n )}\n </>\n );\n};\n","// ** Drive File Chooser Component - Completely Redesigned\n'use client';\n\nimport React, { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { cn, getFileIcon } from '@/client/utils';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/dialog-fullscreen';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd-provider';\nimport { DriveHeader } from '@/client/components/drive/header';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Icons\nimport {\n Upload as UploadIcon, X, Menu, FolderOpen, Trash2,\n Database, HardDrive, ChevronsUpDown, Check, Plus, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\n\n// ============================================================================\n// INLINE SIDEBAR - Simplified for the chooser context\n// ============================================================================\nconst ChooserSidebar = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', { method: 'PATCH', query: { id: account.id }, body: JSON.stringify({ name: newName.trim() }) });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', ml);\n window.removeEventListener('storage', sl);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const ml = (e: MessageEvent) => { if (e.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n const sl = (e: StorageEvent) => { if (e.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n window.addEventListener('message', ml);\n window.addEventListener('storage', sl);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"flex flex-col h-full w-full bg-muted/5 dark:bg-muted/10\">\n {/* Account Switcher */}\n <div className=\"p-2 border-b border-border/50\">\n <div className=\"flex items-center gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"flex-1 flex items-center gap-2 px-2 h-11 min-w-0\">\n <div className=\"size-7 rounded-md flex items-center justify-center shrink-0 bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <HardDrive className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">Local Storage</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"flex-1 min-w-0 justify-between px-2 h-11 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <div className=\"flex items-center gap-2 text-left min-w-0 flex-1\">\n <div className={cn(\n \"size-7 rounded-md flex items-center justify-center shrink-0\",\n activeAccountId ? \"bg-blue-500/10 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400\" : \"bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"size-3.5\" /> : <HardDrive className=\"size-3.5\" />}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{currentAccountName}</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"start\">\n <DropdownMenuLabel className=\"text-[11px] font-medium text-muted-foreground uppercase tracking-wide\">Storage</DropdownMenuLabel>\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"gap-2 py-2\">\n <span className=\"flex-1 text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n {accounts.length > 0 && <DropdownMenuSeparator />}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"gap-2 py-2\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm truncate\">{account.name}</p>\n <p className=\"text-[10px] text-muted-foreground truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"gap-2\"><Plus className=\"size-3.5\" /><span className=\"text-sm\">Add Account</span></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>Google Drive</DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9 shrink-0 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <Settings2 className=\"size-4 text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => { setRenameDialog({ open: true, account: currentAccount }); }}>\n <Pencil className=\"size-3.5 mr-2\" /> Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"size-3.5 mr-2\" /> Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => setDeleteDialog({ open: true, account: currentAccount })}>\n <Trash className=\"size-3.5 mr-2\" /> Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 p-2 space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\", currentView !== 'TRASH' ? \"bg-primary/10 text-primary hover:bg-primary/15\" : \"hover:bg-muted/50\")}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"size-4\" /> My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\", currentView === 'TRASH' ? \"bg-destructive/10 text-destructive hover:bg-destructive/15\" : \"hover:bg-muted/50\")}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"size-4\" /> Trash\n </Button>\n </nav>\n\n {/* Storage */}\n <div className=\"p-2.5 border-t border-border/50 bg-background/50 dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Dialogs */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"sm:max-w-xs\" showCloseButton={false}>\n <div className=\"flex flex-col items-center gap-4 py-4\">\n <Loader2 className=\"size-8 text-primary animate-spin\" />\n <div className=\"text-center\">\n <DialogTitle className=\"text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"text-sm mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ============================================================================\n// MOBILE SIDEBAR SHEET\n// ============================================================================\nconst MobileSidebarSheet = () => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9 md:hidden shrink-0\">\n <Menu className=\"size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-72 p-0\" hideCloseButton>\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">Storage and navigation</SheetDescription>\n <ChooserSidebar onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n );\n};\n\n// ============================================================================\n// MAIN FILE CHOOSER COMPONENT\n// ============================================================================\nexport const DriveFileChooser = (props: Readonly<{\n value: TDriveFile | TDriveFile[] | null;\n onChange: (files: TDriveFile | TDriveFile[] | null) => void;\n multiple?: boolean;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n}>) => {\n // ** Deconstruct Props\n const {\n value, onChange, multiple = false, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText\n } = props;\n\n const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();\n const [isOpen, setIsOpen] = useState(false);\n\n // Sync selection on open and trigger fetch\n useEffect(() => {\n if (isOpen) {\n // Trigger API fetch when dialog opens (for lazy mode)\n triggerFetch();\n \n if (!value) setSelectedFileIds([]);\n else if (Array.isArray(value)) setSelectedFileIds(value.map(f => f.id));\n else setSelectedFileIds([value.id]);\n }\n }, [isOpen, value, setSelectedFileIds, triggerFetch]);\n\n const handleConfirm = useCallback(() => {\n const selectedItems = items.filter(item => selectedFileIds.includes(item.id));\n const files: TDriveFile[] = selectedItems.map(item => ({\n id: item.id,\n file: {\n name: item.name,\n mime: item.information.type === 'FILE' ? item.information.mime : '',\n size: item.information.type === 'FILE' ? item.information.sizeInBytes : 0\n }\n }));\n onChange(multiple ? files : files[0] || null);\n setIsOpen(false);\n }, [items, selectedFileIds, multiple, onChange]);\n\n const handleRemove = useCallback((idToRemove: string) => {\n if (multiple && Array.isArray(value)) onChange(value.filter(f => f.id !== idToRemove));\n else onChange(null);\n }, [multiple, value, onChange]);\n\n const hasSelection = value && (Array.isArray(value) ? value.length > 0 : true);\n const displayFiles = useMemo(() => !value ? [] : Array.isArray(value) ? value : [value], [value]);\n\n return (\n <div className={cn(\"w-full\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n className={cn(\n \"w-full h-auto justify-start gap-3 px-3 py-2.5 border-dashed\",\n error && \"border-destructive\"\n )}\n >\n <div className={cn(\n \"size-9 rounded-lg flex items-center justify-center shrink-0\",\n error ? \"bg-destructive/10 text-destructive\" : \"bg-muted/50 text-muted-foreground\"\n )}>\n <UploadIcon className=\"size-4\" />\n </div>\n <div className=\"flex-1 min-w-0 text-left\">\n <p className={cn(\"text-sm font-medium\", error && \"text-destructive\")}>\n {multiple ? \"Select files\" : \"Select a file\"}\n </p>\n <p className=\"text-xs text-muted-foreground font-normal truncate\">{placeholder}</p>\n </div>\n </Button>\n ) : (\n /* Selected Files Display */\n <div className={cn(\"rounded-lg border\", error ? \"border-destructive\" : \"border-border\", disabled && \"opacity-50\")}>\n {!multiple && displayFiles[0] && (\n <div className=\"flex items-center gap-3 p-2.5\">\n <div className=\"size-12 rounded-lg overflow-hidden bg-muted/30 flex items-center justify-center shrink-0\">\n {displayFiles[0].file.mime.startsWith('image/') ? (\n <img src={createUrl(displayFiles[0], { quality: 'low', format: 'webp' })} alt={displayFiles[0].file.name} className=\"size-full object-cover\" />\n ) : (\n getFileIcon(displayFiles[0].file.mime, false, \"size-6 text-muted-foreground\")\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{displayFiles[0].file.name}</p>\n <p className=\"text-xs text-muted-foreground\">{displayFiles[0].file.mime || 'File'}</p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsOpen(true)} disabled={disabled}>Change</Button>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-8\" onClick={() => handleRemove(displayFiles[0].id)}>\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {multiple && (\n <>\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/20\">\n <span className=\"text-xs text-muted-foreground font-medium\">{displayFiles.length} file{displayFiles.length !== 1 ? 's' : ''} selected</span>\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => setIsOpen(true)} disabled={disabled}>Add more</Button>\n {!disabled && <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={() => onChange([])}>Clear</Button>}\n </div>\n </div>\n <div className=\"max-h-40 overflow-y-auto divide-y divide-border/50\">\n {displayFiles.map((file) => (\n <div key={file.id} className=\"flex items-center gap-2.5 px-3 py-2 hover:bg-muted/20\">\n <div className=\"size-8 rounded overflow-hidden bg-muted/30 flex items-center justify-center shrink-0\">\n {file.file.mime.startsWith('image/') ? (\n <img src={createUrl(file, { quality: 'ultralow', format: 'webp' })} alt={file.file.name} className=\"size-full object-cover\" />\n ) : (\n getFileIcon(file.file.mime, false, \"size-4 text-muted-foreground\")\n )}\n </div>\n <span className=\"flex-1 text-sm truncate\">{file.file.name}</span>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0\" onClick={() => handleRemove(file.id)}>\n <X className=\"size-3.5\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {error && helperText && <p className=\"text-xs text-destructive mt-1.5\">{helperText}</p>}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content showCloseButton={false}>\n {/* Header */}\n <Dialog2Header className=\"gap-2\">\n <MobileSidebarSheet />\n <Dialog2Title className=\"flex-1\">Select {multiple ? 'Files' : 'File'}</Dialog2Title>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-8\" onClick={() => setIsOpen(false)}>\n <X className=\"size-4\" />\n </Button>\n </Dialog2Header>\n\n {/* Body */}\n <Dialog2Body className=\"flex flex-col md:flex-row\">\n {/* Sidebar - Desktop */}\n <div className=\"hidden md:flex w-52 lg:w-56 border-r shrink-0\">\n <ChooserSidebar />\n </div>\n\n {/* Main Content */}\n <DriveDndProvider>\n <div className=\"flex-1 flex flex-col min-w-0 min-h-0\">\n <DriveHeader className=\"border-b\" />\n <div className=\"flex items-center gap-2 px-3 py-2 border-b bg-muted/20 dark:bg-muted/10\">\n <DrivePathBar className=\"flex-1\" />\n <DriveUpload compact accept={accept} />\n </div>\n <DriveFileGrid mimeFilter={accept} className=\"flex-1\" />\n </div>\n </DriveDndProvider>\n </Dialog2Body>\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectedFileIds.length === 0}>\n Select{selectedFileIds.length > 0 ? ` (${selectedFileIds.length})` : ''}\n </Button>\n </Dialog2Footer>\n </Dialog2Content>\n </Dialog2>\n </div>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Database, HardDrive, Plus, Check,\n ChevronsUpDown, FolderOpen, Trash2, Menu, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Sidebar Content Component (reusable for both desktop and mobile)\nconst SidebarContent = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n // Dialog states for account management\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', {\n method: 'PATCH',\n query: { id: account.id },\n body: JSON.stringify({ name: newName.trim() })\n });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n window.removeEventListener('storage', storageListener);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const messageListener = (event: MessageEvent) => {\n if (event.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n const storageListener = (event: StorageEvent) => {\n if (event.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n window.addEventListener('message', messageListener);\n window.addEventListener('storage', storageListener);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch (err) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"w-full h-full flex flex-col bg-muted/5 dark:bg-muted/10\">\n {/* Account Switcher - Compact */}\n <div className=\"p-2 border-b border-border/50\">\n <div className=\"flex items-center gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"flex-1 flex items-center gap-2.5 px-2 h-11 min-w-0\">\n <div className=\"size-7 rounded-md flex items-center justify-center shrink-0 bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <HardDrive className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">Local Storage</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"flex-1 min-w-0 justify-between px-2 h-11 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <div className=\"flex items-center gap-2.5 text-left min-w-0 flex-1\">\n <div className={cn(\n \"size-7 rounded-md flex items-center justify-center shrink-0\",\n activeAccountId\n ? \"bg-blue-500/10 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400\"\n : \"bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"size-3.5\" /> : <HardDrive className=\"size-3.5\" />}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{currentAccountName}</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"start\">\n <DropdownMenuLabel className=\"text-[11px] font-medium text-muted-foreground uppercase tracking-wide\">\n Storage\n </DropdownMenuLabel>\n\n {/* Local Storage */}\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"gap-2 py-2\">\n <span className=\"flex-1 text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n\n {accounts.length > 0 && <DropdownMenuSeparator />}\n\n {/* Connected Accounts */}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"gap-2 py-2\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm truncate\">{account.name}</p>\n <p className=\"text-[10px] text-muted-foreground truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"gap-2\">\n <Plus className=\"size-3.5\" />\n <span className=\"text-sm\">Add Account</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>\n Google Drive\n </DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-9 shrink-0 hover:bg-muted/50 dark:hover:bg-muted/30\"\n >\n <Settings2 className=\"size-4 text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => {\n setRenameDialog({ open: true, account: currentAccount });\n }}>\n <Pencil className=\"size-3.5 mr-2\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"size-3.5 mr-2\" />\n Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => setDeleteDialog({ open: true, account: currentAccount })}\n >\n <Trash className=\"size-3.5 mr-2\" />\n Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 p-2 space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\n \"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\",\n currentView !== 'TRASH'\n ? \"bg-primary/10 text-primary hover:bg-primary/15 dark:bg-primary/15 dark:hover:bg-primary/20\"\n : \"hover:bg-muted/50 dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"size-4\" />\n My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\n \"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\",\n currentView === 'TRASH'\n ? \"bg-destructive/10 text-destructive hover:bg-destructive/15 dark:bg-destructive/15\"\n : \"hover:bg-muted/50 dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"size-4\" />\n Trash\n </Button>\n </nav>\n\n {/* Storage Indicator */}\n <div className=\"p-2.5 border-t border-border/50 bg-background/50 dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Rename Dialog */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Are you sure you want to disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed from local cache.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"sm:max-w-xs\" showCloseButton={false}>\n <div className=\"flex flex-col items-center gap-4 py-4\">\n <Loader2 className=\"size-8 text-primary animate-spin\" />\n <div className=\"text-center\">\n <DialogTitle className=\"text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"text-sm mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ** Desktop Sidebar (always visible on larger screens)\nexport const DriveSidebar = ({ className }: { className?: string }) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <div className={className}>\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9\" aria-label=\"Open menu\">\n <Menu className=\"size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-70 sm:w-80 p-0\" hideCloseButton>\n <SheetTitle className=\"sr-only\">Navigation Menu</SheetTitle>\n <SheetDescription className=\"sr-only\">Storage accounts and navigation</SheetDescription>\n <SidebarContent onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n </div>\n );\n};\n","// ** DriveExplorer Component\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight } from 'lucide-react';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport { Pencil, Trash2, FolderPlus } from \"lucide-react\";\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { DriveContentProgress } from '@/client/components/drive/header';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id, disabled });\n\n // Don't apply transform when this is a folder being hovered (prevents sliding)\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className, selectableFolders = false } = props;\n const {\n items, isLoading, error, apiEndpoint, currentFolderId,\n setItems,\n viewMode, groupBy, sortBy, setSortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n callAPI, currentView, moveItem, deleteItem, restoreItem, createFolder, renameItem: renameItemAction\n } = useDrive();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({\n newFolder: false,\n rename: false,\n delete: false\n });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Item State\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Drag & Drop State\n const [dragOverFolderId, setDragOverFolderId] = React.useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = React.useState<string | null>(null);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), // Prevent drag on simple click\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handle Drag Start\n const handleDragStart = (event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n };\n\n // ** Handle Drag Over (track folder hover)\n const handleDragOver = (event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n const overItem = items.find(i => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n };\n\n // ** Handle Drag End\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) {\n return;\n }\n\n // Check if dropping on a path bar item\n const overId = over.id as string;\n if (overId.startsWith('path-')) {\n const targetFolderId = overId.replace('path-', '');\n // Move to target folder (root = 'root')\n await moveItem(active.id as string, targetFolderId === 'root' ? 'root' : targetFolderId);\n return;\n }\n\n const overItem = items.find(i => i.id === over.id);\n const activeItem = items.find(i => i.id === active.id);\n\n // If dropping on a folder (and not the item itself), MOVE into folder\n if (overItem?.information.type === 'FOLDER' && activeItem) {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Otherwise, reorder\n // Optimistic Update\n setItems((prevItems) => {\n const oldIndex = prevItems.findIndex((i) => i.id === active.id);\n const newIndex = prevItems.findIndex((i) => i.id === over.id);\n return arrayMove(prevItems, oldIndex, newIndex);\n });\n\n // Switch to custom order if not already\n if (sortBy.field !== 'order') {\n setSortBy({ field: 'order', order: 1 });\n }\n\n // Sync with Server\n const oldIndex = items.findIndex((i) => i.id === active.id);\n const newIndex = items.findIndex((i) => i.id === over.id);\n const newOrderIds = arrayMove(items, oldIndex, newIndex).map(i => i.id);\n\n await callAPI('reorder', {\n method: 'POST',\n body: JSON.stringify({ ids: newOrderIds })\n });\n };\n\n // ** Filter & Sort Items (Memoized)\n // Note: If we drag, we update 'items'. The Memo needs to respect 'items' order if sortBy.field === 'order'.\n const processedItems = useMemo(() => {\n let filtered = items;\n\n if (mimeFilter) {\n filtered = filtered.filter(item => matchesMimeFilter(item.information.type === 'FILE' ? item.information.mime : '', item.information.type === 'FOLDER', mimeFilter));\n }\n\n return [...filtered].sort((a, b) => {\n // Always folders first\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n\n const field = sortBy.field;\n const order = sortBy.order;\n\n if (field === 'order') {\n // If we are sorting by order, we trust the array index implicity or use explicit order field if stable.\n // However, dnd-kit arrayMove changes array index.\n // But DB store `order` number.\n // Since we update `items` state array order on drag, we should just return 0 (maintain array order)\n // OR sort by `a.order - b.order`.\n // If we optimistically update `items` array, we prefer the Array Order if field is 'order'.\n // But backend `reorder` updates `order` field.\n // Let's rely on Array Order if 'order', assuming `items` is loaded sorted by order initially?\n // `refreshItems` calls `list`. API `list` usually sorts by default.\n // If `sortBy.field` is 'order', we want to respect the current array order (which dnd manipulates).\n return 0; // Maintain array index order\n }\n\n let valA: any, valB: any;\n\n if (field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else { // createdAt / default\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n\n if (valA < valB) return -1 * order;\n if (valA > valB) return 1 * order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n // ... grouping logic same as before ...\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [],\n 'Yesterday': [],\n 'Earlier this Week': [],\n 'Last Week': [],\n 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll Observer\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n const handleItemClick = (e: React.MouseEvent | React.TouchEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n onItemClick?.(item);\n return;\n }\n\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n onItemClick?.(item);\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // This is for mouse double-click on desktop\n if (item.information.type === 'FOLDER') {\n if (currentView === 'BROWSE') navigateToFolder(item);\n }\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n const stateContent = (() => {\n // Loading State (empty)\n if (isLoading && items.length === 0) {\n return <div className=\"flex items-center justify-center py-12 flex-1\"><Loader2 className=\"size-6 animate-spin text-muted-foreground\" /></div>;\n }\n // Error State\n if (error) {\n return <div className=\"flex items-center justify-center p-12 text-destructive bg-destructive/10 rounded-lg flex-1\">{error}</div>;\n }\n // Empty State\n if (processedItems.length === 0) {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"flex flex-col items-center justify-center py-12 text-center flex-1\", className)}>\n <div className=\"size-12 rounded-full bg-muted flex items-center justify-center mb-3\"><Folder className=\"size-6 text-muted-foreground\" /></div>\n <p className=\"text-sm text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'No files found'}\n </p>\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"mr-2 size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"px-2 py-6 text-center\">\n <p className=\"text-xs text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n }\n // Normal content (files/folders) - rendered below in main return\n return null;\n })();\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragStart={handleDragStart} onDragOver={handleDragOver} onDragEnd={handleDragEnd}>\n <div className=\"flex flex-col h-full w-full overflow-hidden bg-background/50 dark:bg-background/30 relative\">\n {/* Top Progress Bar */}\n <DriveContentProgress />\n\n {/* Header Row */}\n <div className=\"h-12 px-3 sm:px-4 border-b bg-background/95 dark:bg-background/80 backdrop-blur-sm flex items-center gap-3\">\n <DriveSidebar className=\"lg:hidden\" />\n <DrivePathBar className=\"hidden lg:flex flex-1\" />\n <DriveUpload compact accept={mimeFilter} />\n </div>\n\n {/* Path Bar - Mobile */}\n <div className=\"lg:hidden px-3 py-2 border-b bg-background/95 dark:bg-background/80 backdrop-blur-sm\">\n <DrivePathBar />\n </div>\n\n {stateContent || (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"flex-1 overflow-y-auto min-h-0 container mx-auto p-2 sm:p-3 md:p-4\", className)}>\n <div className=\"space-y-4 sm:space-y-6 pb-8 sm:pb-12\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName} className=\"space-y-3\">\n {groupBy !== 'NONE' && (\n <h3 className=\"text-sm font-medium text-muted-foreground flex items-center gap-2\">\n {groupName} <span className=\"text-xs opacity-50\">({groupItems.length})</span>\n </h3>\n )}\n <SortableContext items={groupItems.map(i => i.id)} strategy={rectSortingStrategy} disabled={!enableDrag}>\n <div className={cn(\n viewMode === 'GRID'\n ? \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 gap-2 sm:gap-3 md:gap-4\"\n : \"flex flex-col gap-1\"\n )}>\n {groupItems.map(item => {\n const isSelected = selectedFileIds.includes(item.id);\n const isFolder = item.information.type === 'FOLDER';\n const isDragOver = isFolder && dragOverFolderId === item.id;\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const fileUrl = `${apiEndpoint}?action=serve&id=${item.id}${tokenParam}`;\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=${viewMode === 'GRID' ? 'medium' : 'small'}${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <SortableItem key={item.id} id={item.id} disabled={!enableDrag} isDragOverTarget={isDragOver}>\n <ContextMenu>\n <ContextMenuTrigger>\n <div\n className={cn(\n \"group relative cursor-pointer transition-all focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\",\n viewMode === 'GRID'\n ? \"flex flex-col rounded-xl border bg-card dark:bg-card/50 hover:bg-accent/50 dark:hover:bg-accent/30 hover:shadow-sm overflow-hidden\"\n : \"flex items-center p-2 rounded-lg hover:bg-accent/50 dark:hover:bg-accent/30 gap-3 border border-transparent hover:border-border\",\n isSelected && \"ring-2 ring-primary border-primary/50 bg-accent/30 dark:bg-accent/20\",\n isDragOver && \"ring-2 ring-primary border-primary scale-[1.02] bg-primary/10 shadow-lg transition-transform\"\n )}\n onClick={(e) => handleItemClick(e, item)}\n onTouchEnd={(e) => {\n e.preventDefault();\n handleItemClick(e, item);\n }}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"aspect-square w-full bg-muted/20 dark:bg-muted/10 flex items-center justify-center overflow-hidden relative\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-contain transition-transform group-hover:scale-105 duration-300\" loading=\"lazy\" />\n ) : (\n <div className=\"transition-transform group-hover:scale-110 duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-10 text-muted-foreground/70\")}\n </div>\n )}\n {isSelected && (\n <div className=\"absolute top-2 right-2 size-5 bg-primary rounded-full flex items-center justify-center shadow-sm animate-in zoom-in-50\">\n <div className=\"size-2 bg-primary-foreground rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"absolute bottom-2 right-2 lg:hidden size-6 bg-primary/90 rounded-full flex items-center justify-center shadow-md\">\n <ChevronRight className=\"size-3.5 text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"p-2.5\">\n <p className=\"text-sm font-medium truncate\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"size-9 shrink-0 rounded-md overflow-hidden bg-muted/40 dark:bg-muted/20 flex items-center justify-center border\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-contain\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-4 text-muted-foreground\")\n )}\n </div>\n <span className=\"text-sm font-medium truncate flex-1\" title={item.name}>{item.name}</span>\n <span className=\"text-xs text-muted-foreground w-20 text-right shrink-0\">\n {isFolder ? '-' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </span>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"size-4 text-muted-foreground lg:hidden shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={() => restoreItem(item.id)}>\n <RotateCcw className=\"mr-2 size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"mr-2 size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={() => {\n setItemToRename(item);\n setDialogs(prev => ({ ...prev, rename: true }));\n }}>\n <Pencil className=\"mr-2 size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"mr-2 size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n </SortableItem>\n );\n })}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n {/* Infinite Scroll Sentinel */}\n {hasMore && (\n <div ref={observerTarget} className=\"flex justify-center py-4\">\n {isLoadingMore && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />}\n {!isLoadingMore && <div className=\"h-4 w-full\" />}\n </div>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"mr-2 size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"px-2 py-6 text-center\">\n <p className=\"text-xs text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n )}\n\n {/* Dialogs - Outside of ContextMenu to prevent z-index/portal issues */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => {\n setDialogs(prev => ({ ...prev, rename: false }));\n setItemToRename(null);\n }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => {\n setDialogs(prev => ({ ...prev, delete: false }));\n setItemToDelete(null);\n }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`\n }\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </div>\n </DndContext>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/context.tsx","../../src/client/hooks/useUpload.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/dialog-fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/dialog.tsx","../../src/client/components/ui/dropdown-menu.tsx","../../src/client/components/ui/alert.tsx","../../src/client/components/ui/input.tsx","../../src/client/components/ui/label.tsx","../../src/client/components/dialog.tsx","../../src/client/components/drive/RenameAccountDialog.tsx","../../src/client/components/drive/dnd-provider.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/CreateFolderDialog.tsx","../../src/client/components/drive/RenameDialog.tsx","../../src/client/components/drive/file-grid.tsx","../../src/client/components/drive/header.tsx","../../src/client/components/drive/path-bar.tsx","../../src/client/components/drive/upload.tsx","../../src/client/components/drive/storage/indicator.tsx","../../src/client/file-chooser.tsx","../../src/client/components/drive/sidebar.tsx","../../src/client/components/drive/explorer.tsx"],"names":["createContext","React","useState","useCallback","driveCreateUrl","driveCreateSrcSet","jsx","useContext","useRef","useEffect","cva","Slot","cn","DialogPrimitive","jsxs","X","SheetPrimitive","React2","DialogPrimitive2","DropdownMenuPrimitive","React3","ChevronRight","Check","Circle","Label","LabelPrimitive","AlertCircle","useForm","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","pointerWithin","ProgressPrimitive","ContextMenuPrimitive","React5","useSortable","CSS","Fragment","getFileIcon","formatBytes","RotateCcw","Trash2","Pencil","useMemo","matchesMimeFilter","startOfWeek","subWeeks","isToday","isYesterday","isAfter","items","Loader2","Folder","SortableContext","rectSortingStrategy","FolderPlus","Menu","Group","ArrowUpDown","Calendar","ArrowDownAZ","ArrowUpAZ","ArrowDown01","ArrowUp01","LayoutGrid","List","useDroppable","CheckCircle2","Clock","FileText","RefreshCw","UploadIcon","Cloud","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen","SortableItem","oldIndex","newIndex","closestCenter"],"mappings":"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","file":"index.cjs","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\nimport { driveCreateUrl, driveCreateSrcSet } from '@/client/utils';\n\n// ** Context Types\nexport type TDriveContext = {\n apiEndpoint: string;\n withCredentials: boolean;\n\n // ** Navigation\n currentFolderId: string | null;\n path: TDrivePathItem[];\n navigateToFolder: (item: { id: string | null; name: string } | null) => void;\n navigateUp: () => void;\n\n // ** Items\n items: TDatabaseDrive[];\n setItems: React.Dispatch<React.SetStateAction<TDatabaseDrive[]>>;\n isLoading: boolean;\n error: string | null;\n fetchItems: () => Promise<void>;\n triggerFetch: () => void;\n\n // ** Accounts\n accounts: { id: string; name: string; email: string; provider: 'GOOGLE' }[];\n activeAccountId: string | null;\n setActiveAccountId: (id: string | null) => void;\n refreshAccounts: () => Promise<void>;\n availableProviders: { google: boolean };\n\n // ** Storage\n quota: TDriveQuota | null;\n refreshQuota: () => Promise<void>;\n\n // ** UI State\n viewMode: 'GRID' | 'LIST';\n setViewMode: (mode: 'GRID' | 'LIST') => void;\n currentView: 'BROWSE' | 'TRASH' | 'SEARCH';\n setCurrentView: (view: 'BROWSE' | 'TRASH' | 'SEARCH') => void;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchScope: 'ACTIVE' | 'TRASH';\n setSearchScope: (scope: 'ACTIVE' | 'TRASH') => void;\n groupBy: 'NONE' | 'CREATED_AT';\n setGroupBy: (group: 'NONE' | 'CREATED_AT') => void;\n sortBy: { field: string; order: number };\n setSortBy: (sort: { field: string; order: number }) => void;\n\n // ** Selection\n selectionMode: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n selectedFileIds: string[];\n setSelectedFileIds: React.Dispatch<React.SetStateAction<string[]>>;\n\n // ** Pagination\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n\n // ** Utilities\n createUrl: (driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => string;\n createSrcSet: (driveFile: TDriveFile, format?: TImageFormat) => { srcSet: string; sizes: string };\n callAPI: <T>(action: string, options?: RequestInit & { query?: Record<string, string> }) => Promise<TDriveAPIResponse<T>>;\n\n // ** Actions (Optimistic)\n createFolder: (name: string) => Promise<void>;\n renameItem: (id: string, newName: string) => Promise<void>;\n deleteItem: (id: string) => Promise<void>;\n moveItem: (id: string, targetFolderId: string) => Promise<void>;\n restoreItem: (id: string) => Promise<void>;\n};\n\nconst DriveContext = createContext<TDriveContext | null>(null);\n\n// ** Provider\nexport const DriveProvider = (props: Readonly<{\n children: ReactNode;\n apiEndpoint: string;\n initialActiveAccountId?: string | null;\n initialSelectionMode?: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n defaultSelectedFileIds?: string[];\n withCredentials?: boolean;\n lazyFetch?: boolean;\n}>) => {\n const {\n children,\n apiEndpoint,\n initialActiveAccountId = null,\n initialSelectionMode = { type: 'SINGLE' },\n defaultSelectedFileIds = [],\n withCredentials = false,\n lazyFetch = false\n } = props;\n\n // Track if initial fetch has been triggered (for lazy mode)\n const [hasFetched, setHasFetched] = React.useState(!lazyFetch);\n\n // =========================================================================\n // STATE\n // =========================================================================\n\n // ** Items - Simple flat array for current view\n const [items, setItems] = useState<TDatabaseDrive[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // ** Navigation\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [path, setPath] = useState<TDrivePathItem[]>([{ id: null, name: 'Home' }]);\n\n // ** Accounts\n const [accounts, setAccounts] = useState<{ id: string; name: string; email: string; provider: 'GOOGLE' }[]>([]);\n const [activeAccountId, setActiveAccountIdState] = useState<string | null>(initialActiveAccountId);\n const [availableProviders, setAvailableProviders] = useState<{ google: boolean }>({ google: false });\n\n // ** Storage\n const [quota, setQuota] = useState<TDriveQuota | null>(null);\n\n // ** UI State\n const [viewMode, setViewMode] = useState<'GRID' | 'LIST'>(() => {\n if (typeof window !== 'undefined') return window.innerWidth < 768 ? 'LIST' : 'GRID';\n return 'GRID';\n });\n const [currentView, setCurrentView] = useState<'BROWSE' | 'TRASH' | 'SEARCH'>('BROWSE');\n const [searchQuery, setSearchQuery] = useState('');\n const [searchScope, setSearchScope] = useState<'ACTIVE' | 'TRASH'>('ACTIVE');\n const [groupBy, setGroupBy] = useState<'NONE' | 'CREATED_AT'>('NONE');\n const [sortBy, setSortBy] = useState<{ field: string; order: number }>({ field: 'createdAt', order: -1 });\n\n // ** Selection\n const [selectionMode] = useState(initialSelectionMode);\n const [selectedFileIds, setSelectedFileIds] = useState<string[]>(defaultSelectedFileIds);\n\n // ** Pagination\n const [hasMore, setHasMore] = useState(false);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // =========================================================================\n // API HELPER\n // =========================================================================\n\n const callAPI = useCallback(async <T,>(\n action: string,\n options?: RequestInit & { query?: Record<string, string> }\n ): Promise<TDriveAPIResponse<T>> => {\n const { query, ...fetchOptions } = options || {};\n const params = new URLSearchParams({ action, ...query });\n const url = `${apiEndpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...((fetchOptions?.headers as Record<string, string>) || {})\n };\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n return await res.json();\n } catch (err) {\n return { status: 0, message: err instanceof Error ? err.message : 'Network error' };\n }\n }, [apiEndpoint, activeAccountId, withCredentials]);\n\n // =========================================================================\n // FETCH FUNCTIONS\n // =========================================================================\n\n const fetchItems = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n let res: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'TRASH') {\n res = await callAPI('trash');\n } else if (currentView === 'SEARCH' && searchQuery) {\n res = await callAPI('search', { query: { q: searchQuery, limit: '50' } });\n } else {\n res = await callAPI('list', { query: { folderId: currentFolderId || 'root', limit: '50' } });\n }\n\n if (res.status === 200 && res.data) {\n setItems(res.data.items);\n setHasMore(!!res.data.hasMore);\n } else {\n setError(res.message || 'Failed to load');\n setItems([]);\n }\n\n setIsLoading(false);\n }, [callAPI, currentFolderId, currentView, searchQuery]);\n\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading || isLoadingMore) return;\n\n const lastItem = items[items.length - 1];\n if (!lastItem) return;\n\n setIsLoadingMore(true);\n\n const res = await callAPI<{ items: TDatabaseDrive[]; hasMore?: boolean }>('list', {\n query: { folderId: currentFolderId || 'root', limit: '50', afterId: lastItem.id }\n });\n\n if (res.status === 200 && res.data) {\n setItems(prev => [...prev, ...res.data!.items]);\n setHasMore(!!res.data.hasMore);\n }\n\n setIsLoadingMore(false);\n }, [callAPI, currentFolderId, hasMore, isLoading, isLoadingMore, items]);\n\n const refreshAccounts = useCallback(async () => {\n const res = await callAPI<{ accounts: typeof accounts }>('listAccounts');\n if (res.status === 200 && res.data) setAccounts(res.data.accounts);\n\n // Also fetch available providers\n const infoRes = await callAPI<{ providers: { google: boolean } }>('information');\n if (infoRes.status === 200 && infoRes.data) setAvailableProviders(infoRes.data.providers);\n }, [callAPI]);\n\n const refreshQuota = useCallback(async () => {\n const res = await callAPI<TDriveQuota>('quota');\n if (res.status === 200 && res.data) setQuota(res.data);\n }, [callAPI]);\n\n // =========================================================================\n // NAVIGATION\n // =========================================================================\n\n const setActiveAccountId = useCallback((id: string | null) => {\n setActiveAccountIdState(id);\n if (id) localStorage.setItem('drive_active_account', id);\n else localStorage.removeItem('drive_active_account');\n // Reset state\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setItems([]);\n setSelectedFileIds([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n\n if (!item) {\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n return;\n }\n\n setCurrentFolderId(item.id);\n setPath(prev => {\n const idx = prev.findIndex(p => p.id === item.id);\n return idx !== -1 ? prev.slice(0, idx + 1) : [...prev, { id: item.id, name: item.name }];\n });\n }, []);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n const newPath = path.slice(0, -1);\n setPath(newPath);\n setCurrentFolderId(newPath[newPath.length - 1]?.id || null);\n }, [path]);\n\n // =========================================================================\n // OPTIMISTIC ACTIONS\n // =========================================================================\n\n const createFolder = useCallback(async (name: string) => {\n // Optimistic: Add temp folder\n const tempId = `temp-${Date.now()}`;\n const tempFolder = {\n id: tempId,\n name,\n parentId: currentFolderId,\n information: { type: 'FOLDER' as const },\n createdAt: new Date(),\n trashedAt: null,\n } as TDatabaseDrive;\n setItems(prev => [tempFolder, ...prev]);\n\n // API call\n const res = await callAPI<{ item: TDatabaseDrive }>('createFolder', {\n method: 'POST',\n body: JSON.stringify({ name, parentId: currentFolderId || 'root' })\n });\n\n // Replace temp with real\n if ((res.status === 200 || res.status === 201) && res.data?.item) {\n setItems(prev => prev.map(i => i.id === tempId ? res.data!.item : i));\n } else {\n // Rollback\n setItems(prev => prev.filter(i => i.id !== tempId));\n }\n }, [callAPI, currentFolderId]);\n\n const renameItem = useCallback(async (id: string, newName: string) => {\n // Optimistic: Update name immediately\n setItems(prev => prev.map(i => i.id === id ? { ...i, name: newName } : i));\n\n // API call (fire and forget, already updated)\n await callAPI('rename', {\n method: 'PATCH',\n query: { id },\n body: JSON.stringify({ newName })\n });\n }, [callAPI]);\n\n const deleteItem = useCallback(async (id: string) => {\n // Optimistic: Remove from list immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call\n if (currentView === 'TRASH') {\n await callAPI('deletePermanent', { query: { id } });\n } else {\n await callAPI('delete', { query: { id } });\n }\n }, [callAPI, currentView]);\n\n const moveItem = useCallback(async (id: string, targetFolderId: string) => {\n // Optimistic: Remove from current view (it's moving away)\n setItems(prev => prev.filter(i => i.id !== id));\n\n // API call\n await callAPI('move', {\n method: 'POST',\n body: JSON.stringify({ ids: [id], targetFolderId })\n });\n }, [callAPI]);\n\n const restoreItem = useCallback(async (id: string) => {\n // Optimistic: Remove from trash view immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call in background\n await callAPI('restore', { method: 'POST', query: { id } });\n }, [callAPI]);\n\n // =========================================================================\n // UTILITIES\n // =========================================================================\n\n const createUrl = useCallback((driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => {\n return driveCreateUrl(driveFile, apiEndpoint, options);\n }, [apiEndpoint]);\n\n const createSrcSet = useCallback((driveFile: TDriveFile, format?: TImageFormat) => {\n return driveCreateSrcSet(driveFile, apiEndpoint, format);\n }, [apiEndpoint]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n\n // Load stored account on mount\n React.useEffect(() => {\n const stored = localStorage.getItem('drive_active_account');\n if (stored) setActiveAccountIdState(stored);\n }, []);\n\n // Fetch items when view/folder/account changes (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n fetchItems();\n }, [fetchItems, hasFetched]);\n\n // Fetch accounts & quota on mount and account change (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshAccounts();\n }, [refreshAccounts, hasFetched]);\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshQuota();\n }, [refreshQuota, activeAccountId, hasFetched]);\n\n // Trigger initial fetch (used by components to start fetching in lazy mode)\n const triggerFetch = React.useCallback(() => {\n if (!hasFetched) setHasFetched(true);\n }, [hasFetched]);\n\n // =========================================================================\n // RENDER\n // =========================================================================\n\n return (\n <DriveContext.Provider value={{\n apiEndpoint,\n withCredentials,\n\n // Navigation\n currentFolderId,\n path,\n navigateToFolder,\n navigateUp,\n\n // Items\n items,\n setItems,\n isLoading,\n error,\n fetchItems,\n triggerFetch,\n\n // Accounts\n accounts,\n activeAccountId,\n setActiveAccountId,\n refreshAccounts,\n availableProviders,\n\n // Storage\n quota,\n refreshQuota,\n\n // UI\n viewMode,\n setViewMode,\n currentView,\n setCurrentView,\n searchQuery,\n setSearchQuery,\n searchScope,\n setSearchScope,\n groupBy,\n setGroupBy,\n sortBy,\n setSortBy,\n\n // Selection\n selectionMode,\n selectedFileIds,\n setSelectedFileIds,\n\n // Pagination\n hasMore,\n isLoadingMore,\n loadMore,\n\n // Utilities\n createUrl,\n createSrcSet,\n callAPI,\n\n // Optimistic Actions\n createFolder,\n renameItem,\n deleteItem,\n moveItem,\n restoreItem,\n }}>\n {children}\n </DriveContext.Provider>\n );\n};\n\n// ** Hook\nexport const useDrive = (): TDriveContext => {\n const context = useContext(DriveContext);\n if (!context) throw new Error('useDrive must be used within a DriveProvider');\n return context;\n};\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nconst getChunkSize = (fileSize: number) => {\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\n return 16 * 1024 * 1024;\n};\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: any) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n\n // ** Refs for data storage\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null }>>(new Map());\n\n const updateUpload = useCallback((id: string, updates: Partial<TDriveUploadState>) => {\n setUploads(prev => prev.map(u => (u.id === id ? { ...u, ...updates } : u)));\n }, []);\n\n const addLog = useCallback((id: string, type: 'info' | 'warning' | 'error' | 'success', message: string) => {\n setUploads(prev => prev.map(u => {\n if (u.id !== id) return u;\n const logs = u.logs || [];\n return { ...u, logs: [...logs, { type, message, timestamp: Date.now() }] };\n }));\n }, []);\n\n const uploadChunk = async (uploadId: string, formData: FormData): Promise<[boolean, any, boolean]> => {\n try {\n const headers: Record<string, string> = {};\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n const url = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\n addLog(uploadId, 'info', `Sending chunk to ${url}`);\n\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const text = await response.text();\n addLog(uploadId, 'error', `HTTP ${response.status}: ${response.statusText}`);\n try {\n const json = JSON.parse(text);\n const msg = json.message || json.error?.message || `Status ${response.status}`;\n addLog(uploadId, 'error', `Server response: ${msg}`);\n\n // Retry on Gateway errors (502, 503, 504) or Request Timeout (408) or Too Many Requests (429)\n const canRetry = [408, 429, 502, 503, 504].includes(response.status);\n if (canRetry) {\n addLog(uploadId, 'warning', `Error is retryable (status ${response.status})`);\n }\n return [false, msg, canRetry];\n } catch {\n // If parsing fails, it's likely a severe server error (500 HTML) or network glitch response?\n // Assume retryable for 5xx range, non-retryable for 4xx?\n addLog(uploadId, 'error', `Failed to parse error response: ${text.slice(0, 100)}`);\n const isRetryable = response.status >= 500 || response.status === 429;\n return [false, `Server error ${response.status}: ${text.slice(0, 100)}`, isRetryable];\n }\n }\n\n const data = await response.json();\n if (data.status !== 200) {\n addLog(uploadId, 'error', `Upload API error: ${data.message || 'Unknown error'}`);\n return [false, data.message || 'Upload failed', false]; // Business logic errors are fatal\n }\n\n addLog(uploadId, 'success', `Chunk uploaded successfully`);\n return [true, data.data, false];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Network error';\n addLog(uploadId, 'error', `Network/Fetch error: ${errorMsg}`);\n return [false, errorMsg, true]; // Network errors are retryable\n }\n };\n\n const processItem = async (item: TDriveUploadState, file: File, folderId: string | null) => {\n const controller = new AbortController();\n abortControllers.current.set(item.id, controller);\n\n addLog(item.id, 'info', `Starting upload: ${file.name} (${file.size} bytes)`);\n updateUpload(item.id, { status: 'uploading' });\n\n const chunkSize = getChunkSize(file.size);\n const totalChunks = Math.ceil(file.size / chunkSize);\n addLog(item.id, 'info', `File split into ${totalChunks} chunks of ${chunkSize} bytes each`);\n\n let driveId = item.driveId;\n\n try {\n for (let i = item.currentChunk; i < totalChunks; i++) {\n if (controller.signal.aborted) throw new Error('Cancelled');\n\n updateUpload(item.id, { currentChunk: i });\n addLog(item.id, 'info', `Processing chunk ${i + 1}/${totalChunks}`);\n\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n const formData = new FormData();\n formData.append('chunk', chunk);\n formData.append('chunkIndex', String(i));\n formData.append('totalChunks', String(totalChunks));\n formData.append('fileName', file.name);\n formData.append('fileSize', String(file.size));\n formData.append('fileType', file.type);\n formData.append('folderId', folderId || 'root');\n if (driveId) formData.append('driveId', driveId);\n\n // Smart retry logic\n let attempts = 0;\n let success = false;\n while (!success && attempts < 3 && !controller.signal.aborted) {\n const [ok, result, canRetry] = await uploadChunk(item.id, formData);\n if (ok) {\n success = true;\n if (result.type === 'UPLOAD_STARTED' && result.driveId) {\n driveId = result.driveId;\n updateUpload(item.id, { driveId });\n addLog(item.id, 'success', `Upload session started with ID: ${driveId}`);\n } else if (result.type === 'UPLOAD_COMPLETE') {\n // Single chunk upload complete\n addLog(item.id, 'success', `Upload completed successfully`);\n if (onUploadComplete) onUploadComplete(result.item);\n }\n } else {\n if (!canRetry) {\n addLog(item.id, 'error', `Non-retryable error: ${result as string}`);\n throw new Error(result as string); // Immediate failure for non-retryable errors\n }\n\n attempts++;\n addLog(item.id, 'warning', `Retry attempt ${attempts}/3 after error`);\n if (attempts === 3) {\n addLog(item.id, 'error', `Max retry attempts reached: ${result as string}`);\n throw new Error(result as string);\n }\n await new Promise(r => setTimeout(r, 1000 * attempts));\n }\n }\n }\n addLog(item.id, 'success', `All ${totalChunks} chunks uploaded successfully`);\n updateUpload(item.id, { status: 'complete', currentChunk: totalChunks });\n // Since we don't get the item in the final chunk response here easily without parsing the loop result,\n // wait, the server returns UPLOAD_COMPLETE with item in the last chunk response.\n // But loop logic handles it?\n // \"if (result.type === 'UPLOAD_COMPLETE')\" is handled inside the loop for single files OR last chunk.\n // So onUploadComplete is called there.\n // Wait, chunked upload response handling loop (lines 96-103) ONLY handles UPLOAD_STARTED.\n // I need to update the loop to checks for UPLOAD_COMPLETE too.\n } catch (error: any) {\n if (error.message === 'Cancelled') {\n addLog(item.id, 'warning', 'Upload cancelled by user');\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n addLog(item.id, 'error', `Upload failed: ${error.message}`);\n updateUpload(item.id, { status: 'error', error: error.message });\n }\n } finally {\n abortControllers.current.delete(item.id);\n }\n };\n\n const uploadFiles = useCallback(async (files: File[], folderId: string | null) => {\n const newUploads: TDriveUploadState[] = [];\n files.forEach(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const chunkSize = getChunkSize(file.size);\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n newUploads.push({\n id,\n name: file.name,\n size: file.size,\n status: 'queued',\n currentChunk: 0,\n totalChunks: Math.ceil(file.size / chunkSize),\n logs: [],\n });\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const cancelUpload = useCallback(\n async (id: string) => {\n const controller = abortControllers.current.get(id);\n if (controller) {\n controller.abort();\n } else {\n updateUpload(id, { status: 'cancelled' });\n }\n\n const upload = uploads.find(u => u.id === id);\n if (upload?.driveId) {\n fetch(`${apiEndpoint.replace(/\\/$/, '')}?action=cancel&id=${upload.driveId}`, {\n method: 'POST',\n credentials: withCredentials ? 'include' : 'same-origin',\n }).catch(() => { });\n }\n },\n [apiEndpoint, updateUpload, uploads, withCredentials],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['queued', 'uploading', 'pending'].includes(u.status)) {\n cancelUpload(u.id);\n }\n });\n }, [uploads, cancelUpload]);\n\n // ** Robust Scheduler\n useEffect(() => {\n const activeCount = uploads.filter(u => u.status === 'uploading').length;\n\n if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued');\n\n if (queued) {\n const file = filesRef.current.get(queued.id);\n const meta = metaRef.current.get(queued.id);\n\n if (file) {\n processItem(queued, file, meta?.folderId || null);\n }\n }\n // eslint-disable-next-line\n }, [uploads]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads };\n};\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/client/utils\"\n\n// ** Dialog2 - Modern fullscreen dialog on mobile, centered on desktop\nfunction Dialog2({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog2\" {...props} />\n}\n\nfunction Dialog2Trigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog2-trigger\" {...props} />\n}\n\nfunction Dialog2Close({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog2-close\" {...props} />\n}\n\nfunction Dialog2Content({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPrimitive.Portal data-slot=\"dialog2-portal\">\n {/* Overlay with higher z-index for proper stacking */}\n <DialogPrimitive.Overlay\n data-slot=\"dialog2-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\"\n )}\n />\n {/* Content: Fullscreen on mobile, centered modal on desktop */}\n <DialogPrimitive.Content\n data-slot=\"dialog2-content\"\n className={cn(\n // Base styles\n \"fixed z-50 flex flex-col bg-background shadow-2xl outline-none\",\n // Mobile: Full screen\n \"inset-0 rounded-none\",\n // Desktop: Centered modal with max dimensions\n \"md:inset-auto md:top-[50%] md:left-[50%] md:translate-x-[-50%] md:translate-y-[-50%]\",\n \"md:max-w-5xl md:w-[95vw] md:max-h-[90vh] md:rounded-xl md:border\",\n // Animations\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:slide-out-to-bottom-2 data-[state=open]:slide-in-from-bottom-2\",\n \"md:data-[state=closed]:zoom-out-95 md:data-[state=open]:zoom-in-95\",\n \"md:data-[state=closed]:slide-out-to-bottom-0 md:data-[state=open]:slide-in-from-bottom-0\",\n \"duration-200\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog2-close\"\n className={cn(\n \"absolute top-3 right-3 z-10\",\n \"flex items-center justify-center size-8 rounded-full\",\n \"bg-muted/80 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n \"md:top-4 md:right-4 md:size-7 md:rounded-md md:bg-transparent\"\n )}\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\n}\n\nfunction Dialog2Header({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-header\"\n className={cn(\n \"flex items-center justify-between shrink-0 px-4 h-14 border-b bg-background/95 backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Body({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-body\"\n className={cn(\"flex-1 min-h-0 overflow-hidden\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Footer({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-footer\"\n className={cn(\n \"flex items-center justify-end gap-2 shrink-0 px-4 py-3 border-t bg-background/95 backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Title({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog2-title\"\n className={cn(\"text-base font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Description({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog2-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog2,\n Dialog2Close,\n Dialog2Content,\n Dialog2Body,\n Dialog2Description,\n Dialog2Footer,\n Dialog2Header,\n Dialog2Title,\n Dialog2Trigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, hideCloseButton, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from \"react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import { useEffect, useState } from 'react';\nimport { AlertCircle } from \"lucide-react\";\nimport { Alert, AlertDescription, AlertTitle } from \"./ui/alert\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\n// ** Define input type with required field\ntype TInputDefinition = {\n type: 'INPUT',\n id: string,\n name: string,\n default?: string,\n required?: boolean\n};\n\n// ** Helper type to extract input values based on input definitions\ntype TInputValues<T extends readonly TInputDefinition[]> = { [K in T[number]['id']]: string };\n\nexport const DialogConfirmation = <T extends readonly TInputDefinition[] | undefined = undefined>(\n props: Readonly<{\n title: string\n description: string\n open: boolean\n onClose: () => void\n inputs?: T\n onConfirm: T extends readonly TInputDefinition[]\n ? (inputs: Readonly<TInputValues<T>>) => Promise<[true] | [false, string]>\n : () => Promise<[true] | [false, string]>\n disableEscapeKeyDown?: boolean\n }>\n) => {\n // ** Deconstruct Props\n const { title, description, onConfirm, disableEscapeKeyDown, inputs, onClose, open } = props\n\n // ** State\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [inputsValue, setInputsValue] = useState<{ [key: string]: string }>(() =>\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n\n // ** Function\n const handleConfirm = async () => {\n setIsLoading(true);\n setError(null);\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await (inputs ? (onConfirm as any)(inputsValue) : (onConfirm as any)());\n if (response[0]) {\n onClose();\n } else {\n setError(response[1]);\n }\n } catch (err) {\n setError(String(err));\n } finally {\n setIsLoading(false);\n }\n }\n\n const handleClose = () => {\n if (isLoading) return\n onClose()\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n }\n\n const handleKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && isFormValid()) {\n event.preventDefault()\n handleConfirm()\n }\n }\n\n const isFormValid = (): boolean => {\n if (!inputs) return true\n return inputs.every(input =>\n !input.required || (inputsValue[input.id] && inputsValue[input.id].trim() !== '')\n )\n }\n\n // ** Effect to reset input values when inputs change or dialog opens\n useEffect(() => {\n if (open) {\n setInputsValue(\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n setError(null)\n }\n }, [inputs, open])\n\n // ** Render\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {inputs && inputs.length > 0 && (\n <div className=\"grid gap-4 py-4\">\n {inputs.map((input, index) => (\n <div key={input.id} className=\"grid gap-2\">\n <Label htmlFor={input.id}>{input.name}</Label>\n <Input\n id={input.id}\n required={input.required}\n value={inputsValue[input.id] || ''}\n onChange={(e) =>\n setInputsValue({ ...inputsValue, [input.id]: e.target.value })\n }\n onKeyDown={index === inputs.length - 1 ? handleKeyPress : undefined}\n />\n </div>\n ))}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose} disabled={isLoading}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading || !isFormValid()}\n >\n Confirm\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype RenameAccountFormData = {\n name: string;\n};\n\ntype Account = {\n id: string;\n name: string;\n email: string;\n provider: 'GOOGLE';\n};\n\nexport const RenameAccountDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n account: Account | null;\n onConfirm: (account: Account, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, account, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameAccountFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or account changes\n useEffect(() => {\n if (open && account) {\n reset({ name: account.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById(\n 'rename-account-input'\n ) as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, account, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameAccountFormData) => {\n if (!account) return;\n\n try {\n await onConfirm(account, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename account:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename Account</DialogTitle>\n <DialogDescription>\n Enter a new display name for this storage account.\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"rename-account-input\">Account name</Label>\n <Input\n id=\"rename-account-input\"\n {...register('name', {\n required: 'Account name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Account name cannot be empty';\n if (trimmed.length > 255)\n return 'Account name is too long';\n return true;\n },\n })}\n placeholder=\"Enter account name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** Drive DnD Provider - Wraps PathBar and FileGrid for drag-drop between them\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useDrive } from '@/client/context';\nimport {\n DndContext,\n pointerWithin,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null\n});\n\nexport const useDriveDnd = () => useContext(DriveDndContext);\n\n// ** Provider Component\nexport const DriveDndProvider = (props: Readonly<{ children: React.ReactNode }>) => {\n // ** Deconstruct Props\n const { children } = props;\n\n const { items, setItems, sortBy, setSortBy, moveItem, callAPI, currentView } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n\n // ** DnD Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handlers\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n }, []);\n\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n\n const overId = over.id as string;\n\n // Check if hovering over a path item\n if (overId.startsWith('path-')) {\n setDragOverFolderId(overId);\n return;\n }\n\n // Check if hovering over a folder in the grid\n const overItem = items.find((i: { id: string }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n }, [items, draggingItemId]);\n\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) return;\n\n const overId = over.id as string;\n\n // Dropping on path bar item (e.g., \"path-root\" or \"path-abc123\")\n if (overId.startsWith('path-')) {\n const pathId = overId.slice(5); // Remove \"path-\" prefix\n const targetFolderId = pathId === 'root' || pathId === 'null' ? 'root' : pathId;\n await moveItem(active.id as string, targetFolderId);\n return;\n }\n\n // Dropping on a folder in the grid\n const overItem = items.find((i: { id: string; information: { type: string } }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER') {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Reordering items (optimistic)\n const oldIndex = items.findIndex((i: { id: string }) => i.id === active.id);\n const newIndex = items.findIndex((i: { id: string }) => i.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const reordered = arrayMove(items, oldIndex, newIndex);\n\n setItems(reordered);\n if (sortBy.field !== 'order') setSortBy({ field: 'order', order: 1 });\n\n // API call in background\n await callAPI('reorder', { method: 'POST', body: JSON.stringify({ ids: reordered.map((i: { id: string }) => i.id) }) });\n }, [items, setItems, sortBy, setSortBy, moveItem, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId }}>\n {enableDnd ? (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n ) : (\n children\n )}\n </DriveDndContext.Provider>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Progress({\n className,\n value,\n indicatorClassName,\n indeterminate = false,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & {\n indicatorClassName?: string;\n indeterminate?: boolean;\n}) {\n const isIndeterminate = indeterminate || value === undefined;\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"bg-primary h-full flex-1 transition-all\",\n isIndeterminate && \"w-1/3 animate-[indeterminate_1.5s_ease-in-out_infinite]\",\n !isIndeterminate && \"w-full\",\n indicatorClassName\n )}\n style={isIndeterminate ? undefined : { transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName =\n ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const CreateFolderDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n onConfirm: (name: string) => Promise<void>;\n}>) => {\n const { open, onClose, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<CreateFolderFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens\n useEffect(() => {\n if (open) {\n reset();\n // Focus input after a short delay to ensure dialog is rendered\n setTimeout(() => setFocus('name'), 100);\n }\n }, [open, reset, setFocus]);\n\n const handleFormSubmit = async (data: CreateFolderFormData) => {\n try {\n await onConfirm(data.name);\n reset();\n onClose();\n } catch (error) {\n // Error will be handled by parent component\n console.error('Failed to create folder:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Create New Folder</DialogTitle>\n <DialogDescription>\n Enter a name for the new folder\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"folder-name\">Folder name</Label>\n <Input\n id=\"folder-name\"\n {...register('name', {\n required: 'Folder name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Folder name cannot be empty';\n if (trimmed.length > 255)\n return 'Folder name is too long';\n return true;\n },\n })}\n placeholder=\"Enter folder name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\nimport type { TDatabaseDrive } from '@/types/server';\n\ntype RenameFormData = {\n name: string;\n};\n\nexport const RenameDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n item: TDatabaseDrive | null;\n onConfirm: (id: string, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, item, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or item changes\n useEffect(() => {\n if (open && item) {\n reset({ name: item.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById('rename-input') as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, item, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameFormData) => {\n if (!item) return;\n\n try {\n await onConfirm(item.id, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename item:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n const itemType = item?.information.type === 'FOLDER' ? 'Folder' : 'File';\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename {itemType}</DialogTitle>\n <DialogDescription>Enter a new name for this {itemType.toLowerCase()}</DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"rename-input\">Name</Label>\n <Input\n id=\"rename-input\"\n {...register('name', {\n required: 'Name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Name cannot be empty';\n if (trimmed.length > 255) return 'Name is too long';\n return true;\n },\n })}\n placeholder=\"Enter name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Renaming...' : 'Rename'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** DriveFileGrid Component - Pure file display (no chrome)\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useDriveDnd } from '@/client/components/drive/dnd-provider';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight, Pencil, Trash2 } from 'lucide-react';\nimport { Progress } from '@/client/components/ui/progress';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator\n} from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled });\n\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\n// ** File Item Component\nconst FileItem = (props: Readonly<{\n item: TDatabaseDrive;\n isSelected: boolean;\n isDragOver: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onDoubleClick: (e: React.MouseEvent) => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, onSelect, onDoubleClick, onRename, onDelete, onRestore } = props;\n\n const { apiEndpoint, viewMode, currentView } = useDrive();\n const isFolder = item.information.type === 'FOLDER';\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=small${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n className={cn(\n \"group relative cursor-pointer transition-all select-none\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary\",\n viewMode === 'GRID'\n ? \"flex flex-col rounded-lg sm:rounded-xl border bg-card dark:bg-card/50 hover:bg-accent/50 dark:hover:bg-accent/30 overflow-hidden\"\n : \"flex items-center gap-2 sm:gap-3 p-1.5 sm:p-2 rounded-lg border border-transparent hover:bg-accent/50 dark:hover:bg-accent/30 hover:border-border\",\n isSelected && \"ring-2 ring-primary border-primary/50 bg-primary/5 dark:bg-primary/10\",\n isDragOver && \"ring-2 ring-primary border-primary scale-[1.02] bg-primary/10 shadow-lg\"\n )}\n onClick={onSelect}\n onDoubleClick={onDoubleClick}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"aspect-square w-full bg-muted/30 dark:bg-muted/20 flex items-center justify-center overflow-hidden relative\">\n {isThumbnailable ? (\n <img\n src={thumbnailUrl}\n alt={item.name}\n className=\"size-full object-cover transition-transform group-hover:scale-105 duration-300\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"transition-transform group-hover:scale-110 duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-8 sm:size-10 md:size-12 text-muted-foreground/60\")}\n </div>\n )}\n {isSelected && (\n <div className=\"absolute top-1.5 right-1.5 sm:top-2 sm:right-2 size-5 bg-primary rounded-full flex items-center justify-center shadow-md animate-in zoom-in-50\">\n <div className=\"size-2 bg-primary-foreground rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"absolute bottom-1.5 right-1.5 sm:bottom-2 sm:right-2 lg:hidden size-5 sm:size-6 bg-primary/90 rounded-full flex items-center justify-center shadow-md\">\n <ChevronRight className=\"size-3 sm:size-3.5 text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"p-1.5 sm:p-2\">\n <p className=\"text-sm font-medium truncate leading-tight\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"size-10 shrink-0 rounded-lg overflow-hidden bg-muted/50 dark:bg-muted/30 flex items-center justify-center\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-cover\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-5 text-muted-foreground\")\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"size-4 text-muted-foreground lg:hidden shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={onRestore}>\n <RotateCcw className=\"mr-2 size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={onRename}>\n <Pencil className=\"mr-2 size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n};\n\n// ** Main FileGrid Component\nexport const DriveFileGrid = (props: Readonly<{\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, selectableFolders = false, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state from shared context\n const { dragOverFolderId } = useDriveDnd();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({ newFolder: false, rename: false, delete: false });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n\n\n // ** Process Items\n const processedItems = useMemo(() => {\n let filtered = items;\n if (mimeFilter) {\n filtered = filtered.filter(item =>\n matchesMimeFilter(\n item.information.type === 'FILE' ? item.information.mime : '',\n item.information.type === 'FOLDER',\n mimeFilter\n )\n );\n }\n\n return [...filtered].sort((a, b) => {\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n if (sortBy.field === 'order') return 0;\n\n let valA: any, valB: any;\n if (sortBy.field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (sortBy.field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else {\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n if (valA < valB) return -1 * sortBy.order;\n if (valA > valB) return 1 * sortBy.order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [], 'Yesterday': [], 'Earlier this Week': [], 'Last Week': [], 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n // Single tap/click on folder opens it, on file selects it\n // Double click also works for folders (desktop)\n const handleItemSelect = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n return;\n }\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n toggleSelection(item);\n onItemClick?.(item);\n };\n\n const toggleSelection = (item: TDatabaseDrive) => {\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n // ** Loading State (initial load - no items yet)\n if (isLoading && items.length === 0) {\n return (\n <div className={cn(\"flex-1 flex flex-col\", className)}>\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n </div>\n </div>\n );\n }\n\n // ** Error State\n if (error) {\n return (\n <div className={cn(\"flex-1 flex items-center justify-center p-8\", className)}>\n <p className=\"text-destructive font-medium text-center\">{error}</p>\n </div>\n );\n }\n\n // ** Empty State\n if (processedItems.length === 0) {\n return (\n <div className={cn(\"flex-1 flex flex-col items-center justify-center p-8 text-center\", className)}>\n <div className=\"size-16 rounded-2xl bg-muted/50 dark:bg-muted/30 flex items-center justify-center mb-4\">\n <Folder className=\"size-8 text-muted-foreground/60\" />\n </div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'This folder is empty'}\n </p>\n </div>\n );\n }\n\n // ** Main Grid\n return (\n <>\n {/* Loading Progress Bar - shows when navigating/searching with existing items */}\n {isLoading && (\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n )}\n\n <div className={cn(\"flex-1 overflow-y-auto min-h-0 p-2 sm:p-3 md:p-4\", className)}>\n <div className=\"space-y-4 sm:space-y-6\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName}>\n {groupBy !== 'NONE' && (\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-2 sm:mb-3 px-1\">\n {groupName} <span className=\"opacity-50\">({groupItems.length})</span>\n </h3>\n )}\n <SortableContext items={groupItems.map(i => i.id)} strategy={rectSortingStrategy} disabled={!enableDrag}>\n <div className={cn(\n viewMode === 'GRID'\n ? \"grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-7 gap-2 sm:gap-3\"\n : \"flex flex-col gap-1\"\n )}>\n {groupItems.map(item => (\n <SortableItem\n key={item.id}\n id={item.id}\n disabled={!enableDrag}\n isDragOverTarget={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n >\n <FileItem\n item={item}\n isSelected={selectedFileIds.includes(item.id)}\n isDragOver={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n onSelect={(e) => handleItemSelect(e, item)}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n onRename={() => { setItemToRename(item); setDialogs(prev => ({ ...prev, rename: true })); }}\n onDelete={() => { setItemToDelete(item); setDialogs(prev => ({ ...prev, delete: true })); }}\n onRestore={() => restoreItem(item.id)}\n />\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div ref={observerTarget} className=\"flex justify-center py-6\">\n {isLoadingMore && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />}\n </div>\n )}\n </div>\n\n {/* Dialogs */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => { setDialogs(prev => ({ ...prev, rename: false })); setItemToRename(null); }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => { setDialogs(prev => ({ ...prev, delete: false })); setItemToDelete(null); }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`}\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </>\n );\n};\n","// ** Drive Header\n'use client';\n\nimport React, { useState } from 'react';\nimport {\n Trash2, ArrowUpDown, LayoutGrid, List, Group, Calendar,\n ArrowDownAZ, ArrowUpAZ, ArrowDown01, ArrowUp01, Check, RotateCcw, Menu, FolderPlus\n} from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger\n} from '@/client/components/ui/dropdown-menu';\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\n\nexport const DriveHeader = ({ className }: { className?: string }) => {\n const {\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n selectedFileIds, setItems, setSelectedFileIds,\n currentView, setCurrentView, searchQuery, setSearchQuery,\n searchScope, setSearchScope, deleteItem, restoreItem, callAPI, createFolder\n } = useDrive();\n\n const [dialogs, setDialogs] = useState({ delete: false, emptyTrash: false, newFolder: false });\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2 bg-muted/30 dark:bg-muted/20 p-2\", className)}>\n {/* New Folder Button - Only in BROWSE view */}\n {currentView === 'BROWSE' && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}\n >\n <FolderPlus className=\"size-4\" />\n <span className=\"hidden sm:inline\">New Folder</span>\n </Button>\n )}\n\n {/* Actions Dropdown - Only show if there are actions available */}\n {(selectedFileIds.length > 0 || currentView === 'TRASH') && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Menu className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {/* Restore (Contextual) */}\n {selectedFileIds.length > 0 && currentView === 'TRASH' && (\n <DropdownMenuItem\n onClick={async () => {\n for (const id of selectedFileIds) {\n await restoreItem(id);\n }\n setSelectedFileIds([]);\n }}\n >\n <RotateCcw className=\"size-3.5 mr-2\" />\n Restore ({selectedFileIds.length})\n </DropdownMenuItem>\n )}\n\n {/* Delete (Contextual) */}\n {selectedFileIds.length > 0 && (\n <DropdownMenuItem\n onClick={() => setDialogs(prev => ({ ...prev, delete: true }))}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-3.5 mr-2\" />\n {currentView === 'TRASH' ? 'Delete Forever' : 'Delete'} ({selectedFileIds.length})\n </DropdownMenuItem>\n )}\n\n {/* Empty Trash (Contextual) */}\n {currentView === 'TRASH' && selectedFileIds.length === 0 && (\n <DropdownMenuItem\n onClick={() => setDialogs(prev => ({ ...prev, emptyTrash: true }))}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-3.5 mr-2\" />\n Empty Trash\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Group By Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant={groupBy !== \"NONE\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Group className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">\n {groupBy === \"NONE\" ? 'Group' : 'Grouped'}\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={() => setGroupBy(\"NONE\")}>\n {groupBy === \"NONE\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(groupBy !== \"NONE\" && \"pl-5.5\")}>\n No Grouping\n </span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setGroupBy(\"CREATED_AT\")}>\n {groupBy === \"CREATED_AT\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(groupBy !== \"CREATED_AT\" && \"pl-5.5\")}>\n Created Date\n </span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Search */}\n <div className=\"flex-1 min-w-0 sm:min-w-50 relative\">\n <Input\n type=\"text\"\n placeholder=\"Search files...\"\n className=\"w-full pl-8 pr-7 h-9\"\n value={searchQuery}\n onChange={(e) => {\n const val = e.target.value;\n setSearchQuery(val);\n if (val.trim().length > 0) {\n if (currentView !== 'SEARCH') {\n setSearchScope(currentView === 'TRASH' ? 'TRASH' : 'ACTIVE');\n }\n setCurrentView('SEARCH');\n } else if (currentView === 'SEARCH') {\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }\n }}\n />\n <div className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-search\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>\n </div>\n {searchQuery && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0.5 top-1/2 -translate-y-1/2 h-7 w-7 text-muted-foreground\"\n onClick={() => {\n setSearchQuery('');\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-x\"><path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" /></svg>\n </Button>\n )}\n </div>\n\n {/* Sort Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"gap-1.5\">\n <ArrowUpDown className=\"size-3.5\" />\n <span className=\"hidden sm:inline max-w-24 truncate\">\n {sortBy.field === \"id\" ? 'Default' :\n sortBy.field === \"order\" ? 'Custom' :\n sortBy.field === \"createdAt\" ? (sortBy.order === -1 ? 'Date: Newest' : 'Date: Oldest') :\n sortBy.field === \"name\" ? (sortBy.order === 1 ? 'Name: A to Z' : 'Name: Z to A') :\n sortBy.field === \"size\" ? (sortBy.order === -1 ? 'Size: Large' : 'Size: Small') :\n 'Sort'}\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setSortBy({ field: \"order\", order: 1 })}>\n {sortBy.field === \"order\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(sortBy.field !== \"order\" && \"pl-5.5\")}>Custom Order</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"id\", order: 1 })}>\n {sortBy.field === \"id\" && <Check className=\"size-3.5 mr-2\" />}\n <span className={cn(sortBy.field !== \"id\" && \"pl-5.5\")}>Default</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"createdAt\", order: -1 })}>\n {sortBy.field === \"createdAt\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <Calendar className={cn(\"size-3.5 mr-2\", sortBy.field === \"createdAt\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Date: Newest\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"createdAt\", order: 1 })}>\n {sortBy.field === \"createdAt\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <Calendar className={cn(\"size-3.5 mr-2\", sortBy.field === \"createdAt\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Date: Oldest\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"name\", order: 1 })}>\n {sortBy.field === \"name\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowDownAZ className={cn(\"size-3.5 mr-2\", sortBy.field === \"name\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Name: A to Z\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"name\", order: -1 })}>\n {sortBy.field === \"name\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowUpAZ className={cn(\"size-3.5 mr-2\", sortBy.field === \"name\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Name: Z to A\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setSortBy({ field: \"size\", order: -1 })}>\n {sortBy.field === \"size\" && sortBy.order === -1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowDown01 className={cn(\"size-3.5 mr-2\", sortBy.field === \"size\" && sortBy.order === -1 ? \"\" : \"ml-5.5\")} />\n Size: Large\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"size\", order: 1 })}>\n {sortBy.field === \"size\" && sortBy.order === 1 && <Check className=\"size-3.5 mr-2\" />}\n <ArrowUp01 className={cn(\"size-3.5 mr-2\", sortBy.field === \"size\" && sortBy.order === 1 ? \"\" : \"ml-5.5\")} />\n Size: Small\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"w-px h-5 bg-border\" />\n\n {/* View Toggles */}\n <div className=\"flex bg-muted/50 dark:bg-muted/30 rounded-md p-0.5 gap-0.5\">\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"h-8 w-8\",\n viewMode === \"GRID\" && \"bg-background shadow-sm hover:bg-background dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"GRID\")}\n aria-label=\"Grid View\"\n aria-pressed={viewMode === \"GRID\"}\n >\n <LayoutGrid className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"h-8 w-8\",\n viewMode === \"LIST\" && \"bg-background shadow-sm hover:bg-background dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"LIST\")}\n aria-label=\"List View\"\n aria-pressed={viewMode === \"LIST\"}\n >\n <List className=\"size-4\" />\n </Button>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => setDialogs(prev => ({ ...prev, delete: false }))}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete ${selectedFileIds.length} item(s). You cannot undo this action.`\n : `Are you sure you want to move ${selectedFileIds.length} item(s) to trash?`\n }\n onConfirm={async () => {\n if (selectedFileIds.length === 0) return [false, 'No files selected'];\n for (const id of selectedFileIds) {\n await deleteItem(id);\n }\n return [true];\n }}\n />\n\n {/* Empty Trash Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.emptyTrash}\n onClose={() => setDialogs(prev => ({ ...prev, emptyTrash: false }))}\n title=\"Empty Trash?\"\n description=\"All items in the trash will be permanently deleted. This action cannot be undone.\"\n onConfirm={async () => {\n await callAPI('emptyTrash', { method: 'POST' });\n setItems([]);\n return [true];\n }}\n />\n\n {/* New Folder Dialog */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n </div>\n );\n};\n\n// ** Content Progress Bar - Shows loading state at top of content area\nimport { Progress } from '@/client/components/ui/progress';\n\nexport const DriveContentProgress = () => {\n const { isLoading } = useDrive();\n\n if (!isLoading) return null;\n\n return (\n <div className=\"h-1 w-full shrink-0\">\n <Progress\n indeterminate\n className=\"h-full rounded-none bg-primary/10\"\n indicatorClassName=\"bg-primary\"\n />\n </div>\n );\n};\n","// ** PathBar Component\n'use client';\n\nimport React from 'react';\nimport { useDrive } from '@/client/context';\nimport { useDroppable } from '@dnd-kit/core';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\n\n// ** Droppable Path Item\nconst DroppablePathItem = (props: Readonly<{\n id: string | null;\n name: string;\n isLast: boolean;\n onClick: () => void;\n}>) => {\n // ** Deconstruct Props\n const { id, name, isLast, onClick } = props;\n const { currentFolderId } = useDrive();\n const droppableId = `path-${id ?? 'root'}`;\n\n const { isOver, setNodeRef } = useDroppable({\n id: droppableId,\n data: { type: 'pathItem', folderId: id }\n });\n\n // Don't allow drop on current folder\n const isCurrentFolder = id === currentFolderId;\n\n if (isLast) {\n return (\n <span\n ref={setNodeRef}\n className={cn(\n \"font-medium text-foreground px-1 text-xs sm:text-sm truncate max-w-30 sm:max-w-none\",\n isOver && !isCurrentFolder && \"bg-primary/20 rounded\"\n )}\n aria-current=\"page\"\n title={name}\n >\n {name}\n </span>\n );\n }\n\n return (\n <Button\n ref={setNodeRef}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-6 font-normal text-xs sm:text-sm px-1.5 sm:px-2 truncate max-w-25 sm:max-w-37.5\",\n isOver && !isCurrentFolder && \"ring-2 ring-primary bg-primary/10 scale-105\"\n )}\n onClick={onClick}\n type=\"button\"\n title={name}\n >\n {name}\n </Button>\n );\n};\n\nexport const DrivePathBar = ({ className }: { className?: string }) => {\n const { path, navigateToFolder } = useDrive();\n\n return (\n <ol className={cn(\"flex items-center gap-1 sm:gap-1.5 text-sm text-muted-foreground overflow-x-auto flex-nowrap min-w-0\", className)} aria-label=\"Breadcrumb\" role=\"navigation\">\n {path.map((item, index) => {\n const isLast = index === path.length - 1;\n return (\n <li key={item.id ?? 'root'} className=\"flex items-center gap-1 sm:gap-1.5 shrink-0\">\n {index > 0 && <span className=\"text-muted-foreground/50 text-xs\" aria-hidden=\"true\">/</span>}\n <DroppablePathItem\n id={item.id}\n name={item.name}\n isLast={isLast}\n onClick={() => navigateToFolder(item)}\n />\n </li>\n );\n })}\n </ol>\n );\n};\n","// ** Upload Component\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/useUpload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock, RefreshCw, FileText } from 'lucide-react';\nimport { cn, matchesMimeFilter } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/client/components/ui/dialog';\nimport type { TDriveUploadState } from '@/types/client';\n\nconst UploadStatusIcon = (props: Readonly<{ status: TDriveUploadState['status'] }>) => {\n const { status } = props;\n\n switch (status) {\n case 'complete':\n return <CheckCircle2 className=\"size-4 text-emerald-500\" />;\n case 'error':\n return <AlertCircle className=\"size-4 text-destructive\" />;\n case 'cancelled':\n return <X className=\"size-4 text-muted-foreground\" />;\n case 'uploading':\n return <Loader2 className=\"size-4 text-primary animate-spin\" />;\n default:\n return <Clock className=\"size-4 text-muted-foreground\" />;\n }\n};\n\nconst LogViewerDialog = (props: Readonly<{ upload: TDriveUploadState; open: boolean; onOpenChange: (open: boolean) => void }>) => {\n const { upload, open, onOpenChange } = props;\n const logs = upload.logs || [];\n\n const handleCopy = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n navigator.clipboard.writeText(logText);\n };\n\n const handleDownload = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n const blob = new Blob([logText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${upload.name}-logs.txt`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg p-0 gap-0 max-h-[85vh] flex flex-col\">\n <DialogHeader className=\"px-4 py-3 border-b\">\n <DialogTitle className=\"text-base truncate\">{upload.name}</DialogTitle>\n </DialogHeader>\n <div className=\"sticky top-0 z-10 bg-background px-4 py-2 border-b flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCopy}\n disabled={logs.length === 0}\n >\n Copy\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDownload}\n disabled={logs.length === 0}\n >\n Download\n </Button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-4 space-y-2\">\n {logs.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-8\">No logs available</p>\n )}\n {logs.map((log, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-start gap-2 p-2 rounded-md border text-sm\",\n log.type === 'error' && \"bg-destructive/5 border-destructive/20\",\n log.type === 'warning' && \"bg-yellow-500/5 border-yellow-500/20\",\n log.type === 'success' && \"bg-emerald-500/5 border-emerald-500/20\",\n log.type === 'info' && \"bg-muted/50 border-border\"\n )}\n >\n <div className={cn(\n \"shrink-0 size-1.5 rounded-full mt-1.5\",\n log.type === 'error' && \"bg-destructive\",\n log.type === 'warning' && \"bg-yellow-500\",\n log.type === 'success' && \"bg-emerald-500\",\n log.type === 'info' && \"bg-muted-foreground\"\n )} />\n <div className=\"flex-1 min-w-0 space-y-1\">\n <p className=\"break-words whitespace-pre-wrap\">{log.message}</p>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </p>\n </div>\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const DriveUpload = (props: Readonly<{\n compact?: boolean;\n onComplete?: (item: unknown) => void;\n accept?: string;\n}>) => {\n // ** Deconstruct Props\n const { compact = false, onComplete, accept } = props;\n\n const [isDragging, setIsDragging] = useState(false);\n const [showUploadsDialog, setShowUploadsDialog] = useState(false);\n const [logViewerUpload, setLogViewerUpload] = useState<TDriveUploadState | null>(null);\n const [manuallyOpened, setManuallyOpened] = useState(false);\n const hasAutoClosedRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { currentFolderId, setItems, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {\n // Optimistically add the uploaded item to the items list\n if (uploadedItem) {\n setItems(prev => [uploadedItem as TDatabaseDrive, ...prev]);\n }\n onComplete?.(uploadedItem);\n });\n\n // Auto-hide dialog when all uploads are finished (only once, and not if manually opened)\n React.useEffect(() => {\n if (!showUploadsDialog || uploads.length === 0 || manuallyOpened || hasAutoClosedRef.current) return;\n\n const allFinished = uploads.every(u =>\n ['complete', 'error', 'cancelled'].includes(u.status)\n );\n\n if (allFinished) {\n const timer = setTimeout(() => {\n setShowUploadsDialog(false);\n hasAutoClosedRef.current = true;\n }, 2000);\n return () => clearTimeout(timer);\n }\n }, [uploads, showUploadsDialog, manuallyOpened]);\n\n // Filter files based on accept prop\n const filterFiles = useCallback((files: File[]): File[] => {\n if (!accept) return files;\n return files.filter(file => matchesMimeFilter(file.type, false, accept));\n }, [accept]);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files || files.length === 0) return;\n const filteredFiles = filterFiles(Array.from(files));\n if (filteredFiles.length === 0) return;\n uploadFiles(filteredFiles, currentFolderId);\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, filterFiles]);\n\n const handleDrag = useCallback((e: React.DragEvent, dragging: boolean) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(dragging);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(false); handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const hasUploadsInProgress = uploads.some(u => ['uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['uploading', 'queued', 'pending'].includes(u.status));\n\n const renderDialog = () => (\n <Dialog open={showUploadsDialog} onOpenChange={setShowUploadsDialog}>\n <DialogContent className=\"sm:max-w-md p-0 gap-0\" showCloseButton={false}>\n <DialogHeader className=\"px-4 py-3 border-b flex-row items-center justify-between space-y-0\">\n <DialogTitle className=\"text-base\">Upload Status</DialogTitle>\n {hasUploadsInProgress && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-destructive hover:text-destructive\"\n onClick={cancelAllUploads}\n >\n Cancel All\n </Button>\n )}\n </DialogHeader>\n\n <div className=\"divide-y max-h-80 overflow-y-auto\">\n {uploads.length === 0 && (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">No uploads</div>\n )}\n {uploads.map((upload) => {\n const percent = upload.status === 'complete' ? 100 : (upload.status === 'error' || !upload.totalChunks) ? 0 : Math.round((upload.currentChunk / upload.totalChunks) * 100);\n return (\n <div key={upload.id} className=\"px-4 py-2.5\">\n <div className=\"flex items-start gap-2 mb-1.5\">\n <UploadStatusIcon status={upload.status} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{upload.name}</p>\n <p className={cn(\n \"text-xs break-words\",\n upload.status === 'error' ? \"text-destructive\" : \"text-muted-foreground\"\n )}>\n {upload.status === 'uploading' && 'Uploading...'}\n {upload.status === 'queued' && 'Waiting in queue'}\n {upload.status === 'pending' && 'Preparing...'}\n {upload.status === 'complete' && 'Upload complete'}\n {upload.status === 'error' && (upload.error || 'Upload failed')}\n {upload.status === 'cancelled' && 'Upload cancelled'}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {(upload.logs && upload.logs.length > 0) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setLogViewerUpload(upload)}\n title=\"View logs\"\n >\n <FileText className=\"size-3.5\" />\n </Button>\n )}\n {['uploading', 'queued', 'pending'].includes(upload.status) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => cancelUpload(upload.id)}\n title=\"Cancel\"\n >\n <X className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n {upload.status === 'uploading' && (\n <div className=\"flex items-center gap-2 pl-6\">\n <Progress value={percent} className=\"flex-1\" />\n <span className=\"text-xs tabular-nums text-muted-foreground w-8\">\n {percent}%\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </DialogContent>\n </Dialog>\n );\n\n if (compact) {\n return (\n <>\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n {activeAccountId && (\n <Button\n onClick={() => fetchItems()}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLoading}\n title=\"Refresh\"\n >\n <RefreshCw className={cn(\"!size-4 shrink-0\", isLoading && \"animate-spin\")} />\n </Button>\n )}\n <Button\n onClick={() => inputRef.current?.click()}\n type=\"button\"\n size=\"sm\"\n disabled={hasUploadsInProgress}\n >\n <UploadIcon className=\"!size-4 shrink-0\" />\n <span>Upload</span>\n </Button>\n\n {uploads.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}\n >\n {activeUploads.length > 0 ? (\n <Loader2 className=\"!size-4 shrink-0 animate-spin\" />\n ) : (\n <CheckCircle2 className=\"!size-4 shrink-0\" />\n )}\n <span>\n {activeUploads.length > 0\n ? `(${activeUploads.length})`\n : 'Status'\n }\n </span>\n </Button>\n )}\n </div>\n {renderDialog()}\n </>\n );\n }\n\n return (\n <div className=\"w-full\">\n <div\n className={cn(\n \"flex flex-col items-center justify-center p-8 border-2 border-dashed rounded-lg cursor-pointer transition-colors\",\n isDragging ? \"border-primary bg-primary/5\" : \"border-muted-foreground/25 hover:border-primary/50 hover:bg-muted/50\"\n )}\n onDragEnter={(e) => handleDrag(e, true)} onDragLeave={(e) => handleDrag(e, false)} onDragOver={(e) => handleDrag(e, true)} onDrop={handleDrop}\n onClick={() => inputRef.current?.click()} role=\"button\" tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"p-3 rounded-full bg-background border shadow-sm\">\n <UploadIcon className=\"size-6 text-muted-foreground\" />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {isDragging ? 'Drop files here' : 'Click or drag files to upload'}\n </div>\n </div>\n </div>\n\n {hasUploadsInProgress && (\n <div className=\"mt-4 text-center\">\n <Button variant=\"link\" onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}>View Upload Progress</Button>\n </div>\n )}\n {renderDialog()}\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n </div>\n );\n};\n","// ** DriveStorageIndicator Component\n'use client';\n\nimport React, { useEffect } from 'react';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, cn } from '@/client/utils';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Cloud, AlertCircle } from 'lucide-react';\n\nexport const DriveStorageIndicator = (props: Readonly<{ compact?: boolean; className?: string }>) => {\n // ** Deconstruct Props\n const { compact = false, className } = props;\n\n const { quota, refreshQuota } = useDrive();\n\n useEffect(() => { refreshQuota(); }, []);\n\n if (!quota) return null;\n const { usedInBytes, totalInBytes, percentage } = quota;\n\n const isNearFull = percentage >= 90;\n const isFull = percentage >= 100;\n\n const stateColor = isFull ? \"text-destructive\" : isNearFull ? \"text-yellow-600 dark:text-yellow-500\" : \"text-primary\";\n const solidColor = isFull ? \"bg-destructive\" : isNearFull ? \"bg-yellow-500\" : \"bg-primary\";\n\n if (compact) {\n return (\n <div className={cn(\"flex items-center gap-3 text-xs font-medium text-muted-foreground\", className)}>\n <span className=\"shrink-0 flex items-center gap-1.5\">\n <Cloud className=\"size-3.5\" />\n Storage\n </span>\n <Progress value={percentage} indicatorClassName={cn(\"bg-gradient-to-r from-blue-500 to-cyan-500\", isNearFull && \"from-yellow-500 to-orange-500\", isFull && \"bg-destructive\")} className=\"w-24 sm:w-32\" />\n <span className=\"shrink-0 whitespace-nowrap\">{formatBytes(usedInBytes)} / {formatBytes(totalInBytes)}</span>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2\">\n <Cloud className={cn(\"size-4\", stateColor)} />\n <span className=\"text-xs font-medium text-muted-foreground\">Storage</span>\n </div>\n <span className=\"text-xs font-semibold tabular-nums\">\n {percentage}%\n </span>\n </div>\n\n <Progress\n value={percentage}\n className=\"h-1.5\"\n indicatorClassName={cn(\n \"transition-all duration-500\",\n isFull ? \"bg-destructive\" : isNearFull ? \"bg-yellow-500\" : \"bg-gradient-to-r from-blue-500 to-purple-500\"\n )}\n />\n\n <div className=\"flex justify-between items-center mt-1.5\">\n <span className=\"text-[10px] text-muted-foreground tabular-nums\">\n {formatBytes(usedInBytes)}\n </span>\n <span className=\"text-[10px] text-muted-foreground tabular-nums\">\n {formatBytes(totalInBytes)}\n </span>\n </div>\n\n {isNearFull && (\n <div className={cn(\n \"flex items-center gap-1.5 text-[10px] font-medium px-2 py-1 rounded-md mt-2\",\n isFull ? \"bg-destructive/10 text-destructive\" : \"bg-yellow-500/10 text-yellow-600 dark:text-yellow-500\"\n )}>\n <AlertCircle className=\"size-3 shrink-0\" />\n <span>{isFull ? \"Storage full\" : \"Almost full\"}</span>\n </div>\n )}\n </>\n );\n};\n","// ** Drive File Chooser Component - Completely Redesigned\n'use client';\n\nimport React, { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { cn, getFileIcon } from '@/client/utils';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/dialog-fullscreen';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd-provider';\nimport { DriveHeader } from '@/client/components/drive/header';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Icons\nimport {\n Upload as UploadIcon, X, Menu, FolderOpen, Trash2,\n Database, HardDrive, ChevronsUpDown, Check, Plus, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\n\n// ============================================================================\n// INLINE SIDEBAR - Simplified for the chooser context\n// ============================================================================\nconst ChooserSidebar = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', { method: 'PATCH', query: { id: account.id }, body: JSON.stringify({ name: newName.trim() }) });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', ml);\n window.removeEventListener('storage', sl);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const ml = (e: MessageEvent) => { if (e.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n const sl = (e: StorageEvent) => { if (e.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n window.addEventListener('message', ml);\n window.addEventListener('storage', sl);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"flex flex-col h-full w-full bg-muted/5 dark:bg-muted/10\">\n {/* Account Switcher */}\n <div className=\"p-2 border-b border-border/50\">\n <div className=\"flex items-center gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"flex-1 flex items-center gap-2 px-2 h-11 min-w-0\">\n <div className=\"size-7 rounded-md flex items-center justify-center shrink-0 bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <HardDrive className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">Local Storage</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"flex-1 min-w-0 justify-between px-2 h-11 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <div className=\"flex items-center gap-2 text-left min-w-0 flex-1\">\n <div className={cn(\n \"size-7 rounded-md flex items-center justify-center shrink-0\",\n activeAccountId ? \"bg-blue-500/10 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400\" : \"bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"size-3.5\" /> : <HardDrive className=\"size-3.5\" />}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{currentAccountName}</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"start\">\n <DropdownMenuLabel className=\"text-[11px] font-medium text-muted-foreground uppercase tracking-wide\">Storage</DropdownMenuLabel>\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"gap-2 py-2\">\n <span className=\"flex-1 text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n {accounts.length > 0 && <DropdownMenuSeparator />}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"gap-2 py-2\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm truncate\">{account.name}</p>\n <p className=\"text-[10px] text-muted-foreground truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"gap-2\"><Plus className=\"size-3.5\" /><span className=\"text-sm\">Add Account</span></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>Google Drive</DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9 shrink-0 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <Settings2 className=\"size-4 text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => { setRenameDialog({ open: true, account: currentAccount }); }}>\n <Pencil className=\"size-3.5 mr-2\" /> Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"size-3.5 mr-2\" /> Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => setDeleteDialog({ open: true, account: currentAccount })}>\n <Trash className=\"size-3.5 mr-2\" /> Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 p-2 space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\", currentView !== 'TRASH' ? \"bg-primary/10 text-primary hover:bg-primary/15\" : \"hover:bg-muted/50\")}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"size-4\" /> My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\", currentView === 'TRASH' ? \"bg-destructive/10 text-destructive hover:bg-destructive/15\" : \"hover:bg-muted/50\")}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"size-4\" /> Trash\n </Button>\n </nav>\n\n {/* Storage */}\n <div className=\"p-2.5 border-t border-border/50 bg-background/50 dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Dialogs */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"sm:max-w-xs\" showCloseButton={false}>\n <div className=\"flex flex-col items-center gap-4 py-4\">\n <Loader2 className=\"size-8 text-primary animate-spin\" />\n <div className=\"text-center\">\n <DialogTitle className=\"text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"text-sm mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ============================================================================\n// MOBILE SIDEBAR SHEET\n// ============================================================================\nconst MobileSidebarSheet = () => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9 md:hidden shrink-0\">\n <Menu className=\"size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-72 p-0\" hideCloseButton>\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">Storage and navigation</SheetDescription>\n <ChooserSidebar onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n );\n};\n\n// ============================================================================\n// MAIN FILE CHOOSER COMPONENT\n// ============================================================================\nexport const DriveFileChooser = (props: Readonly<{\n value: TDriveFile | TDriveFile[] | null;\n onChange: (files: TDriveFile | TDriveFile[] | null) => void;\n multiple?: boolean;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n}>) => {\n // ** Deconstruct Props\n const {\n value, onChange, multiple = false, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText\n } = props;\n\n const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();\n const [isOpen, setIsOpen] = useState(false);\n\n // Sync selection on open and trigger fetch\n useEffect(() => {\n if (isOpen) {\n // Trigger API fetch when dialog opens (for lazy mode)\n triggerFetch();\n\n if (!value) setSelectedFileIds([]);\n else if (Array.isArray(value)) setSelectedFileIds(value.map(f => f.id));\n else setSelectedFileIds([value.id]);\n }\n }, [isOpen, value, setSelectedFileIds, triggerFetch]);\n\n const handleConfirm = useCallback(() => {\n const selectedItems = items.filter(item => selectedFileIds.includes(item.id));\n const files: TDriveFile[] = selectedItems.map(item => ({\n id: item.id,\n file: {\n name: item.name,\n mime: item.information.type === 'FILE' ? item.information.mime : '',\n size: item.information.type === 'FILE' ? item.information.sizeInBytes : 0\n }\n }));\n onChange(multiple ? files : files[0] || null);\n setIsOpen(false);\n }, [items, selectedFileIds, multiple, onChange]);\n\n const handleRemove = useCallback((idToRemove: string) => {\n if (multiple && Array.isArray(value)) onChange(value.filter(f => f.id !== idToRemove));\n else onChange(null);\n }, [multiple, value, onChange]);\n\n const hasSelection = value && (Array.isArray(value) ? value.length > 0 : true);\n const displayFiles = useMemo(() => !value ? [] : Array.isArray(value) ? value : [value], [value]);\n\n return (\n <div className={cn(\"w-full\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n className={cn(\n \"w-full h-auto justify-start gap-3 px-3 py-2.5 border-dashed\",\n error && \"border-destructive\"\n )}\n >\n <div className={cn(\n \"size-9 rounded-lg flex items-center justify-center shrink-0\",\n error ? \"bg-destructive/10 text-destructive\" : \"bg-muted/50 text-muted-foreground\"\n )}>\n <UploadIcon className=\"size-4\" />\n </div>\n <div className=\"flex-1 min-w-0 text-left\">\n <p className={cn(\"text-sm font-medium\", error && \"text-destructive\")}>\n {multiple ? \"Select files\" : \"Select a file\"}\n </p>\n <p className=\"text-xs text-muted-foreground font-normal truncate\">{placeholder}</p>\n </div>\n </Button>\n ) : (\n /* Selected Files Display */\n <div className={cn(\"rounded-lg border\", error ? \"border-destructive\" : \"border-border\", disabled && \"opacity-50\")}>\n {!multiple && displayFiles[0] && (\n <div className=\"flex items-center gap-3 p-2.5\">\n <div className=\"size-12 rounded-lg overflow-hidden bg-muted/30 flex items-center justify-center shrink-0\">\n {displayFiles[0].file.mime.startsWith('image/') ? (\n <img src={createUrl(displayFiles[0], { quality: 'low', format: 'webp' })} alt={displayFiles[0].file.name} className=\"size-full object-cover\" />\n ) : (\n getFileIcon(displayFiles[0].file.mime, false, \"size-6 text-muted-foreground\")\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{displayFiles[0].file.name}</p>\n <p className=\"text-xs text-muted-foreground\">{displayFiles[0].file.mime || 'File'}</p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsOpen(true)} disabled={disabled}>Change</Button>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-8\" onClick={() => handleRemove(displayFiles[0].id)}>\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {multiple && (\n <>\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/20\">\n <span className=\"text-xs text-muted-foreground font-medium\">{displayFiles.length} file{displayFiles.length !== 1 ? 's' : ''} selected</span>\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => setIsOpen(true)} disabled={disabled}>Add more</Button>\n {!disabled && <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={() => onChange([])}>Clear</Button>}\n </div>\n </div>\n <div className=\"max-h-40 overflow-y-auto divide-y divide-border/50\">\n {displayFiles.map((file) => (\n <div key={file.id} className=\"flex items-center gap-2.5 px-3 py-2 hover:bg-muted/20\">\n <div className=\"size-8 rounded overflow-hidden bg-muted/30 flex items-center justify-center shrink-0\">\n {file.file.mime.startsWith('image/') ? (\n <img src={createUrl(file, { quality: 'ultralow', format: 'webp' })} alt={file.file.name} className=\"size-full object-cover\" />\n ) : (\n getFileIcon(file.file.mime, false, \"size-4 text-muted-foreground\")\n )}\n </div>\n <span className=\"flex-1 text-sm truncate\">{file.file.name}</span>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0\" onClick={() => handleRemove(file.id)}>\n <X className=\"size-3.5\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {error && helperText && <p className=\"text-xs text-destructive mt-1.5\">{helperText}</p>}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content showCloseButton={false}>\n {/* Header */}\n <Dialog2Header className=\"gap-2\">\n <MobileSidebarSheet />\n <Dialog2Title className=\"flex-1\">Select {multiple ? 'Files' : 'File'}</Dialog2Title>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-8\" onClick={() => setIsOpen(false)}>\n <X className=\"size-4\" />\n </Button>\n </Dialog2Header>\n\n {/* Body */}\n <Dialog2Body className=\"flex flex-col md:flex-row\">\n {/* Sidebar - Desktop */}\n <div className=\"hidden md:flex w-52 lg:w-56 border-r shrink-0\">\n <ChooserSidebar />\n </div>\n\n {/* Main Content */}\n <DriveDndProvider>\n <div className=\"flex-1 flex flex-col min-w-0 min-h-0\">\n <DriveHeader className=\"border-b\" />\n <div className=\"flex items-center gap-2 px-3 py-2 border-b bg-muted/20 dark:bg-muted/10\">\n <DrivePathBar className=\"flex-1\" />\n <DriveUpload compact accept={accept} />\n </div>\n <DriveFileGrid mimeFilter={accept} className=\"flex-1\" />\n </div>\n </DriveDndProvider>\n </Dialog2Body>\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectedFileIds.length === 0}>\n Select{selectedFileIds.length > 0 ? ` (${selectedFileIds.length})` : ''}\n </Button>\n </Dialog2Footer>\n </Dialog2Content>\n </Dialog2>\n </div>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Database, HardDrive, Plus, Check,\n ChevronsUpDown, FolderOpen, Trash2, Menu, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Sidebar Content Component (reusable for both desktop and mobile)\nconst SidebarContent = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n // Dialog states for account management\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', {\n method: 'PATCH',\n query: { id: account.id },\n body: JSON.stringify({ name: newName.trim() })\n });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n window.removeEventListener('storage', storageListener);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const messageListener = (event: MessageEvent) => {\n if (event.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n const storageListener = (event: StorageEvent) => {\n if (event.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n window.addEventListener('message', messageListener);\n window.addEventListener('storage', storageListener);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch (err) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"w-full h-full flex flex-col bg-muted/5 dark:bg-muted/10\">\n {/* Account Switcher - Compact */}\n <div className=\"p-2 border-b border-border/50\">\n <div className=\"flex items-center gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"flex-1 flex items-center gap-2.5 px-2 h-11 min-w-0\">\n <div className=\"size-7 rounded-md flex items-center justify-center shrink-0 bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <HardDrive className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">Local Storage</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"flex-1 min-w-0 justify-between px-2 h-11 hover:bg-muted/50 dark:hover:bg-muted/30\">\n <div className=\"flex items-center gap-2.5 text-left min-w-0 flex-1\">\n <div className={cn(\n \"size-7 rounded-md flex items-center justify-center shrink-0\",\n activeAccountId\n ? \"bg-blue-500/10 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400\"\n : \"bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"size-3.5\" /> : <HardDrive className=\"size-3.5\" />}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{currentAccountName}</span>\n <span className=\"text-[11px] text-muted-foreground truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"start\">\n <DropdownMenuLabel className=\"text-[11px] font-medium text-muted-foreground uppercase tracking-wide\">\n Storage\n </DropdownMenuLabel>\n\n {/* Local Storage */}\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"gap-2 py-2\">\n <span className=\"flex-1 text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n\n {accounts.length > 0 && <DropdownMenuSeparator />}\n\n {/* Connected Accounts */}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"gap-2 py-2\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm truncate\">{account.name}</p>\n <p className=\"text-[10px] text-muted-foreground truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"gap-2\">\n <Plus className=\"size-3.5\" />\n <span className=\"text-sm\">Add Account</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>\n Google Drive\n </DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-9 shrink-0 hover:bg-muted/50 dark:hover:bg-muted/30\"\n >\n <Settings2 className=\"size-4 text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => {\n setRenameDialog({ open: true, account: currentAccount });\n }}>\n <Pencil className=\"size-3.5 mr-2\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"size-3.5 mr-2\" />\n Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => setDeleteDialog({ open: true, account: currentAccount })}\n >\n <Trash className=\"size-3.5 mr-2\" />\n Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 p-2 space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\n \"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\",\n currentView !== 'TRASH'\n ? \"bg-primary/10 text-primary hover:bg-primary/15 dark:bg-primary/15 dark:hover:bg-primary/20\"\n : \"hover:bg-muted/50 dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"size-4\" />\n My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\n \"w-full justify-start gap-2.5 h-9 px-2.5 font-medium\",\n currentView === 'TRASH'\n ? \"bg-destructive/10 text-destructive hover:bg-destructive/15 dark:bg-destructive/15\"\n : \"hover:bg-muted/50 dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"size-4\" />\n Trash\n </Button>\n </nav>\n\n {/* Storage Indicator */}\n <div className=\"p-2.5 border-t border-border/50 bg-background/50 dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Rename Dialog */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Are you sure you want to disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed from local cache.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"sm:max-w-xs\" showCloseButton={false}>\n <div className=\"flex flex-col items-center gap-4 py-4\">\n <Loader2 className=\"size-8 text-primary animate-spin\" />\n <div className=\"text-center\">\n <DialogTitle className=\"text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"text-sm mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ** Desktop Sidebar (always visible on larger screens)\nexport const DriveSidebar = ({ className }: { className?: string }) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <div className={className}>\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9\" aria-label=\"Open menu\">\n <Menu className=\"size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-70 sm:w-80 p-0\" hideCloseButton>\n <SheetTitle className=\"sr-only\">Navigation Menu</SheetTitle>\n <SheetDescription className=\"sr-only\">Storage accounts and navigation</SheetDescription>\n <SidebarContent onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n </div>\n );\n};\n","// ** DriveExplorer Component\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight } from 'lucide-react';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport { Pencil, Trash2, FolderPlus } from \"lucide-react\";\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { DriveContentProgress } from '@/client/components/drive/header';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id, disabled });\n\n // Don't apply transform when this is a folder being hovered (prevents sliding)\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className, selectableFolders = false } = props;\n const {\n items, isLoading, error, apiEndpoint, currentFolderId,\n setItems,\n viewMode, groupBy, sortBy, setSortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n callAPI, currentView, moveItem, deleteItem, restoreItem, createFolder, renameItem: renameItemAction\n } = useDrive();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({\n newFolder: false,\n rename: false,\n delete: false\n });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Item State\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Drag & Drop State\n const [dragOverFolderId, setDragOverFolderId] = React.useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = React.useState<string | null>(null);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), // Prevent drag on simple click\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handle Drag Start\n const handleDragStart = (event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n };\n\n // ** Handle Drag Over (track folder hover)\n const handleDragOver = (event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n const overItem = items.find(i => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n };\n\n // ** Handle Drag End\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) {\n return;\n }\n\n // Check if dropping on a path bar item\n const overId = over.id as string;\n if (overId.startsWith('path-')) {\n const targetFolderId = overId.replace('path-', '');\n // Move to target folder (root = 'root')\n await moveItem(active.id as string, targetFolderId === 'root' ? 'root' : targetFolderId);\n return;\n }\n\n const overItem = items.find(i => i.id === over.id);\n const activeItem = items.find(i => i.id === active.id);\n\n // If dropping on a folder (and not the item itself), MOVE into folder\n if (overItem?.information.type === 'FOLDER' && activeItem) {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Otherwise, reorder\n // Optimistic Update\n setItems((prevItems) => {\n const oldIndex = prevItems.findIndex((i) => i.id === active.id);\n const newIndex = prevItems.findIndex((i) => i.id === over.id);\n return arrayMove(prevItems, oldIndex, newIndex);\n });\n\n // Switch to custom order if not already\n if (sortBy.field !== 'order') {\n setSortBy({ field: 'order', order: 1 });\n }\n\n // Sync with Server\n const oldIndex = items.findIndex((i) => i.id === active.id);\n const newIndex = items.findIndex((i) => i.id === over.id);\n const newOrderIds = arrayMove(items, oldIndex, newIndex).map(i => i.id);\n\n await callAPI('reorder', {\n method: 'POST',\n body: JSON.stringify({ ids: newOrderIds })\n });\n };\n\n // ** Filter & Sort Items (Memoized)\n // Note: If we drag, we update 'items'. The Memo needs to respect 'items' order if sortBy.field === 'order'.\n const processedItems = useMemo(() => {\n let filtered = items;\n\n if (mimeFilter) {\n filtered = filtered.filter(item => matchesMimeFilter(item.information.type === 'FILE' ? item.information.mime : '', item.information.type === 'FOLDER', mimeFilter));\n }\n\n return [...filtered].sort((a, b) => {\n // Always folders first\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n\n const field = sortBy.field;\n const order = sortBy.order;\n\n if (field === 'order') {\n // If we are sorting by order, we trust the array index implicity or use explicit order field if stable.\n // However, dnd-kit arrayMove changes array index.\n // But DB store `order` number.\n // Since we update `items` state array order on drag, we should just return 0 (maintain array order)\n // OR sort by `a.order - b.order`.\n // If we optimistically update `items` array, we prefer the Array Order if field is 'order'.\n // But backend `reorder` updates `order` field.\n // Let's rely on Array Order if 'order', assuming `items` is loaded sorted by order initially?\n // `refreshItems` calls `list`. API `list` usually sorts by default.\n // If `sortBy.field` is 'order', we want to respect the current array order (which dnd manipulates).\n return 0; // Maintain array index order\n }\n\n let valA: any, valB: any;\n\n if (field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else { // createdAt / default\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n\n if (valA < valB) return -1 * order;\n if (valA > valB) return 1 * order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n // ... grouping logic same as before ...\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [],\n 'Yesterday': [],\n 'Earlier this Week': [],\n 'Last Week': [],\n 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll Observer\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n const handleItemClick = (e: React.MouseEvent | React.TouchEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n onItemClick?.(item);\n return;\n }\n\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n onItemClick?.(item);\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // This is for mouse double-click on desktop\n if (item.information.type === 'FOLDER') {\n if (currentView === 'BROWSE') navigateToFolder(item);\n }\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n const stateContent = (() => {\n // Loading State (empty)\n if (isLoading && items.length === 0) {\n return <div className=\"flex items-center justify-center py-12 flex-1\"><Loader2 className=\"size-6 animate-spin text-muted-foreground\" /></div>;\n }\n // Error State\n if (error) {\n return <div className=\"flex items-center justify-center p-12 text-destructive bg-destructive/10 rounded-lg flex-1\">{error}</div>;\n }\n // Empty State\n if (processedItems.length === 0) {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"flex flex-col items-center justify-center py-12 text-center flex-1\", className)}>\n <div className=\"size-12 rounded-full bg-muted flex items-center justify-center mb-3\"><Folder className=\"size-6 text-muted-foreground\" /></div>\n <p className=\"text-sm text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'No files found'}\n </p>\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"mr-2 size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"px-2 py-6 text-center\">\n <p className=\"text-xs text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n }\n // Normal content (files/folders) - rendered below in main return\n return null;\n })();\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragStart={handleDragStart} onDragOver={handleDragOver} onDragEnd={handleDragEnd}>\n <div className=\"flex flex-col h-full w-full overflow-hidden bg-background/50 dark:bg-background/30 relative\">\n {/* Top Progress Bar */}\n <DriveContentProgress />\n\n {/* Header Row */}\n <div className=\"h-12 px-3 sm:px-4 border-b bg-background/95 dark:bg-background/80 backdrop-blur-sm flex items-center gap-3\">\n <DriveSidebar className=\"lg:hidden\" />\n <DrivePathBar className=\"hidden lg:flex flex-1\" />\n <DriveUpload compact accept={mimeFilter} />\n </div>\n\n {/* Path Bar - Mobile */}\n <div className=\"lg:hidden px-3 py-2 border-b bg-background/95 dark:bg-background/80 backdrop-blur-sm\">\n <DrivePathBar />\n </div>\n\n {stateContent || (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"flex-1 overflow-y-auto min-h-0 container mx-auto p-2 sm:p-3 md:p-4\", className)}>\n <div className=\"space-y-4 sm:space-y-6 pb-8 sm:pb-12\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName} className=\"space-y-3\">\n {groupBy !== 'NONE' && (\n <h3 className=\"text-sm font-medium text-muted-foreground flex items-center gap-2\">\n {groupName} <span className=\"text-xs opacity-50\">({groupItems.length})</span>\n </h3>\n )}\n <SortableContext items={groupItems.map(i => i.id)} strategy={rectSortingStrategy} disabled={!enableDrag}>\n <div className={cn(\n viewMode === 'GRID'\n ? \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 gap-2 sm:gap-3 md:gap-4\"\n : \"flex flex-col gap-1\"\n )}>\n {groupItems.map(item => {\n const isSelected = selectedFileIds.includes(item.id);\n const isFolder = item.information.type === 'FOLDER';\n const isDragOver = isFolder && dragOverFolderId === item.id;\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const fileUrl = `${apiEndpoint}?action=serve&id=${item.id}${tokenParam}`;\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=${viewMode === 'GRID' ? 'medium' : 'small'}${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <SortableItem key={item.id} id={item.id} disabled={!enableDrag} isDragOverTarget={isDragOver}>\n <ContextMenu>\n <ContextMenuTrigger>\n <div\n className={cn(\n \"group relative cursor-pointer transition-all focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\",\n viewMode === 'GRID'\n ? \"flex flex-col rounded-xl border bg-card dark:bg-card/50 hover:bg-accent/50 dark:hover:bg-accent/30 hover:shadow-sm overflow-hidden\"\n : \"flex items-center p-2 rounded-lg hover:bg-accent/50 dark:hover:bg-accent/30 gap-3 border border-transparent hover:border-border\",\n isSelected && \"ring-2 ring-primary border-primary/50 bg-accent/30 dark:bg-accent/20\",\n isDragOver && \"ring-2 ring-primary border-primary scale-[1.02] bg-primary/10 shadow-lg transition-transform\"\n )}\n onClick={(e) => handleItemClick(e, item)}\n onTouchEnd={(e) => {\n e.preventDefault();\n handleItemClick(e, item);\n }}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"aspect-square w-full bg-muted/20 dark:bg-muted/10 flex items-center justify-center overflow-hidden relative\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-contain transition-transform group-hover:scale-105 duration-300\" loading=\"lazy\" />\n ) : (\n <div className=\"transition-transform group-hover:scale-110 duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-10 text-muted-foreground/70\")}\n </div>\n )}\n {isSelected && (\n <div className=\"absolute top-2 right-2 size-5 bg-primary rounded-full flex items-center justify-center shadow-sm animate-in zoom-in-50\">\n <div className=\"size-2 bg-primary-foreground rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"absolute bottom-2 right-2 lg:hidden size-6 bg-primary/90 rounded-full flex items-center justify-center shadow-md\">\n <ChevronRight className=\"size-3.5 text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"p-2.5\">\n <p className=\"text-sm font-medium truncate\" title={item.name}>{item.name}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"size-9 shrink-0 rounded-md overflow-hidden bg-muted/40 dark:bg-muted/20 flex items-center justify-center border\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"size-full object-contain\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"size-4 text-muted-foreground\")\n )}\n </div>\n <span className=\"text-sm font-medium truncate flex-1\" title={item.name}>{item.name}</span>\n <span className=\"text-xs text-muted-foreground w-20 text-right shrink-0\">\n {isFolder ? '-' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </span>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"size-4 text-muted-foreground lg:hidden shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={() => restoreItem(item.id)}>\n <RotateCcw className=\"mr-2 size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"mr-2 size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={() => {\n setItemToRename(item);\n setDialogs(prev => ({ ...prev, rename: true }));\n }}>\n <Pencil className=\"mr-2 size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"text-destructive focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"mr-2 size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n </SortableItem>\n );\n })}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n {/* Infinite Scroll Sentinel */}\n {hasMore && (\n <div ref={observerTarget} className=\"flex justify-center py-4\">\n {isLoadingMore && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />}\n {!isLoadingMore && <div className=\"h-4 w-full\" />}\n </div>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"mr-2 size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"px-2 py-6 text-center\">\n <p className=\"text-xs text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n )}\n\n {/* Dialogs - Outside of ContextMenu to prevent z-index/portal issues */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => {\n setDialogs(prev => ({ ...prev, rename: false }));\n setItemToRename(null);\n }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => {\n setDialogs(prev => ({ ...prev, delete: false }));\n setItemToDelete(null);\n }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`\n }\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </div>\n </DndContext>\n );\n};\n"]}
|