next-file-manager 0.1.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 +230 -0
- package/dist/client/index.css +48 -0
- package/dist/client/index.css.map +1 -0
- package/dist/client/index.d.ts +128 -0
- package/dist/client/index.js +2863 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index-DE7-rwJm.d.ts +87 -0
- package/dist/server/index.d.ts +115 -0
- package/dist/server/index.js +1413 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/context.tsx","../../src/client/hooks/useUpload.ts","../../src/client/file-chooser.tsx","../../src/client/utils.tsx","../../src/client/components/drive/explorer.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/dialog.tsx","../../src/client/components/ui/alert.tsx","../../src/client/components/ui/button.tsx","../../src/client/components/ui/dialog.tsx","../../src/client/components/ui/input.tsx","../../src/client/components/ui/label.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/drive/file/details.tsx","../../src/client/components/ui/separator.tsx","../../src/client/components/drive/path-bar.tsx","../../src/client/components/drive/upload.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/drive/sidebar.tsx","../../src/client/components/ui/dropdown-menu.tsx","../../src/client/components/drive/storage/indicator.tsx","../../src/client/components/drive/header.tsx","../../src/client/components/drive/file/preview.tsx"],"sourcesContent":["// ** Client Context\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota } from '@/types/client';\n\n// ** Context Types\nexport type TDriveContext = {\n apiEndpoint: string;\n currentFolderId: string | null;\n path: TDrivePathItem[];\n items: TDatabaseDrive[];\n allItems: Record<string, TDatabaseDrive[]>;\n isLoading: boolean;\n error: string | null;\n quota: TDriveQuota | null;\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\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 // ** Actions\n navigateToFolder: (item: { id: string | null; name: string } | null) => void;\n navigateUp: () => void;\n refreshItems: () => Promise<void>;\n refreshQuota: () => Promise<void>;\n moveItem: (itemId: string, targetFolderId: string) => Promise<void>;\n deleteItems: (ids: string[]) => Promise<void>;\n callAPI: <T>(action: string, options?: RequestInit & { query?: Record<string, string> }) => Promise<TDriveAPIResponse<T>>;\n setItems: (updater: React.SetStateAction<TDatabaseDrive[]>) => void; // Kept signature but implements differently\n setAllItems: React.Dispatch<React.SetStateAction<Record<string, TDatabaseDrive[]>>>;\n\n // ** Pagination\n loadMore: () => Promise<void>;\n hasMore: boolean;\n isLoadingMore: boolean;\n};\n\nconst DriveContext = createContext<TDriveContext | null>(null);\n\n// ** Drive Provider Component\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}>) => {\n const { children, apiEndpoint, initialActiveAccountId = null, initialSelectionMode = { type: 'SINGLE' }, defaultSelectedFileIds = [] } = props;\n\n // ** Account State\n const [accounts, setAccounts] = useState<{ id: string; name: string; email: string; provider: 'GOOGLE' }[]>([]);\n const [activeAccountId, setActiveAccountIdState] = useState<string | null>(initialActiveAccountId);\n\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [path, setPath] = useState<TDrivePathItem[]>([{ id: null, name: 'Home' }]);\n\n // ** Cache: Key = AccountID ('LOCAL' for null), Value = Items\n const [allItems, setAllItems] = useState<Record<string, TDatabaseDrive[]>>({});\n\n const [searchResults, setSearchResults] = useState<TDatabaseDrive[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [quota, setQuota] = useState<TDriveQuota | null>(null);\n\n const activeCacheKey = activeAccountId || 'LOCAL';\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 path when switching accounts\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setSearchResults([]);\n }, []);\n\n // Load active account from local storage on mount\n React.useEffect(() => {\n const stored = localStorage.getItem('drive_active_account');\n if (stored) setActiveAccountIdState(stored);\n }, []);\n\n // ** UI State\n const [viewMode, setViewMode] = useState<'GRID' | 'LIST'>('GRID');\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 // ** Derived items for current folder (from cache)\n const items = useMemo(() => {\n const currentItems = allItems[activeCacheKey] || [];\n\n if (currentView === 'TRASH') return currentItems.filter(i => i.trashedAt !== null);\n if (currentView === 'SEARCH') return searchResults;\n return currentItems.filter(i => i.parentId === currentFolderId && !i.trashedAt);\n }, [allItems, activeCacheKey, currentFolderId, currentView, searchResults]);\n\n // ** Setter for backward compatibility (Updates ONLY current account cache)\n const setItems = useCallback((updater: React.SetStateAction<TDatabaseDrive[]>) => {\n setAllItems(prev => {\n const currentCache = prev[activeCacheKey] || [];\n\n let newItems: TDatabaseDrive[];\n if (typeof updater === 'function') {\n // Filter current view items for updater\n const viewItems = currentCache.filter(i => i.parentId === currentFolderId && !i.trashedAt);\n const updatedViewItems = updater(viewItems);\n // Merge back: Keep items NOT in current view, add updated view items\n newItems = [...currentCache.filter(i => i.parentId !== currentFolderId || i.trashedAt), ...updatedViewItems];\n } else {\n newItems = [...currentCache.filter(i => i.parentId !== currentFolderId || i.trashedAt), ...updater];\n }\n\n return { ...prev, [activeCacheKey]: newItems };\n });\n }, [activeCacheKey, currentFolderId]);\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 // ** API Helper\n const callAPI = useCallback(async <T,>(action: string, options?: RequestInit & { query?: Record<string, string> }): 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> = { 'Content-Type': 'application/json', ...((fetchOptions?.headers as Record<string, string>) || {}) };\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n\n try {\n const response = await fetch(url, { ...fetchOptions, headers });\n return await response.json();\n } catch (err) {\n return { status: 0, message: err instanceof Error ? err.message : 'Network error' };\n }\n }, [apiEndpoint, activeAccountId]);\n\n // ** Fetch Items (Initial)\n const refreshItems = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n setHasMore(false); // Reset\n\n let response: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'TRASH') {\n response = await callAPI('trash');\n } else if (currentView === 'SEARCH' && searchQuery) {\n response = await callAPI('search', { query: { q: searchQuery, limit: '50', trashed: searchScope === 'TRASH' ? 'true' : 'false' } });\n } else {\n response = await callAPI('list', { query: { folderId: currentFolderId || 'root', limit: '50' } });\n }\n\n if (response.status === 200 && response.data) {\n if (currentView === 'SEARCH') {\n // For SEARCH, set results separately (don't pollute cache)\n setSearchResults(response.data.items);\n } else {\n // For BROWSE/TRASH, merge into allItems cache (avoid duplicates by id)\n setAllItems(prev => {\n const currentCache = prev[activeCacheKey] || [];\n const existingIds = new Set(response.data!.items.map(i => i.id));\n const filtered = currentCache.filter(i => !existingIds.has(i.id));\n\n return {\n ...prev,\n [activeCacheKey]: [...filtered, ...response.data!.items]\n };\n });\n }\n setHasMore(!!response.data.hasMore);\n } else {\n setError(response.message || 'Failed to load items');\n }\n setIsLoading(false);\n }, [callAPI, currentFolderId, currentView, searchQuery, searchScope, activeCacheKey]);\n\n // ** Fetch Accounts\n const refreshAccounts = useCallback(async () => {\n const response = await callAPI<{ accounts: { id: string; name: string; email: string; provider: 'GOOGLE' }[] }>('listAccounts');\n if (response.status === 200 && response.data) {\n setAccounts(response.data.accounts);\n }\n }, [callAPI]);\n\n // ** Load More\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading || isLoadingMore || currentView === 'TRASH') return;\n setIsLoadingMore(true);\n\n const currentItems = items; // derived items\n const lastItem = currentItems[currentItems.length - 1];\n const afterId = lastItem ? lastItem.id : undefined;\n\n if (!afterId) { setIsLoadingMore(false); return; }\n\n let response: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'SEARCH' && searchQuery) {\n setIsLoadingMore(false); return;\n } else {\n response = await callAPI('list', {\n query: { folderId: currentFolderId || 'root', limit: '50', afterId }\n });\n }\n\n if (response && response.status === 200 && response.data) {\n // Append to current cache\n setAllItems(prev => {\n const currentCache = prev[activeCacheKey] || [];\n return {\n ...prev,\n [activeCacheKey]: [...currentCache, ...response.data!.items]\n };\n });\n setHasMore(!!response.data.hasMore);\n }\n setIsLoadingMore(false);\n }, [callAPI, currentFolderId, hasMore, isLoading, isLoadingMore, items, currentView, searchQuery, activeCacheKey]);\n\n // ** Fetch Quota\n const refreshQuota = useCallback(async () => {\n const response = await callAPI<TDriveQuota>('quota');\n if (response.status === 200 && response.data) setQuota(response.data);\n }, [callAPI]);\n\n // ** Navigation\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n // Always switch to BROWSE view when navigating\n setCurrentView('BROWSE');\n setSearchQuery('');\n\n if (item === null) {\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setSelectedFileIds([]);\n return;\n }\n setCurrentFolderId(item.id);\n setPath((prev) => {\n const existingIndex = prev.findIndex(p => p.id === item.id);\n if (existingIndex !== -1) {\n return prev.slice(0, existingIndex + 1);\n }\n return [...prev, { id: item.id, name: item.name }];\n });\n setSelectedFileIds([]);\n }, []);\n\n const navigateUp = useCallback(() => {\n // Always switch to BROWSE view when navigating\n setCurrentView('BROWSE');\n setSearchQuery('');\n\n if (path.length <= 1) return;\n const newPath = path.slice(0, -1);\n setPath(newPath);\n setCurrentFolderId(newPath[newPath.length - 1]?.id || null);\n setSelectedFileIds([]);\n }, [path]);\n\n // ** Move Item (optimistic update + API call)\n const moveItem = useCallback(async (itemId: string, targetFolderId: string) => {\n // Optimistic update\n setAllItems(prev => {\n const currentCache = prev[activeCacheKey] || [];\n const newItems = currentCache.map(item =>\n item.id === itemId\n ? { ...item, parentId: targetFolderId === 'root' ? null : targetFolderId }\n : item\n );\n return { ...prev, [activeCacheKey]: newItems };\n });\n\n // Call API\n await callAPI('move', {\n method: 'POST',\n body: JSON.stringify({ ids: [itemId], targetFolderId })\n });\n }, [callAPI, activeCacheKey]);\n\n // ** Delete Items (optimistic update + API call)\n const deleteItems = useCallback(async (ids: string[]) => {\n // Optimistic update\n setAllItems(prev => {\n const currentCache = prev[activeCacheKey] || [];\n let newItems: TDatabaseDrive[];\n\n if (currentView === 'TRASH') {\n // If in trash (permanent delete), remove completely\n newItems = currentCache.filter(item => !ids.includes(item.id));\n } else {\n // If browsing (soft delete), mark as trashed locally or remove from view\n // For simplicity, we just mark trashedAt so our view filter catches it\n newItems = currentCache.map(item =>\n ids.includes(item.id)\n ? { ...item, trashedAt: new Date() } // Use Date object\n : item\n );\n }\n return { ...prev, [activeCacheKey]: newItems };\n });\n\n // Clear selection\n setSelectedFileIds([]);\n\n // Call API\n if (currentView === 'TRASH') {\n for (const id of ids) {\n await callAPI('deletePermanent', { query: { id } });\n }\n } else {\n for (const id of ids) {\n await callAPI('delete', { query: { id } });\n }\n }\n\n }, [callAPI, activeCacheKey, currentView]);\n\n // ** Effects\n React.useEffect(() => { refreshItems(); }, [currentFolderId, currentView, refreshItems, activeAccountId]); // Reload when account changes\n React.useEffect(() => { refreshQuota(); }, [refreshQuota, activeAccountId]);\n React.useEffect(() => { refreshAccounts(); }, [refreshAccounts]);\n\n return (\n <DriveContext.Provider value={{\n apiEndpoint, currentFolderId, path, items, allItems, setItems, setAllItems, isLoading, error, quota, refreshQuota,\n accounts, activeAccountId, setActiveAccountId, refreshAccounts,\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n currentView, setCurrentView, searchQuery, setSearchQuery, searchScope, setSearchScope,\n selectionMode, selectedFileIds, setSelectedFileIds,\n navigateToFolder, navigateUp, refreshItems, callAPI, moveItem, deleteItems,\n loadMore, hasMore, isLoadingMore\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\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, 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 uploadChunk = async (formData: FormData): Promise<[boolean, any, boolean]> => {\n try {\n const headers: Record<string, string> = {};\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n const response = await fetch(`${apiEndpoint}?action=upload`, { method: 'POST', body: formData, headers });\n\n // Handle HTTP errors\n if (!response.ok) {\n const text = await response.text();\n try {\n const json = JSON.parse(text);\n const msg = json.message || json.error?.message || `Status ${response.status}`;\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 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 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) return [false, data.message || 'Upload failed', false]; // Business logic errors are fatal\n\n return [true, data.data, false];\n } catch (error) {\n return [false, error instanceof Error ? error.message : 'Network error', 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 updateUpload(item.id, { status: 'uploading' });\n\n const chunkSize = getChunkSize(file.size);\n const totalChunks = Math.ceil(file.size / chunkSize);\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\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(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 } else if (result.type === 'UPLOAD_COMPLETE') {\n // Single chunk upload complete\n if (onUploadComplete) onUploadComplete(result.item);\n }\n } else {\n if (!canRetry) throw new Error(result as string); // Immediate failure for non-retryable errors\n\n attempts++;\n if (attempts === 3) throw new Error(result as string);\n await new Promise(r => setTimeout(r, 1000 * attempts));\n }\n }\n }\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\n } catch (error: any) {\n if (error.message === 'Cancelled') {\n updateUpload(item.id, { status: 'cancelled' });\n } else {\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 });\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const cancelUpload = useCallback(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}?action=cancel&id=${upload.driveId}`, { method: 'POST' }).catch(() => { });\n }\n }, [apiEndpoint, updateUpload, uploads]);\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 react-hooks/exhaustive-deps\n }, [uploads]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads };\n};\n","// ** Drive File Chooser Component\n'use client';\n\nimport React, { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { cn, getFileIcon } from '@/client/utils';\nimport { DriveExplorer } from '@/client/components/drive/explorer';\nimport { DriveHeader } from '@/client/components/drive/header';\nimport { DriveFilePreview } from '@/client/components/drive/file/preview';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { Upload as UploadIcon, X } from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/client/components/ui/dialog';\n\n// ** Drive File Chooser Component (requires DriveProvider)\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 with defaults\n const {\n value, onChange, multiple, accept, placeholder,\n className, disabled, error, helperText\n } = {\n multiple: false,\n placeholder: 'Choose files...',\n className: '',\n disabled: false,\n ...props\n };\n const { items, selectedFileIds, setSelectedFileIds } = useDrive();\n const [isOpen, setIsOpen] = useState(false);\n const [previewFile, setPreviewFile] = useState<TDatabaseDrive | null>(null);\n\n // ** Sync Selection when Open\n useEffect(() => {\n if (isOpen) {\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]);\n\n // ** External Handlers\n const handleConfirm = useCallback(() => {\n // Find selected items from current items list. \n // Note: This relies on items being loaded. If selected items are not in current folder, this fails.\n // Ideally we need to fetchByIds, but for now we assume selection happens in current view.\n const selectedItems = items.filter(item => selectedFileIds.includes(item.id));\n\n // If we selected something that isn't in 'items' (e.g. pre-selected prop), we might lose it if we filter only 'items'.\n // But for a picker, we usually pick what we see.\n\n const files: TDriveFile[] = selectedItems.map(item => ({\n id: item.id,\n file: { name: item.name, mime: item.information.type === 'FILE' ? item.information.mime : '', 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 = (idToRemove: string) => {\n if (multiple && Array.isArray(value)) {\n onChange(value.filter(f => f.id !== idToRemove));\n } else {\n onChange(null);\n }\n };\n\n const hasSelection = value && (Array.isArray(value) ? value.length > 0 : true);\n const displayFiles = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const isSingle = !multiple;\n\n return (\n <div className={cn(\"space-y-1.5\", className)}>\n {/* Empty State / Trigger */}\n {!hasSelection && (\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(true)}\n disabled={disabled}\n className={cn(\n \"w-full flex items-center gap-3 px-3 py-2.5 rounded-md border border-dashed text-left transition-colors\",\n \"hover:bg-accent hover:border-accent-foreground/20\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n error && \"border-destructive bg-destructive/5 hover:bg-destructive/10\",\n disabled && \"opacity-50 cursor-not-allowed hover:bg-transparent\"\n )}\n >\n <div className={cn(\n \"flex items-center justify-center size-9 rounded-md bg-muted\",\n error && \"bg-destructive/10\"\n )}>\n <UploadIcon className={cn(\"size-4\", error ? \"text-destructive\" : \"text-muted-foreground\")} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className={cn(\"text-sm font-medium\", error && \"text-destructive\")}>\n {isSingle ? \"Select a file\" : \"Select files\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">{placeholder}</p>\n </div>\n </button>\n )}\n\n {/* Selected File Display (Single) */}\n {hasSelection && isSingle && displayFiles[0] && (\n <div className={cn(\n \"flex items-center gap-2.5 px-2.5 py-2 rounded-md border bg-muted/30\",\n error && \"border-destructive\",\n disabled && \"opacity-50\"\n )}>\n <div className=\"size-10 shrink-0 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {getFileIcon(displayFiles[0].file.mime, false, \"size-5 text-muted-foreground\")}\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 truncate\">{displayFiles[0].file.mime}</p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n >\n Change\n </Button>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemove(displayFiles[0].id)}\n >\n <X className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Selected Files Display (Multiple) */}\n {hasSelection && !isSingle && (\n <div className={cn(\n \"rounded-md border\",\n error && \"border-destructive\",\n disabled && \"opacity-50\"\n )}>\n <div className=\"flex items-center justify-between px-2.5 py-1.5 border-b bg-muted/30\">\n <span className=\"text-xs text-muted-foreground\">\n {displayFiles.length} files selected\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n >\n Add more\n </Button>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange([])}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n <div className=\"divide-y max-h-40 overflow-y-auto\">\n {displayFiles.map((file) => (\n <div key={file.id} className=\"flex items-center gap-2 px-2.5 py-1.5 hover:bg-muted/30\">\n <div className=\"size-7 shrink-0 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {getFileIcon(file.file.mime, false, \"size-3.5 text-muted-foreground\")}\n </div>\n <span className=\"flex-1 text-sm truncate\">{file.file.name}</span>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemove(file.id)}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {error && helperText && <p className=\"text-xs text-destructive\">{helperText}</p>}\n\n {/* Main Picker Dialog */}\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogContent className=\"sm:max-w-5xl max-h-[85vh] w-[95vw] flex flex-col gap-0 p-0\">\n <DialogHeader className=\"px-0 py-0 border-b shrink-0 flex flex-col gap-0\">\n <div className=\"flex items-center justify-between px-3 sm:px-4 py-3 border-b\">\n <DialogTitle className=\"text-sm sm:text-base\">File Explorer</DialogTitle>\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-hidden flex min-h-0 bg-muted/5\">\n <div className=\"hidden md:flex w-48 lg:w-52 border-r bg-background/50 flex-col\">\n <DriveSidebar />\n </div>\n <div className=\"flex-1 flex flex-col min-w-0\">\n <DriveHeader />\n <DriveExplorer\n mimeFilter={accept}\n onItemDoubleClick={(item) => {\n // Quick select on double click if file\n if (item.information.type === 'FILE') {\n setPreviewFile(item);\n }\n }}\n />\n </div>\n </div>\n <DialogFooter className=\"px-3 sm:px-4 py-3 border-t bg-background shrink-0 gap-2 flex-row justify-end\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleConfirm}\n disabled={selectedFileIds.length === 0}\n >\n Select {selectedFileIds.length > 0 ? `(${selectedFileIds.length})` : ''}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {previewFile && <DriveFilePreview item={previewFile} onClose={() => setPreviewFile(null)} />}\n </div>\n );\n};\n","// ** Client Utils\nimport React from 'react';\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ** Format bytes to human readable string\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nimport type { ReactNode } from 'react';\nimport { File, Folder, Image, Video, Music, FileText, Package, FileCode, FileArchive } from 'lucide-react';\n\n// ** Get file icon based on mime type\nexport const getFileIcon = (mime: string, isFolder: boolean, className = \"w-6 h-6\"): ReactNode => {\n if (isFolder) return <Folder className={cn(\"text-blue-500 fill-blue-500/20\", className)} />;\n if (mime.startsWith('image/')) return <Image className={cn(\"text-purple-500\", className)} />;\n if (mime.startsWith('video/')) return <Video className={cn(\"text-red-500\", className)} />;\n if (mime.startsWith('audio/')) return <Music className={cn(\"text-yellow-500\", className)} />;\n if (mime === 'application/pdf') return <FileText className={cn(\"text-orange-500\", className)} />;\n if (mime.includes('text') || mime.includes('document')) return <FileText className={cn(\"text-slate-500\", className)} />;\n if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={cn(\"text-amber-500\", className)} />;\n if (mime.includes('javascript') || mime.includes('typescript') || mime.includes('json') || mime.includes('html') || mime.includes('css')) return <FileCode className={cn(\"text-green-500\", className)} />;\n return <File className={cn(\"text-gray-400\", className)} />;\n};\n\n// ** Check if file matches mime filter\nexport const matchesMimeFilter = (mime: string, isFolder: boolean, filter?: string): boolean => {\n if (!filter) return true;\n if (isFolder) return true;\n if (filter === '*/*') return true;\n\n const types = filter.split(',').map(t => t.trim());\n return types.some(type => {\n if (type === mime) return true;\n if (type.endsWith('/*')) {\n const prefix = type.slice(0, -2);\n return mime.startsWith(`${prefix}/`);\n }\n return false;\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, Info, RotateCcw, ChevronRight } from 'lucide-react';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut } from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { Pencil, Trash2, FolderPlus } from \"lucide-react\";\nimport { DriveFileDetails } from '@/client/components/drive/file/details';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\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 = ({ id, children, disabled, isDragOverTarget }: { id: string; children: React.ReactNode; disabled?: boolean; isDragOverTarget?: boolean }) => {\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 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 refreshItems, callAPI, currentView, moveItem, deleteItems\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 [renameItem, setRenameItem] = React.useState<TDatabaseDrive | null>(null);\n const [detailsItem, setDetailsItem] = 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 // ** Touch/Tap State for mobile double-tap detection\n const lastTapTime = useRef<number>(0);\n const lastTapItemId = useRef<string | null>(null);\n const tapTimeout = useRef<NodeJS.Timeout | null>(null);\n\n // ** Handlers\n const handleItemClick = (e: React.MouseEvent | React.TouchEvent, item: TDatabaseDrive) => {\n // Detect if this is a touch event\n const isTouchEvent = e.type === 'touchend';\n\n if (isTouchEvent) {\n // Handle touch/tap for mobile\n const now = Date.now();\n const timeSinceLastTap = now - lastTapTime.current;\n const isSameItem = lastTapItemId.current === item.id;\n\n // Double-tap detection (within 300ms on same item)\n if (timeSinceLastTap < 300 && isSameItem) {\n // Clear any pending single tap action\n if (tapTimeout.current) {\n clearTimeout(tapTimeout.current);\n tapTimeout.current = null;\n }\n\n // Double-tap detected - open folder or file\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') {\n navigateToFolder(item);\n } else {\n onItemDoubleClick?.(item);\n }\n\n // Reset tap tracking\n lastTapTime.current = 0;\n lastTapItemId.current = null;\n return;\n }\n\n // Single tap - schedule selection after delay (to allow double-tap)\n lastTapTime.current = now;\n lastTapItemId.current = item.id;\n\n // Clear any previous timeout\n if (tapTimeout.current) clearTimeout(tapTimeout.current);\n\n // For folders, open immediately on single tap (more mobile-friendly)\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n tapTimeout.current = setTimeout(() => {\n navigateToFolder(item);\n if (onItemClick) onItemClick(item);\n }, 250); // Short delay to allow double-tap\n } else {\n // For files, select immediately\n if (onItemClick) 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 } else {\n // Mouse click - original behavior\n if (item.information.type === 'FOLDER' && !selectableFolders) {\n if (onItemClick) onItemClick(item);\n return;\n }\n if (onItemClick) 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\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 // Cleanup tap timeout on unmount\n useEffect(() => {\n return () => {\n if (tapTimeout.current) clearTimeout(tapTimeout.current);\n };\n }, []);\n\n\n const enableDrag = currentView === 'BROWSE';\n\n const stateContent = (() => {\n // Loading State\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 {currentView === 'BROWSE' && <p className=\"text-xs text-muted-foreground/60 mt-1\">Right-click to create a folder</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\">\n {/* Header Row */}\n <div className=\"h-14 px-3 sm:px-4 border-b bg-background/95 backdrop-blur-sm shrink-0 flex items-center gap-3\">\n {/* Mobile Menu Button */}\n <div className=\"lg:hidden\">\n <DriveSidebar />\n </div>\n\n {/* Path Bar - Desktop Only */}\n <div className=\"hidden lg:flex flex-1 min-w-0\">\n <DrivePathBar />\n </div>\n\n <DriveUpload compact onComplete={() => refreshItems()} />\n </div>\n\n {/* Path Bar - Mobile (Separate Row) */}\n <div className=\"lg:hidden px-3 py-2 border-b bg-background/95 backdrop-blur-sm shrink-0\">\n <DrivePathBar />\n </div>\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 hover:bg-accent/50 hover:shadow-sm overflow-hidden\"\n : \"flex items-center p-2 rounded-lg hover:bg-accent/50 gap-3 border border-transparent hover:border-border\",\n isSelected && \"ring-2 ring-primary border-primary/50 bg-accent/30\",\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(); // Prevent ghost clicks\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 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 {/* Mobile tap indicator for folders */}\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-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-sm font-medium truncate w-full text-card-foreground\" title={item.name}>\n {item.name}\n </span>\n </div>\n <div className=\"flex items-center justify-between mt-1 text-xs text-muted-foreground\">\n <span>{isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}</span>\n </div>\n </div>\n </>\n ) : (\n <>\n <div className=\"size-9 shrink-0 rounded-md overflow-hidden bg-muted/40 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 text-card-foreground\" title={item.name}>{item.name}</span>\n <span className=\"text-xs text-muted-foreground w-20 text-right\">\n {isFolder ? '-' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </span>\n {/* Mobile tap indicator for folders in list view */}\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={async () => {\n await callAPI('restore', { method: 'POST', query: { id: item.id } });\n await refreshItems();\n }}>\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={() => setDetailsItem(item)}>\n <Info className=\"mr-2 size-4\" /> Details\n </ContextMenuItem>\n <ContextMenuItem onClick={() => {\n setRenameItem(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\n {/* Components */}\n <DriveFileDetails\n item={detailsItem}\n isOpen={!!detailsItem}\n onClose={() => setDetailsItem(null)}\n apiEndpoint={apiEndpoint}\n />\n\n {/* Dialogs */}\n <DialogConfirmation\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n title=\"Create New Folder\"\n description=\"Enter a name for the new folder\"\n inputs={[{ type: 'INPUT', id: 'name', name: 'Folder name', required: true }] as const}\n onConfirm={async (inputs) => {\n try {\n await callAPI('createFolder', {\n method: 'POST',\n body: JSON.stringify({ name: inputs.name, parentId: currentFolderId || 'root' })\n });\n await refreshItems();\n return [true];\n } catch (error) {\n return [false, error instanceof Error ? error.message : 'Failed to create folder'];\n }\n }}\n />\n\n <DialogConfirmation\n open={dialogs.rename}\n onClose={() => {\n setDialogs(prev => ({ ...prev, rename: false }));\n setRenameItem(null);\n }}\n title={`Rename ${renameItem?.information.type === 'FOLDER' ? 'Folder' : 'File'}`}\n description=\"Enter a new name\"\n inputs={[{ type: 'INPUT', id: 'name', name: 'Name', default: renameItem?.name, required: true }] as const}\n onConfirm={async (inputs) => {\n if (!renameItem) return [false, 'No item selected'];\n try {\n await callAPI('rename', {\n method: 'PATCH',\n query: { id: renameItem.id },\n body: JSON.stringify({ newName: inputs.name })\n });\n await refreshItems();\n setRenameItem(null);\n return [true];\n } catch (error) {\n return [false, error instanceof Error ? error.message : 'Failed to rename'];\n }\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 try {\n await deleteItems([itemToDelete.id]);\n await refreshItems();\n setItemToDelete(null);\n return [true];\n } catch (error) {\n return [false, error instanceof Error ? error.message : 'Failed to delete'];\n }\n }}\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 </div>\n </DndContext>\n );\n};\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","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\n useEffect(() => {\n setInputsValue(\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n setError(null)\n }, [inputs])\n\n // ** Render\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\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","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\"\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\"\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","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","\"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\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\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 </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","// ** Drive File Details Component\n'use client';\n\nimport React from 'react';\nimport { TDatabaseDrive } from '@/types/server';\nimport { formatBytes } from '@/client/utils';\nimport {\n Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription\n} from \"@/client/components/ui/sheet\";\nimport { Copy, FileText, Calendar, HardDrive, Hash, Film, Image as ImageIcon } from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Separator } from '@/client/components/ui/separator';\n\nexport const DriveFileDetails = (props: Readonly<{\n item: TDatabaseDrive | null;\n isOpen: boolean;\n onClose: () => void;\n apiEndpoint: string;\n}>) => {\n // ** Deconstruct Props\n const { item, isOpen, onClose, apiEndpoint } = props;\n\n if (!item) return null;\n\n const isFile = item.information.type === 'FILE';\n const isFolder = item.information.type === 'FOLDER';\n\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=medium${tokenParam}`;\n const fileUrl = `${apiEndpoint}?action=serve&id=${item.id}${tokenParam}`;\n\n const DetailItem = ({ icon: Icon, label, value }: { icon: any, label: string, value: string | React.ReactNode }) => (\n <div className=\"flex items-start gap-3 py-3\">\n <Icon className=\"size-4 text-muted-foreground mt-0.5\" />\n <div className=\"flex-1 space-y-0.5\">\n <p className=\"text-xs font-medium text-muted-foreground\">{label}</p>\n <div className=\"text-sm text-foreground break-all\">{value}</div>\n </div>\n </div>\n );\n\n return (\n <Sheet open={isOpen} onOpenChange={onClose}>\n <SheetContent className=\"w-[90%] sm:max-w-md overflow-y-auto\">\n <SheetHeader className=\"pb-4\">\n <SheetTitle>Details</SheetTitle>\n <SheetDescription>View information about this item.</SheetDescription>\n </SheetHeader>\n\n <div className=\"space-y-6\">\n {/* Preview */}\n <div className=\"flex flex-col items-center p-6 bg-muted/20 rounded-lg border\">\n {item.information.type === 'FILE' && (item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')) ? (\n <div className=\"aspect-video w-full rounded-md overflow-hidden bg-background border shadow-sm flex items-center justify-center\">\n <img src={thumbnailUrl} alt={item.name} className=\"object-contain size-full\" />\n </div>\n ) : (\n <div className=\"size-20 bg-muted rounded-full flex items-center justify-center\">\n <FileText className=\"size-10 text-muted-foreground\" />\n </div>\n )}\n <h3 className=\"mt-4 font-medium text-center break-all\">{item.name}</h3>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {item.information.type === 'FOLDER' ? 'Folder' : item.information.mime}\n </p>\n </div>\n\n <Separator />\n\n {/* Metadata */}\n <div className=\"space-y-1\">\n <DetailItem icon={HardDrive} label=\"Size\" value={item.information.type === 'FOLDER' ? '-' : formatBytes(item.information.sizeInBytes)} />\n <DetailItem icon={Calendar} label=\"Created\" value={new Date(item.createdAt).toLocaleString()} />\n {item.information.type === 'FILE' && (\n <>\n <DetailItem icon={FileText} label=\"Type\" value={item.information.mime} />\n {item.information.width && (\n <DetailItem icon={ImageIcon} label=\"Dimensions\" value={`${item.information.width} x ${item.information.height}`} />\n )}\n {item.information.duration && (\n <DetailItem icon={Film} label=\"Duration\" value={`${Math.round(item.information.duration)}s`} />\n )}\n {item.information.hash && (\n <DetailItem icon={Hash} label=\"Hash (SHA-256)\" value={<span className=\"font-mono text-xs\">{item.information.hash.substring(0, 16)}...</span>} />\n )}\n </>\n )}\n </div>\n\n <Separator />\n\n <div className=\"flex gap-2\">\n {item.information.type === 'FILE' && (\n <Button className=\"w-full\" variant=\"outline\" onClick={() => window.open(fileUrl, '_blank')}>\n Download / View\n </Button>\n )}\n <Button className=\"w-full\" variant=\"secondary\" onClick={() => {\n navigator.clipboard.writeText(item.id);\n }}>\n <Copy className=\"mr-2 size-3.5\" /> Copy ID\n </Button>\n </div>\n </div>\n </SheetContent>\n </Sheet>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\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-auto font-normal text-xs sm:text-sm px-1.5 sm:px-2 py-0.5 sm:py-1 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 = () => {\n const { path, navigateToFolder } = useDrive();\n\n return (\n <ol className=\"flex items-center gap-1 sm:gap-1.5 text-sm text-muted-foreground bg-muted/30 px-2 sm:px-3 py-1.5 sm:py-2 rounded-md border w-full overflow-x-auto flex-nowrap min-w-0\" 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 { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/useUpload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock } from 'lucide-react';\nimport { cn } 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 = ({ status }: { status: TDriveUploadState['status'] }) => {\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\nexport const DriveUpload = (props: Readonly<{ compact?: boolean; onComplete?: (item: unknown) => void }>) => {\n const { compact = false, onComplete } = props;\n const [isDragging, setIsDragging] = useState(false);\n const [showUploadsDialog, setShowUploadsDialog] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { currentFolderId, refreshItems, apiEndpoint, activeAccountId } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, () => {\n refreshItems();\n onComplete?.(null);\n });\n\n // Auto-hide dialog when all uploads are finished\n React.useEffect(() => {\n if (!showUploadsDialog || uploads.length === 0) 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 }, 2000);\n return () => clearTimeout(timer);\n }\n }, [uploads, showUploadsDialog]);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files || files.length === 0) return;\n uploadFiles(Array.from(files), currentFolderId);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, refreshItems, onComplete]);\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\">\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\",\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 {['uploading', 'queued', 'pending'].includes(upload.status) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => cancelUpload(upload.id)}\n >\n <X className=\"size-3.5\" />\n </Button>\n )}\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 <div className=\"flex items-center gap-2\">\n <input ref={inputRef} type=\"file\" multiple onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }} className=\"hidden\" aria-hidden=\"true\" />\n <Button\n onClick={() => inputRef.current?.click()}\n type=\"button\"\n size=\"sm\"\n disabled={hasUploadsInProgress}\n >\n <UploadIcon className=\"size-4 mr-1.5\" /> Upload Files\n </Button>\n\n {uploads.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowUploadsDialog(true)}\n >\n {activeUploads.length > 0 && (\n <Loader2 className=\"size-3.5 mr-1.5 animate-spin\" />\n )}\n {activeUploads.length > 0\n ? `Uploading (${activeUploads.length})`\n : 'Upload Status'\n }\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 ref={inputRef} type=\"file\" multiple onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }} className=\"hidden\" aria-hidden=\"true\" />\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={() => setShowUploadsDialog(true)}>View Upload Progress</Button>\n </div>\n )}\n {renderDialog()}\n </div>\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 ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & { indicatorClassName?: string }) {\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(\"bg-primary h-full w-full flex-1 transition-all\", indicatorClassName)}\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","'use client';\n\nimport React from 'react';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Database, HardDrive, Plus, LogOut, Check,\n ChevronsUpDown, FolderOpen, Trash2, Menu\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} from \"@/client/components/ui/sheet\";\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Sidebar Content Component (reusable for both desktop and mobile)\nconst SidebarContent = () => {\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView\n } = useDrive();\n\n const currentAccountName = activeAccountId\n ? accounts.find(a => a.id === activeAccountId)?.name || 'Unknown Account'\n : 'Local Storage';\n\n const currentAccountEmail = activeAccountId\n ? accounts.find(a => a.id === activeAccountId)?.email\n : 'On this device';\n\n return (\n <div className=\"w-full h-full flex flex-col bg-muted/10 border-r\">\n {/* Account Switcher */}\n <div className=\"p-3 border-b\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between px-2 h-auto min-h-12 py-2 hover:bg-muted/50\">\n <div className=\"flex items-center gap-2 sm:gap-3 text-left min-w-0 flex-1\">\n <div className=\"size-8 sm:size-9 rounded-md bg-primary/10 flex items-center justify-center shrink-0\">\n {activeAccountId ? <Database className=\"size-4\" /> : <HardDrive className=\"size-4\" />}\n </div>\n <div className=\"flex flex-col truncate min-w-0\">\n <span className=\"text-sm font-semibold truncate\">{currentAccountName}</span>\n <span className=\"text-xs text-muted-foreground truncate font-normal\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"size-4 text-muted-foreground shrink-0 opacity-50 ml-1\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-60\" align=\"start\">\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">Switch Account</DropdownMenuLabel>\n\n {/* Local Storage Option */}\n <DropdownMenuItem onClick={() => setActiveAccountId(null)} className=\"gap-2\">\n <div className=\"flex items-center justify-center size-6 rounded bg-muted\">\n <HardDrive className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col flex-1\">\n <span className=\"text-sm font-medium\">Local Storage</span>\n </div>\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 key={account.id} onClick={() => setActiveAccountId(account.id)} className=\"gap-2 group\">\n <div className=\"flex items-center justify-center size-6 rounded bg-muted\">\n <Database className=\"size-3.5\" />\n </div>\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <span className=\"text-sm font-medium truncate\">{account.name}</span>\n <span className=\"text-xs text-muted-foreground truncate\">{account.email}</span>\n </div>\n {activeAccountId === account.id ? (\n <Check className=\"size-3.5 text-primary\" />\n ) : (\n <LogOut\n className=\"size-3.5 text-destructive transition-opacity hover:bg-destructive/10 rounded-sm\"\n onClick={async (e) => {\n e.stopPropagation();\n if (confirm('Are you sure you want to disconnect this account? Synced files will be deleted from local cache.')) {\n await callAPI('removeAccount', { query: { id: account.id } });\n await refreshAccounts();\n if (activeAccountId === account.id) setActiveAccountId(null);\n }\n }}\n />\n )}\n </DropdownMenuItem>\n ))}\n\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"gap-2 text-primary focus:text-primary\">\n <Plus className=\"size-4\" />\n <span className=\"font-medium\">Add Storage Account</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuItem onClick={async () => {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n if (res.status !== 200 || !res.data?.url) {\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n if (res.status === 200 && res.data?.url) {\n const width = 600;\n const height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n window.open(\n res.data.url,\n 'Connect to Google Drive',\n `width=${width},height=${height},top=${top},left=${left}`\n );\n const listener = (event: MessageEvent) => {\n if (event.data === 'oauth-success') {\n refreshAccounts();\n window.removeEventListener('message', listener);\n }\n };\n window.addEventListener('message', listener);\n }\n }}>\n Google Drive\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Navigation */}\n <div className=\"flex-1 px-3 py-2 space-y-1\">\n <Button\n variant={currentView !== 'TRASH' ? \"secondary\" : \"ghost\"}\n className={cn(\"w-full justify-start gap-3\", currentView !== 'TRASH' && \"bg-primary/10 text-primary hover:bg-primary/15\")}\n onClick={() => setCurrentView('BROWSE')}\n >\n <FolderOpen className=\"size-4\" />\n My Files\n </Button>\n <Button\n variant={currentView === 'TRASH' ? \"secondary\" : \"ghost\"}\n className={cn(\"w-full justify-start gap-3\", currentView === 'TRASH' && \"bg-destructive/10 text-destructive hover:bg-destructive/15\")}\n onClick={() => setCurrentView('TRASH')}\n >\n <Trash2 className=\"size-4\" />\n Trash\n </Button>\n </div>\n\n {/* Storage */}\n <div className=\"px-3 py-2.5 mt-auto border-t bg-background/50\">\n <DriveStorageIndicator />\n </div>\n </div>\n );\n};\n\n// ** Desktop Sidebar (always visible on larger screens)\nexport const DriveSidebar = () => {\n return (\n <>\n {/* Mobile: Hamburger Menu + Sheet */}\n <div className=\"lg:hidden\">\n <Sheet>\n <SheetTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-70 sm:w-80 p-0\">\n <SidebarContent />\n </SheetContent>\n </Sheet>\n </div>\n\n {/* Desktop: Always visible sidebar */}\n <div className=\"hidden lg:flex w-full h-full\">\n <SidebarContent />\n </div>\n </>\n );\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","// ** 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 const { compact = false, className } = props;\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 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\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 { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\n\nexport const DriveHeader = () => {\n const {\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n selectedFileIds, setItems, apiEndpoint, setSelectedFileIds,\n currentView, setCurrentView, searchQuery, setSearchQuery, callAPI, refreshItems,\n searchScope, setSearchScope\n } = useDrive();\n\n // Localization removed as per user request\n const [dialogs, setDialogs] = useState({ delete: false, emptyTrash: false });\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 border-b bg-muted/30 p-2\">\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 try {\n await Promise.all(selectedFileIds.map(id =>\n fetch(`${apiEndpoint}?action=restore&id=${id}`, { method: 'POST' })\n ));\n await refreshItems();\n setSelectedFileIds([]);\n } catch (error) {\n console.error(\"Error restoring files:\", error);\n }\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 rounded-md p-0.5 gap-0.5\">\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\"h-8 w-8\", viewMode === \"GRID\" && \"bg-white shadow-sm hover:bg-white\")}\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(\"h-8 w-8\", viewMode === \"LIST\" && \"bg-white shadow-sm hover:bg-white\")}\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 try {\n if (currentView === 'TRASH') {\n await Promise.all(selectedFileIds.map(id =>\n fetch(`${apiEndpoint}?action=deletePermanent&id=${id}`, { method: 'DELETE' })\n ));\n await refreshItems();\n setSelectedFileIds([]);\n } else {\n const response = await fetch(`${apiEndpoint}?action=deleteMany`, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ ids: selectedFileIds })\n });\n const result = await response.json();\n if (result.status === 200) {\n setItems(prevItems => prevItems.filter(item => !selectedFileIds.includes(item.id)));\n setSelectedFileIds([]);\n } else {\n return [false, result.message || 'Failed to delete files'];\n }\n }\n return [true];\n } catch (error) {\n return [false, error instanceof Error ? error.message : 'Error deleting files'];\n }\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 try {\n await callAPI('emptyTrash', { method: 'POST' });\n await refreshItems();\n return [true];\n } catch (e) {\n return [false, e instanceof Error ? e.message : 'Failed to empty trash'];\n }\n }}\n />\n </div>\n );\n};\n","// ** FilePreview Component\n'use client';\n\nimport React, { useState } from 'react';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/client/components/ui/dialog';\nimport { Button } from '@/client/components/ui/button';\n\nif (typeof window !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.js`;\n}\n\nexport const DriveFilePreview = (props: Readonly<{ item: TDatabaseDrive; onClose: () => void }>) => {\n const { item, onClose } = props;\n const { apiEndpoint } = useDrive();\n const [pdfNumPages, setPdfNumPages] = useState<number | null>(null);\n\n if (item.information.type === 'FOLDER') return null;\n\n const mime = item.information.mime;\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const fileUrl = `${apiEndpoint}?action=serve&id=${item.id}${tokenParam}`;\n\n const renderContent = () => {\n if (mime.startsWith('image/')) return <img src={fileUrl} alt={item.name} className=\"max-w-full max-h-[70vh] rounded-md object-contain shadow-sm\" />;\n if (mime.startsWith('video/')) return <video src={fileUrl} controls autoPlay className=\"max-w-full max-h-[70vh] rounded-md shadow-sm bg-black\">Your browser does not support video playback.</video>;\n if (mime.startsWith('audio/')) return (\n <div className=\"flex flex-col items-center gap-6 py-8 px-4 w-full\">\n <div className=\"w-24 h-24 rounded-full bg-primary/10 flex items-center justify-center\">\n <span className=\"text-4xl\">🎵</span>\n </div>\n <div className=\"text-center space-y-1\">\n <h4 className=\"font-medium text-lg\">{item.name}</h4>\n <p className=\"text-sm text-muted-foreground\">{mime}</p>\n </div>\n <audio src={fileUrl} controls autoPlay className=\"w-full max-w-md mt-2\">Your browser does not support audio playback.</audio>\n </div>\n );\n if (mime === 'application/pdf') {\n return (\n <div className=\"max-h-[70vh] overflow-y-auto rounded-md border bg-white dark:bg-zinc-900 mx-auto w-full\">\n <Document file={fileUrl} onLoadSuccess={({ numPages }) => setPdfNumPages(numPages)} className=\"flex flex-col items-center gap-4 p-4\">\n {pdfNumPages && Array.from(new Array(Math.min(pdfNumPages, 10)), (_, index) => (\n <Page\n key={`page_${index + 1}`}\n pageNumber={index + 1}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n className=\"shadow-md\"\n width={600}\n />\n ))}\n </Document>\n {pdfNumPages && pdfNumPages > 10 && (\n <div className=\"p-4 text-center text-sm text-muted-foreground border-t bg-muted/20\">\n Showing 10 of {pdfNumPages} pages (Preview limited)\n </div>\n )}\n </div>\n );\n }\n return (\n <div className=\"flex flex-col items-center justify-center gap-6 py-12\">\n <div className=\"p-4 rounded-full bg-muted\">\n <span className=\"text-4xl opacity-50\">📄</span>\n </div>\n <div className=\"text-center space-y-2\">\n <h4 className=\"font-medium\">Preview not available</h4>\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">\n This file type usually cannot be previewed in the browser.\n </p>\n </div>\n <Button asChild>\n <a href={fileUrl} download={item.name}>Download File</a>\n </Button>\n </div>\n );\n };\n\n return (\n <Dialog open={true} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] flex flex-col gap-0 p-0\">\n <DialogHeader className=\"px-4 py-3 border-b shrink-0 flex flex-row items-center justify-between\">\n <DialogTitle className=\"truncate pr-8\">{item.name}</DialogTitle>\n </DialogHeader>\n <div className=\"p-6 overflow-auto flex items-center justify-center bg-muted/5 min-h-75 flex-1\">\n {renderContent()}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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","names":["useState","useCallback","useState","useCallback","useMemo","useEffect","jsx","React","useMemo","useEffect","useRef","Folder","Loader2","ChevronRight","React","jsx","jsx","useEffect","useState","jsx","cva","jsx","cva","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","Label","jsx","jsxs","useState","useEffect","Label","Trash2","React","cva","X","jsx","jsxs","jsx","cva","jsxs","X","FileText","jsx","Separator","jsx","jsxs","FileText","Separator","jsx","jsxs","React","useState","useRef","useCallback","X","AlertCircle","jsx","Fragment","jsx","jsxs","AlertCircle","X","useState","useRef","React","useCallback","HardDrive","Check","React","Check","ChevronRight","Circle","jsx","jsxs","jsxs","jsx","ChevronRight","Check","Circle","useEffect","AlertCircle","Fragment","jsx","jsxs","useEffect","Fragment","jsx","jsxs","HardDrive","Check","Fragment","jsx","jsxs","React","oldIndex","newIndex","useMemo","items","useRef","useEffect","Loader2","Folder","ChevronRight","Trash2","error","useState","Trash2","Group","Calendar","Check","RotateCcw","Menu","jsx","jsxs","useState","Menu","RotateCcw","Trash2","Group","Check","Calendar","useState","jsx","jsxs","useState","UploadIcon","X","jsx","jsxs","useState","useEffect","useCallback","useMemo","UploadIcon","X"]}
|