@muhgholy/next-drive 4.1.0 → 4.3.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 +18 -33
- package/dist/{chunk-OGVU5UBC.cjs → chunk-25MNL2OG.cjs} +369 -190
- package/dist/chunk-25MNL2OG.cjs.map +1 -0
- package/dist/{chunk-RGE7EYMF.js → chunk-MTGJTRD5.js} +360 -181
- package/dist/chunk-MTGJTRD5.js.map +1 -0
- package/dist/{chunk-CFLH4TCQ.cjs → chunk-TA6L5FYG.cjs} +3 -22
- package/dist/chunk-TA6L5FYG.cjs.map +1 -0
- package/dist/{chunk-T43C7MQ6.js → chunk-TMSG5WJZ.js} +4 -22
- package/dist/chunk-TMSG5WJZ.js.map +1 -0
- package/dist/client/components/dialog.d.ts.map +1 -1
- package/dist/client/components/drive/explorer.d.ts.map +1 -1
- package/dist/client/components/drive/file-grid.d.ts.map +1 -1
- package/dist/client/context.d.ts +2 -9
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/hooks/useUpload.d.ts +1 -1
- package/dist/client/hooks/useUpload.d.ts.map +1 -1
- package/dist/client/index.cjs +118 -118
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.css +1 -1
- package/dist/client/index.d.ts +1 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +15 -15
- package/dist/client/index.js.map +1 -1
- package/dist/client/utils.d.ts +2 -9
- package/dist/client/utils.d.ts.map +1 -1
- package/dist/server/config.d.ts +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/controllers/drive.d.ts +0 -2
- package/dist/server/controllers/drive.d.ts.map +1 -1
- package/dist/server/express.cjs +12 -12
- package/dist/server/express.cjs.map +1 -1
- package/dist/server/express.d.ts +2 -2
- package/dist/server/express.d.ts.map +1 -1
- package/dist/server/express.js +3 -3
- package/dist/server/express.js.map +1 -1
- package/dist/server/index.cjs +15 -19
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/providers/google.d.ts.map +1 -1
- package/dist/server/providers/local.d.ts.map +1 -1
- package/dist/server/utils/ffmpeg.d.ts +7 -13
- package/dist/server/utils/ffmpeg.d.ts.map +1 -1
- package/dist/server/utils/folderValidation.d.ts +12 -6
- package/dist/server/utils/folderValidation.d.ts.map +1 -1
- package/dist/server/utils/imageConvert.d.ts +7 -14
- package/dist/server/utils/imageConvert.d.ts.map +1 -1
- package/dist/server/utils/metadata.d.ts +4 -22
- package/dist/server/utils/metadata.d.ts.map +1 -1
- package/dist/server/utils/migration.d.ts +2 -0
- package/dist/server/utils/migration.d.ts.map +1 -0
- package/dist/server/utils.d.ts +0 -1
- package/dist/server/utils.d.ts.map +1 -1
- package/dist/server/zod/schemas.d.ts +2 -8
- package/dist/server/zod/schemas.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +0 -2
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/lib/database/storage/account.d.ts +1 -1
- package/dist/types/lib/database/storage/account.d.ts.map +1 -1
- package/dist/types/server/config.d.ts +0 -5
- package/dist/types/server/config.d.ts.map +1 -1
- package/dist/types/server/express.d.ts +1 -5
- package/dist/types/server/express.d.ts.map +1 -1
- package/dist/types/server/index.d.ts +2 -0
- package/dist/types/server/index.d.ts.map +1 -1
- package/dist/types/server/metadata.d.ts +11 -0
- package/dist/types/server/metadata.d.ts.map +1 -0
- package/dist/types/server/migration.d.ts +6 -0
- package/dist/types/server/migration.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-CFLH4TCQ.cjs.map +0 -1
- package/dist/chunk-OGVU5UBC.cjs.map +0 -1
- package/dist/chunk-RGE7EYMF.js.map +0 -1
- package/dist/chunk-T43C7MQ6.js.map +0 -1
- package/dist/client/index.css.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/context.tsx","../../src/client/hooks/useUpload.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/dialog-fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/dialog.tsx","../../src/client/components/ui/dropdown-menu.tsx","../../src/client/components/ui/alert.tsx","../../src/client/components/ui/input.tsx","../../src/client/components/ui/label.tsx","../../src/client/components/dialog.tsx","../../src/client/components/drive/RenameAccountDialog.tsx","../../src/client/components/drive/dnd-provider.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/CreateFolderDialog.tsx","../../src/client/components/drive/RenameDialog.tsx","../../src/client/components/drive/file-grid.tsx","../../src/client/components/drive/header.tsx","../../src/client/components/drive/path-bar.tsx","../../src/client/components/drive/upload.tsx","../../src/client/components/drive/storage/indicator.tsx","../../src/client/file-chooser.tsx","../../src/client/components/drive/sidebar.tsx","../../src/client/components/drive/explorer.tsx"],"names":["createContext","React","useState","useCallback","driveCreateUrl","driveCreateSrcSet","jsx","useContext","useRef","useEffect","cva","Slot","cn","DialogPrimitive","jsxs","X","SheetPrimitive","React2","DialogPrimitive2","DropdownMenuPrimitive","React3","ChevronRight","Check","Circle","Label","LabelPrimitive","AlertCircle","useForm","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","pointerWithin","ProgressPrimitive","ContextMenuPrimitive","React5","useSortable","CSS","Fragment","getFileIcon","formatBytes","RotateCcw","Trash2","Pencil","useMemo","matchesMimeFilter","startOfWeek","subWeeks","isToday","isYesterday","isAfter","items","Loader2","Folder","SortableContext","rectSortingStrategy","FolderPlus","Menu","Group","Search","ArrowUpDown","Calendar","ArrowDownAZ","ArrowUpAZ","ArrowDown01","ArrowUp01","LayoutGrid","List","useDroppable","CheckCircle2","Clock","FileText","RefreshCw","UploadIcon","Cloud","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen","SortableItem","oldIndex","newIndex","closestCenter"],"mappings":"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","file":"index.cjs","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\nimport { driveCreateUrl, driveCreateSrcSet } from '@/client/utils';\n\n// ** Context Types\nexport type TDriveContext = {\n apiEndpoint: string;\n withCredentials: boolean;\n\n // ** Navigation\n currentFolderId: string | null;\n path: TDrivePathItem[];\n navigateToFolder: (item: { id: string | null; name: string } | null) => void;\n navigateUp: () => void;\n\n // ** Items\n items: TDatabaseDrive[];\n setItems: React.Dispatch<React.SetStateAction<TDatabaseDrive[]>>;\n isLoading: boolean;\n error: string | null;\n fetchItems: () => Promise<void>;\n triggerFetch: () => void;\n\n // ** Accounts\n accounts: { id: string; name: string; email: string; provider: 'GOOGLE' }[];\n activeAccountId: string | null;\n setActiveAccountId: (id: string | null) => void;\n refreshAccounts: () => Promise<void>;\n availableProviders: { google: boolean };\n\n // ** Storage\n quota: TDriveQuota | null;\n refreshQuota: () => Promise<void>;\n\n // ** UI State\n viewMode: 'GRID' | 'LIST';\n setViewMode: (mode: 'GRID' | 'LIST') => void;\n currentView: 'BROWSE' | 'TRASH' | 'SEARCH';\n setCurrentView: (view: 'BROWSE' | 'TRASH' | 'SEARCH') => void;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchScope: 'ACTIVE' | 'TRASH';\n setSearchScope: (scope: 'ACTIVE' | 'TRASH') => void;\n groupBy: 'NONE' | 'CREATED_AT';\n setGroupBy: (group: 'NONE' | 'CREATED_AT') => void;\n sortBy: { field: string; order: number };\n setSortBy: (sort: { field: string; order: number }) => void;\n\n // ** Selection\n selectionMode: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n selectedFileIds: string[];\n setSelectedFileIds: React.Dispatch<React.SetStateAction<string[]>>;\n\n // ** Pagination\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n\n // ** Utilities\n createUrl: (driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => string;\n createSrcSet: (driveFile: TDriveFile, format?: TImageFormat) => { srcSet: string; sizes: string };\n callAPI: <T>(action: string, options?: RequestInit & { query?: Record<string, string> }) => Promise<TDriveAPIResponse<T>>;\n\n // ** Actions (Optimistic)\n createFolder: (name: string) => Promise<void>;\n renameItem: (id: string, newName: string) => Promise<void>;\n deleteItem: (id: string) => Promise<void>;\n moveItem: (id: string, targetFolderId: string) => Promise<void>;\n restoreItem: (id: string) => Promise<void>;\n};\n\nconst DriveContext = createContext<TDriveContext | null>(null);\n\n// ** Provider\nexport const DriveProvider = (props: Readonly<{\n children: ReactNode;\n apiEndpoint: string;\n initialActiveAccountId?: string | null;\n initialSelectionMode?: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n defaultSelectedFileIds?: string[];\n withCredentials?: boolean;\n lazyFetch?: boolean;\n}>) => {\n const {\n children,\n apiEndpoint,\n initialActiveAccountId = null,\n initialSelectionMode = { type: 'SINGLE' },\n defaultSelectedFileIds = [],\n withCredentials = false,\n lazyFetch = false\n } = props;\n\n // Track if initial fetch has been triggered (for lazy mode)\n const [hasFetched, setHasFetched] = React.useState(!lazyFetch);\n\n // =========================================================================\n // STATE\n // =========================================================================\n\n // ** Items - Simple flat array for current view\n const [items, setItems] = useState<TDatabaseDrive[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // ** Navigation\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [path, setPath] = useState<TDrivePathItem[]>([{ id: null, name: 'Home' }]);\n\n // ** Accounts\n const [accounts, setAccounts] = useState<{ id: string; name: string; email: string; provider: 'GOOGLE' }[]>([]);\n const [activeAccountId, setActiveAccountIdState] = useState<string | null>(initialActiveAccountId);\n const [availableProviders, setAvailableProviders] = useState<{ google: boolean }>({ google: false });\n\n // ** Storage\n const [quota, setQuota] = useState<TDriveQuota | null>(null);\n\n // ** UI State\n const [viewMode, setViewMode] = useState<'GRID' | 'LIST'>(() => {\n if (typeof window !== 'undefined') return window.innerWidth < 768 ? 'LIST' : 'GRID';\n return 'GRID';\n });\n const [currentView, setCurrentView] = useState<'BROWSE' | 'TRASH' | 'SEARCH'>('BROWSE');\n const [searchQuery, setSearchQuery] = useState('');\n const [searchScope, setSearchScope] = useState<'ACTIVE' | 'TRASH'>('ACTIVE');\n const [groupBy, setGroupBy] = useState<'NONE' | 'CREATED_AT'>('NONE');\n const [sortBy, setSortBy] = useState<{ field: string; order: number }>({ field: 'createdAt', order: -1 });\n\n // ** Selection\n const [selectionMode] = useState(initialSelectionMode);\n const [selectedFileIds, setSelectedFileIds] = useState<string[]>(defaultSelectedFileIds);\n\n // ** Pagination\n const [hasMore, setHasMore] = useState(false);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // =========================================================================\n // API HELPER\n // =========================================================================\n\n const callAPI = useCallback(async <T,>(\n action: string,\n options?: RequestInit & { query?: Record<string, string> }\n ): Promise<TDriveAPIResponse<T>> => {\n const { query, ...fetchOptions } = options || {};\n const params = new URLSearchParams({ action, ...query });\n const url = `${apiEndpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...((fetchOptions?.headers as Record<string, string>) || {})\n };\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n return await res.json();\n } catch (err) {\n return { status: 0, message: err instanceof Error ? err.message : 'Network error' };\n }\n }, [apiEndpoint, activeAccountId, withCredentials]);\n\n // =========================================================================\n // FETCH FUNCTIONS\n // =========================================================================\n\n const fetchItems = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n let res: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'TRASH') {\n res = await callAPI('trash');\n } else if (currentView === 'SEARCH' && searchQuery) {\n res = await callAPI('search', { query: { q: searchQuery, limit: '50' } });\n } else {\n res = await callAPI('list', { query: { folderId: currentFolderId || 'root', limit: '50' } });\n }\n\n if (res.status === 200 && res.data) {\n setItems(res.data.items);\n setHasMore(!!res.data.hasMore);\n } else {\n setError(res.message || 'Failed to load');\n setItems([]);\n }\n\n setIsLoading(false);\n }, [callAPI, currentFolderId, currentView, searchQuery]);\n\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading || isLoadingMore) return;\n\n const lastItem = items[items.length - 1];\n if (!lastItem) return;\n\n setIsLoadingMore(true);\n\n const res = await callAPI<{ items: TDatabaseDrive[]; hasMore?: boolean }>('list', {\n query: { folderId: currentFolderId || 'root', limit: '50', afterId: lastItem.id }\n });\n\n if (res.status === 200 && res.data) {\n setItems(prev => [...prev, ...res.data!.items]);\n setHasMore(!!res.data.hasMore);\n }\n\n setIsLoadingMore(false);\n }, [callAPI, currentFolderId, hasMore, isLoading, isLoadingMore, items]);\n\n const refreshAccounts = useCallback(async () => {\n const res = await callAPI<{ accounts: typeof accounts }>('listAccounts');\n if (res.status === 200 && res.data) setAccounts(res.data.accounts);\n\n // Also fetch available providers\n const infoRes = await callAPI<{ providers: { google: boolean } }>('information');\n if (infoRes.status === 200 && infoRes.data) setAvailableProviders(infoRes.data.providers);\n }, [callAPI]);\n\n const refreshQuota = useCallback(async () => {\n const res = await callAPI<TDriveQuota>('quota');\n if (res.status === 200 && res.data) setQuota(res.data);\n }, [callAPI]);\n\n // =========================================================================\n // NAVIGATION\n // =========================================================================\n\n const setActiveAccountId = useCallback((id: string | null) => {\n setActiveAccountIdState(id);\n if (id) localStorage.setItem('drive_active_account', id);\n else localStorage.removeItem('drive_active_account');\n // Reset state\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setItems([]);\n setSelectedFileIds([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n\n if (!item) {\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n return;\n }\n\n setCurrentFolderId(item.id);\n setPath(prev => {\n const idx = prev.findIndex(p => p.id === item.id);\n return idx !== -1 ? prev.slice(0, idx + 1) : [...prev, { id: item.id, name: item.name }];\n });\n }, []);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n const newPath = path.slice(0, -1);\n setPath(newPath);\n setCurrentFolderId(newPath[newPath.length - 1]?.id || null);\n }, [path]);\n\n // =========================================================================\n // OPTIMISTIC ACTIONS\n // =========================================================================\n\n const createFolder = useCallback(async (name: string) => {\n // Optimistic: Add temp folder\n const tempId = `temp-${Date.now()}`;\n const tempFolder = {\n id: tempId,\n name,\n parentId: currentFolderId,\n information: { type: 'FOLDER' as const },\n createdAt: new Date(),\n trashedAt: null,\n } as TDatabaseDrive;\n setItems(prev => [tempFolder, ...prev]);\n\n // API call\n const res = await callAPI<{ item: TDatabaseDrive }>('createFolder', {\n method: 'POST',\n body: JSON.stringify({ name, parentId: currentFolderId || 'root' })\n });\n\n // Replace temp with real\n if ((res.status === 200 || res.status === 201) && res.data?.item) {\n setItems(prev => prev.map(i => i.id === tempId ? res.data!.item : i));\n } else {\n // Rollback\n setItems(prev => prev.filter(i => i.id !== tempId));\n }\n }, [callAPI, currentFolderId]);\n\n const renameItem = useCallback(async (id: string, newName: string) => {\n // Optimistic: Update name immediately\n setItems(prev => prev.map(i => i.id === id ? { ...i, name: newName } : i));\n\n // API call (fire and forget, already updated)\n await callAPI('rename', {\n method: 'PATCH',\n query: { id },\n body: JSON.stringify({ newName })\n });\n }, [callAPI]);\n\n const deleteItem = useCallback(async (id: string) => {\n // Optimistic: Remove from list immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call\n if (currentView === 'TRASH') {\n await callAPI('deletePermanent', { query: { id } });\n } else {\n await callAPI('delete', { query: { id } });\n }\n }, [callAPI, currentView]);\n\n const moveItem = useCallback(async (id: string, targetFolderId: string) => {\n // Optimistic: Remove from current view (it's moving away)\n setItems(prev => prev.filter(i => i.id !== id));\n\n // API call\n await callAPI('move', {\n method: 'POST',\n body: JSON.stringify({ ids: [id], targetFolderId })\n });\n }, [callAPI]);\n\n const restoreItem = useCallback(async (id: string) => {\n // Optimistic: Remove from trash view immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call in background\n await callAPI('restore', { method: 'POST', query: { id } });\n }, [callAPI]);\n\n // =========================================================================\n // UTILITIES\n // =========================================================================\n\n const createUrl = useCallback((driveFile: TDriveFile, options?: { quality?: TImageQuality; format?: TImageFormat }) => {\n return driveCreateUrl(driveFile, apiEndpoint, options);\n }, [apiEndpoint]);\n\n const createSrcSet = useCallback((driveFile: TDriveFile, format?: TImageFormat) => {\n return driveCreateSrcSet(driveFile, apiEndpoint, format);\n }, [apiEndpoint]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n\n // Load stored account on mount\n React.useEffect(() => {\n const stored = localStorage.getItem('drive_active_account');\n if (stored) setActiveAccountIdState(stored);\n }, []);\n\n // Fetch items when view/folder/account changes (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n fetchItems();\n }, [fetchItems, hasFetched]);\n\n // Fetch accounts & quota on mount and account change (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshAccounts();\n }, [refreshAccounts, hasFetched]);\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshQuota();\n }, [refreshQuota, activeAccountId, hasFetched]);\n\n // Trigger initial fetch (used by components to start fetching in lazy mode)\n const triggerFetch = React.useCallback(() => {\n if (!hasFetched) setHasFetched(true);\n }, [hasFetched]);\n\n // =========================================================================\n // RENDER\n // =========================================================================\n\n return (\n <DriveContext.Provider value={{\n apiEndpoint,\n withCredentials,\n\n // Navigation\n currentFolderId,\n path,\n navigateToFolder,\n navigateUp,\n\n // Items\n items,\n setItems,\n isLoading,\n error,\n fetchItems,\n triggerFetch,\n\n // Accounts\n accounts,\n activeAccountId,\n setActiveAccountId,\n refreshAccounts,\n availableProviders,\n\n // Storage\n quota,\n refreshQuota,\n\n // UI\n viewMode,\n setViewMode,\n currentView,\n setCurrentView,\n searchQuery,\n setSearchQuery,\n searchScope,\n setSearchScope,\n groupBy,\n setGroupBy,\n sortBy,\n setSortBy,\n\n // Selection\n selectionMode,\n selectedFileIds,\n setSelectedFileIds,\n\n // Pagination\n hasMore,\n isLoadingMore,\n loadMore,\n\n // Utilities\n createUrl,\n createSrcSet,\n callAPI,\n\n // Optimistic Actions\n createFolder,\n renameItem,\n deleteItem,\n moveItem,\n restoreItem,\n }}>\n {children}\n </DriveContext.Provider>\n );\n};\n\n// ** Hook\nexport const useDrive = (): TDriveContext => {\n const context = useContext(DriveContext);\n if (!context) throw new Error('useDrive must be used within a DriveProvider');\n return context;\n};\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nconst getChunkSize = (fileSize: number) => {\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\n return 16 * 1024 * 1024;\n};\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: any) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n\n // ** Refs for data storage\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null }>>(new Map());\n\n const updateUpload = useCallback((id: string, updates: Partial<TDriveUploadState>) => {\n setUploads(prev => prev.map(u => (u.id === id ? { ...u, ...updates } : u)));\n }, []);\n\n const addLog = useCallback((id: string, type: 'info' | 'warning' | 'error' | 'success', message: string) => {\n setUploads(prev => prev.map(u => {\n if (u.id !== id) return u;\n const logs = u.logs || [];\n return { ...u, logs: [...logs, { type, message, timestamp: Date.now() }] };\n }));\n }, []);\n\n const uploadChunk = async (uploadId: string, formData: FormData): Promise<[boolean, any, boolean]> => {\n try {\n const headers: Record<string, string> = {};\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n const url = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\n addLog(uploadId, 'info', `Sending chunk to ${url}`);\n\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const text = await response.text();\n addLog(uploadId, 'error', `HTTP ${response.status}: ${response.statusText}`);\n try {\n const json = JSON.parse(text);\n const msg = json.message || json.error?.message || `Status ${response.status}`;\n addLog(uploadId, 'error', `Server response: ${msg}`);\n\n // Retry on Gateway errors (502, 503, 504) or Request Timeout (408) or Too Many Requests (429)\n const canRetry = [408, 429, 502, 503, 504].includes(response.status);\n if (canRetry) {\n addLog(uploadId, 'warning', `Error is retryable (status ${response.status})`);\n }\n return [false, msg, canRetry];\n } catch {\n // If parsing fails, it's likely a severe server error (500 HTML) or network glitch response?\n // Assume retryable for 5xx range, non-retryable for 4xx?\n addLog(uploadId, 'error', `Failed to parse error response: ${text.slice(0, 100)}`);\n const isRetryable = response.status >= 500 || response.status === 429;\n return [false, `Server error ${response.status}: ${text.slice(0, 100)}`, isRetryable];\n }\n }\n\n const data = await response.json();\n if (data.status !== 200) {\n addLog(uploadId, 'error', `Upload API error: ${data.message || 'Unknown error'}`);\n return [false, data.message || 'Upload failed', false]; // Business logic errors are fatal\n }\n\n addLog(uploadId, 'success', `Chunk uploaded successfully`);\n return [true, data.data, false];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Network error';\n addLog(uploadId, 'error', `Network/Fetch error: ${errorMsg}`);\n return [false, errorMsg, true]; // Network errors are retryable\n }\n };\n\n const processItem = async (item: TDriveUploadState, file: File, folderId: string | null) => {\n const controller = new AbortController();\n abortControllers.current.set(item.id, controller);\n\n addLog(item.id, 'info', `Starting upload: ${file.name} (${file.size} bytes)`);\n updateUpload(item.id, { status: 'uploading' });\n\n const chunkSize = getChunkSize(file.size);\n const totalChunks = Math.ceil(file.size / chunkSize);\n addLog(item.id, 'info', `File split into ${totalChunks} chunks of ${chunkSize} bytes each`);\n\n let driveId = item.driveId;\n\n try {\n for (let i = item.currentChunk; i < totalChunks; i++) {\n if (controller.signal.aborted) throw new Error('Cancelled');\n\n updateUpload(item.id, { currentChunk: i });\n addLog(item.id, 'info', `Processing chunk ${i + 1}/${totalChunks}`);\n\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n const formData = new FormData();\n formData.append('chunk', chunk);\n formData.append('chunkIndex', String(i));\n formData.append('totalChunks', String(totalChunks));\n formData.append('fileName', file.name);\n formData.append('fileSize', String(file.size));\n formData.append('fileType', file.type);\n formData.append('folderId', folderId || 'root');\n if (driveId) formData.append('driveId', driveId);\n\n // Smart retry logic\n let attempts = 0;\n let success = false;\n while (!success && attempts < 3 && !controller.signal.aborted) {\n const [ok, result, canRetry] = await uploadChunk(item.id, formData);\n if (ok) {\n success = true;\n if (result.type === 'UPLOAD_STARTED' && result.driveId) {\n driveId = result.driveId;\n updateUpload(item.id, { driveId });\n addLog(item.id, 'success', `Upload session started with ID: ${driveId}`);\n } else if (result.type === 'UPLOAD_COMPLETE') {\n // Single chunk upload complete\n addLog(item.id, 'success', `Upload completed successfully`);\n if (onUploadComplete) onUploadComplete(result.item);\n }\n } else {\n if (!canRetry) {\n addLog(item.id, 'error', `Non-retryable error: ${result as string}`);\n throw new Error(result as string); // Immediate failure for non-retryable errors\n }\n\n attempts++;\n addLog(item.id, 'warning', `Retry attempt ${attempts}/3 after error`);\n if (attempts === 3) {\n addLog(item.id, 'error', `Max retry attempts reached: ${result as string}`);\n throw new Error(result as string);\n }\n await new Promise(r => setTimeout(r, 1000 * attempts));\n }\n }\n }\n addLog(item.id, 'success', `All ${totalChunks} chunks uploaded successfully`);\n updateUpload(item.id, { status: 'complete', currentChunk: totalChunks });\n // Since we don't get the item in the final chunk response here easily without parsing the loop result,\n // wait, the server returns UPLOAD_COMPLETE with item in the last chunk response.\n // But loop logic handles it?\n // \"if (result.type === 'UPLOAD_COMPLETE')\" is handled inside the loop for single files OR last chunk.\n // So onUploadComplete is called there.\n // Wait, chunked upload response handling loop (lines 96-103) ONLY handles UPLOAD_STARTED.\n // I need to update the loop to checks for UPLOAD_COMPLETE too.\n } catch (error: any) {\n if (error.message === 'Cancelled') {\n addLog(item.id, 'warning', 'Upload cancelled by user');\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n addLog(item.id, 'error', `Upload failed: ${error.message}`);\n updateUpload(item.id, { status: 'error', error: error.message });\n }\n } finally {\n abortControllers.current.delete(item.id);\n }\n };\n\n const uploadFiles = useCallback(async (files: File[], folderId: string | null) => {\n const newUploads: TDriveUploadState[] = [];\n files.forEach(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const chunkSize = getChunkSize(file.size);\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n newUploads.push({\n id,\n name: file.name,\n size: file.size,\n status: 'queued',\n currentChunk: 0,\n totalChunks: Math.ceil(file.size / chunkSize),\n logs: [],\n });\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const cancelUpload = useCallback(\n async (id: string) => {\n const controller = abortControllers.current.get(id);\n if (controller) {\n controller.abort();\n } else {\n updateUpload(id, { status: 'cancelled' });\n }\n\n const upload = uploads.find(u => u.id === id);\n if (upload?.driveId) {\n fetch(`${apiEndpoint.replace(/\\/$/, '')}?action=cancel&id=${upload.driveId}`, {\n method: 'POST',\n credentials: withCredentials ? 'include' : 'same-origin',\n }).catch(() => { });\n }\n },\n [apiEndpoint, updateUpload, uploads, withCredentials],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['queued', 'uploading', 'pending'].includes(u.status)) {\n cancelUpload(u.id);\n }\n });\n }, [uploads, cancelUpload]);\n\n // ** Robust Scheduler\n useEffect(() => {\n const activeCount = uploads.filter(u => u.status === 'uploading').length;\n\n if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued');\n\n if (queued) {\n const file = filesRef.current.get(queued.id);\n const meta = metaRef.current.get(queued.id);\n\n if (file) {\n processItem(queued, file, meta?.folderId || null);\n }\n }\n // eslint-disable-next-line\n }, [uploads]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads };\n};\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst buttonVariants = cva(\n \"nd:inline-flex nd:items-center nd:justify-center nd:gap-2 nd:whitespace-nowrap nd:rounded-md nd:text-sm nd:font-medium nd:transition-all nd:disabled:pointer-events-none nd:disabled:opacity-50 [&_svg]:nd:pointer-events-none [&_svg:not([class*='size-'])]:nd:size-4 nd:shrink-0 [&_svg]:nd:shrink-0 nd:outline-none nd:focus-visible:border-ring nd:focus-visible:ring-ring/50 nd:focus-visible:ring-[3px] aria-invalid:nd:ring-destructive/20 dark:aria-invalid:nd:ring-destructive/40 aria-invalid:nd:border-destructive\",\n {\n variants: {\n variant: {\n default: \"nd:bg-primary nd:text-primary-foreground nd:hover:bg-primary/90\",\n destructive:\n \"nd:bg-destructive nd:text-white nd:hover:bg-destructive/90 nd:focus-visible:ring-destructive/20 dark:nd:focus-visible:ring-destructive/40\",\n outline:\n \"nd:border nd:bg-background nd:shadow-xs nd:hover:bg-accent nd:hover:text-accent-foreground nd:dark:bg-input/30 nd:dark:border-input nd:dark:hover:bg-input/50\",\n secondary:\n \"nd:bg-secondary nd:text-secondary-foreground nd:hover:bg-secondary/80\",\n ghost:\n \"nd:hover:bg-accent nd:hover:text-accent-foreground nd:dark:hover:bg-accent/50\",\n link: \"nd:text-primary nd:underline-offset-4 nd:hover:underline\",\n },\n size: {\n default: \"nd:h-9 nd:px-4 nd:py-2 nd:has-[>svg]:px-3\",\n sm: \"nd:h-8 nd:rounded-md nd:gap-1.5 nd:px-3 nd:has-[>svg]:px-2.5\",\n lg: \"nd:h-10 nd:rounded-md nd:px-6 nd:has-[>svg]:px-4\",\n icon: \"nd:size-9\",\n \"icon-sm\": \"nd:size-8\",\n \"icon-lg\": \"nd:size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/client/utils\"\n\n// ** Dialog2 - Modern fullscreen dialog on mobile, centered on desktop\nfunction Dialog2({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog2\" {...props} />\n}\n\nfunction Dialog2Trigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog2-trigger\" {...props} />\n}\n\nfunction Dialog2Close({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog2-close\" {...props} />\n}\n\nfunction Dialog2Content({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPrimitive.Portal data-slot=\"dialog2-portal\">\n {/* Overlay with higher z-index for proper stacking */}\n <DialogPrimitive.Overlay\n data-slot=\"dialog2-overlay\"\n className={cn(\n \"nd:fixed nd:inset-0 nd:z-50 nd:bg-black/60 nd:backdrop-blur-sm\",\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out\",\n \"nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0\"\n )}\n />\n {/* Content: Fullscreen on mobile, centered modal on desktop */}\n <DialogPrimitive.Content\n data-slot=\"dialog2-content\"\n className={cn(\n \"nd:overflow-hidden\",\n\n // Base styles\n \"nd:fixed nd:z-50 nd:flex nd:flex-col nd:bg-background nd:shadow-2xl nd:outline-none\",\n // Mobile: Full screen\n \"nd:inset-0 nd:rounded-none\",\n // Desktop: Centered modal with max dimensions\n \"nd:md:inset-auto nd:md:top-[50%] nd:md:left-[50%] nd:md:translate-x-[-50%] nd:md:translate-y-[-50%]\",\n \"nd:md:max-w-5xl nd:md:w-[95vw] nd:md:max-h-[90vh] nd:md:rounded-xl nd:md:border\",\n // Animations\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out\",\n \"nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0\",\n \"nd:data-[state=closed]:slide-out-to-bottom-2 nd:data-[state=open]:slide-in-from-bottom-2\",\n \"nd:md:data-[state=closed]:zoom-out-95 nd:md:data-[state=open]:zoom-in-95\",\n \"nd:md:data-[state=closed]:slide-out-to-bottom-0 nd:md:data-[state=open]:slide-in-from-bottom-0\",\n \"nd:duration-200\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog2-close\"\n className={cn(\n \"nd:absolute nd:top-3 nd:right-3 nd:z-10\",\n \"nd:flex nd:items-center nd:justify-center nd:size-8 nd:rounded-full\",\n \"nd:bg-muted/80 nd:hover:bg-muted nd:text-muted-foreground nd:hover:text-foreground\",\n \"nd:transition-colors nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-ring nd:focus:ring-offset-2\",\n \"nd:md:top-4 nd:md:right-4 nd:md:size-7 nd:md:rounded-md nd:md:bg-transparent\"\n )}\n >\n <X className=\"nd:size-4\" />\n <span className=\"nd:sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\n}\n\nfunction Dialog2Header({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-header\"\n className={cn(\n \"nd:flex nd:items-center nd:justify-between nd:shrink-0 nd:px-4 nd:h-14 nd:border-b nd:bg-background/95 nd:backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Body({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-body\"\n className={cn(\"nd:flex-1 nd:min-h-0 nd:overflow-hidden\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Footer({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-footer\"\n className={cn(\n \"nd:flex nd:items-center nd:justify-end nd:gap-2 nd:shrink-0 nd:px-4 nd:py-3 nd:border-t nd:bg-background/95 nd:backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Title({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog2-title\"\n className={cn(\"nd:text-base nd:font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Description({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog2-description\"\n className={cn(\"nd:text-sm nd:text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog2,\n Dialog2Close,\n Dialog2Content,\n Dialog2Body,\n Dialog2Description,\n Dialog2Footer,\n Dialog2Header,\n Dialog2Title,\n Dialog2Trigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"nd:fixed nd:inset-0 nd:z-50 nd:bg-black/80 nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd: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 \"nd:fixed nd:z-50 nd:gap-4 nd:bg-background nd:p-6 nd:shadow-lg nd:transition nd:ease-in-out nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:duration-300 nd:data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"nd:inset-x-0 nd:top-0 nd:border-b nd:data-[state=closed]:slide-out-to-top nd:data-[state=open]:slide-in-from-top\",\n bottom:\n \"nd:inset-x-0 nd:bottom-0 nd:border-t nd:data-[state=closed]:slide-out-to-bottom nd:data-[state=open]:slide-in-from-bottom\",\n left: \"nd:inset-y-0 nd:left-0 nd:h-full nd:w-3/4 nd:border-r nd:data-[state=closed]:slide-out-to-left nd:data-[state=open]:slide-in-from-left nd:sm:max-w-sm\",\n right:\n \"nd:inset-y-0 nd:right-0 nd:h-full nd:w-3/4 nd:border-l nd:data-[state=closed]:slide-out-to-right nd:data-[state=open]:slide-in-from-right nd:sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, hideCloseButton, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"nd:absolute nd:right-4 nd:top-4 nd:rounded-sm nd:opacity-70 nd:ring-offset-background nd:transition-opacity nd:hover:opacity-100 nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-ring nd:focus:ring-offset-2 nd:disabled:pointer-events-none nd:data-[state=open]:bg-secondary\">\n <X className=\"nd:h-4 nd:w-4\" />\n <span className=\"nd:sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"nd:flex nd:flex-col nd:space-y-2 nd:text-center nd: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 \"nd:flex nd:flex-col-reverse nd:sm:flex-row nd:sm:justify-end nd: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(\"nd:text-lg nd:font-semibold nd: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(\"nd:text-sm nd:text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:fixed nd:inset-0 nd:z-50 nd: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 \"nd:bg-background nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:fixed nd:top-[50%] nd:left-[50%] nd:z-50 nd:grid nd:w-full nd:max-w-[calc(100%-2rem)] nd:translate-x-[-50%] nd:translate-y-[-50%] nd:gap-4 nd:rounded-lg nd:border nd:p-6 nd:shadow-lg nd:duration-200 nd:sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"nd:ring-offset-background nd:focus:ring-ring nd:data-[state=open]:bg-accent nd:data-[state=open]:text-muted-foreground nd:absolute nd:top-4 nd:right-4 nd:rounded-xs nd:opacity-70 nd:transition-opacity nd:hover:opacity-100 nd:focus:ring-2 nd:focus:ring-offset-2 nd:focus:outline-hidden nd:disabled:pointer-events-none [&_svg]:nd:pointer-events-none [&_svg]:nd:shrink-0 [&_svg:not([class*='size-'])]:nd:size-4\"\n >\n <X className=\"nd:size-4\" />\n <span className=\"nd: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(\"nd:flex nd:flex-col nd:gap-2 nd:text-center nd: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 \"nd:flex nd:flex-col-reverse nd:gap-2 nd:sm:flex-row nd: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(\"nd:text-lg nd:leading-none nd: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(\"nd:text-muted-foreground nd:text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:data-[state=open]:bg-accent\",\n inset && \"nd:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"nd:ml-auto nd:h-4 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-lg nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n inset && \"nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"nd:h-4 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"nd:h-2 nd:w-2 nd: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 \"nd:px-2 nd:py-1.5 nd:text-sm nd:font-semibold\",\n inset && \"nd: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(\"-nd:mx-1 nd:my-1 nd:h-px nd: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(\"nd:ml-auto nd:text-xs nd:tracking-widest nd:opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst alertVariants = cva(\n \"nd:relative nd:w-full nd:rounded-lg nd:border nd:px-4 nd:py-3 nd:text-sm nd:grid nd:has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] nd:grid-cols-[0_1fr] nd:has-[>svg]:gap-x-3 nd:gap-y-0.5 nd:items-start nd:[&>svg]:size-4 nd:[&>svg]:translate-y-0.5 nd:[&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"nd:bg-card nd:text-card-foreground\",\n destructive:\n \"nd:text-destructive nd:bg-card nd:[&>svg]:text-current nd:*: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 \"nd:col-start-2 nd:line-clamp-1 nd:min-h-4 nd:font-medium nd: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 \"nd:text-muted-foreground nd:col-start-2 nd:grid nd:justify-items-start nd:gap-1 nd:text-sm nd:[&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from \"react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:nd:text-foreground placeholder:nd:text-muted-foreground selection:nd:bg-primary selection:nd:text-primary-foreground nd:dark:bg-input/30 nd:border-input nd:h-9 nd:w-full nd:min-w-0 nd:rounded-md nd:border nd:bg-transparent nd:px-3 nd:py-1 nd:text-base nd:shadow-xs nd:transition-[color,box-shadow] nd:outline-none file:nd:inline-flex file:nd:h-7 file:nd:border-0 file:nd:bg-transparent file:nd:text-sm file:nd:font-medium nd:disabled:pointer-events-none nd:disabled:cursor-not-allowed nd:disabled:opacity-50 nd:md:text-sm\",\n \"nd:focus-visible:border-ring nd:focus-visible:ring-ring/50 nd:focus-visible:ring-[3px]\",\n \"aria-invalid:nd:ring-destructive/20 dark:aria-invalid:nd:ring-destructive/40 aria-invalid:nd: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 \"nd:flex nd:items-center nd:gap-2 nd:text-sm nd:leading-none nd:font-medium nd:select-none group-nd:data-[disabled=true]:pointer-events-none group-nd:data-[disabled=true]:opacity-50 peer-nd:disabled:cursor-not-allowed peer-nd:disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import { useEffect, useState } from 'react';\nimport { AlertCircle } from \"lucide-react\";\nimport { Alert, AlertDescription, AlertTitle } from \"./ui/alert\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\n// ** Define input type with required field\ntype TInputDefinition = {\n type: 'INPUT',\n id: string,\n name: string,\n default?: string,\n required?: boolean\n};\n\n// ** Helper type to extract input values based on input definitions\ntype TInputValues<T extends readonly TInputDefinition[]> = { [K in T[number]['id']]: string };\n\nexport const DialogConfirmation = <T extends readonly TInputDefinition[] | undefined = undefined>(\n props: Readonly<{\n title: string\n description: string\n open: boolean\n onClose: () => void\n inputs?: T\n onConfirm: T extends readonly TInputDefinition[]\n ? (inputs: Readonly<TInputValues<T>>) => Promise<[true] | [false, string]>\n : () => Promise<[true] | [false, string]>\n disableEscapeKeyDown?: boolean\n }>\n) => {\n // ** Deconstruct Props\n const { title, description, onConfirm, disableEscapeKeyDown, inputs, onClose, open } = props\n\n // ** State\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [inputsValue, setInputsValue] = useState<{ [key: string]: string }>(() =>\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n\n // ** Function\n const handleConfirm = async () => {\n setIsLoading(true);\n setError(null);\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await (inputs ? (onConfirm as any)(inputsValue) : (onConfirm as any)());\n if (response[0]) {\n onClose();\n } else {\n setError(response[1]);\n }\n } catch (err) {\n setError(String(err));\n } finally {\n setIsLoading(false);\n }\n }\n\n const handleClose = () => {\n if (isLoading) return\n onClose()\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n }\n\n const handleKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && isFormValid()) {\n event.preventDefault()\n handleConfirm()\n }\n }\n\n const isFormValid = (): boolean => {\n if (!inputs) return true\n return inputs.every(input =>\n !input.required || (inputsValue[input.id] && inputsValue[input.id].trim() !== '')\n )\n }\n\n // ** Effect to reset input values when inputs change or dialog opens\n useEffect(() => {\n if (open) {\n setInputsValue(\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n setError(null)\n }\n }, [inputs, open])\n\n // ** Render\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {inputs && inputs.length > 0 && (\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n {inputs.map((input, index) => (\n <div key={input.id} className=\"nd:grid nd:gap-2\">\n <Label htmlFor={input.id}>{input.name}</Label>\n <Input\n id={input.id}\n required={input.required}\n value={inputsValue[input.id] || ''}\n onChange={(e) =>\n setInputsValue({ ...inputsValue, [input.id]: e.target.value })\n }\n onKeyDown={index === inputs.length - 1 ? handleKeyPress : undefined}\n />\n </div>\n ))}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose} disabled={isLoading}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading || !isFormValid()}\n >\n Confirm\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype RenameAccountFormData = {\n name: string;\n};\n\ntype Account = {\n id: string;\n name: string;\n email: string;\n provider: 'GOOGLE';\n};\n\nexport const RenameAccountDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n account: Account | null;\n onConfirm: (account: Account, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, account, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameAccountFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or account changes\n useEffect(() => {\n if (open && account) {\n reset({ name: account.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById(\n 'rename-account-input'\n ) as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, account, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameAccountFormData) => {\n if (!account) return;\n\n try {\n await onConfirm(account, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename account:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename Account</DialogTitle>\n <DialogDescription>\n Enter a new display name for this storage account.\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"rename-account-input\">Account name</Label>\n <Input\n id=\"rename-account-input\"\n {...register('name', {\n required: 'Account name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Account name cannot be empty';\n if (trimmed.length > 255)\n return 'Account name is too long';\n return true;\n },\n })}\n placeholder=\"Enter account name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** Drive DnD Provider - Wraps PathBar and FileGrid for drag-drop between them\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useDrive } from '@/client/context';\nimport {\n DndContext,\n pointerWithin,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null\n});\n\nexport const useDriveDnd = () => useContext(DriveDndContext);\n\n// ** Provider Component\nexport const DriveDndProvider = (props: Readonly<{ children: React.ReactNode }>) => {\n // ** Deconstruct Props\n const { children } = props;\n\n const { items, setItems, sortBy, setSortBy, moveItem, callAPI, currentView } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n\n // ** DnD Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handlers\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n }, []);\n\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n\n const overId = over.id as string;\n\n // Check if hovering over a path item\n if (overId.startsWith('path-')) {\n setDragOverFolderId(overId);\n return;\n }\n\n // Check if hovering over a folder in the grid\n const overItem = items.find((i: { id: string }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n }, [items, draggingItemId]);\n\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) return;\n\n const overId = over.id as string;\n\n // Dropping on path bar item (e.g., \"path-root\" or \"path-abc123\")\n if (overId.startsWith('path-')) {\n const pathId = overId.slice(5); // Remove \"path-\" prefix\n const targetFolderId = pathId === 'root' || pathId === 'null' ? 'root' : pathId;\n await moveItem(active.id as string, targetFolderId);\n return;\n }\n\n // Dropping on a folder in the grid\n const overItem = items.find((i: { id: string; information: { type: string } }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER') {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Reordering items (optimistic)\n const oldIndex = items.findIndex((i: { id: string }) => i.id === active.id);\n const newIndex = items.findIndex((i: { id: string }) => i.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const reordered = arrayMove(items, oldIndex, newIndex);\n\n setItems(reordered);\n if (sortBy.field !== 'order') setSortBy({ field: 'order', order: 1 });\n\n // API call in background\n await callAPI('reorder', { method: 'POST', body: JSON.stringify({ ids: reordered.map((i: { id: string }) => i.id) }) });\n }, [items, setItems, sortBy, setSortBy, moveItem, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId }}>\n {enableDnd ? (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n ) : (\n children\n )}\n </DriveDndContext.Provider>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Progress({\n className,\n value,\n indicatorClassName,\n indeterminate = false,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & {\n indicatorClassName?: string;\n indeterminate?: boolean;\n}) {\n const isIndeterminate = indeterminate || value === undefined;\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"nd:bg-primary nd:h-full nd:flex-1 nd:transition-all\",\n isIndeterminate && \"nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]\",\n !isIndeterminate && \"nd:w-full\",\n indicatorClassName\n )}\n style={isIndeterminate ? undefined : { transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[state=open]:bg-accent nd:data-[state=open]:text-accent-foreground\",\n inset && \"nd:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"nd:ml-auto nd:h-4 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:animate-in nd:fade-in-80 nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n inset && \"nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"nd:h-4 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"nd:h-2 nd:w-2 nd: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 \"nd:px-2 nd:py-1.5 nd:text-sm nd:font-semibold nd:text-foreground\",\n inset && \"nd: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(\"-nd:mx-1 nd:my-1 nd:h-px nd: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 \"nd:ml-auto nd:text-xs nd:tracking-widest nd:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const CreateFolderDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n onConfirm: (name: string) => Promise<void>;\n}>) => {\n const { open, onClose, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<CreateFolderFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens\n useEffect(() => {\n if (open) {\n reset();\n // Focus input after a short delay to ensure dialog is rendered\n setTimeout(() => setFocus('name'), 100);\n }\n }, [open, reset, setFocus]);\n\n const handleFormSubmit = async (data: CreateFolderFormData) => {\n try {\n await onConfirm(data.name);\n reset();\n onClose();\n } catch (error) {\n // Error will be handled by parent component\n console.error('Failed to create folder:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Create New Folder</DialogTitle>\n <DialogDescription>\n Enter a name for the new folder\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"folder-name\">Folder name</Label>\n <Input\n id=\"folder-name\"\n {...register('name', {\n required: 'Folder name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Folder name cannot be empty';\n if (trimmed.length > 255)\n return 'Folder name is too long';\n return true;\n },\n })}\n placeholder=\"Enter folder name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\nimport type { TDatabaseDrive } from '@/types/server';\n\ntype RenameFormData = {\n name: string;\n};\n\nexport const RenameDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n item: TDatabaseDrive | null;\n onConfirm: (id: string, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, item, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or item changes\n useEffect(() => {\n if (open && item) {\n reset({ name: item.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById('rename-input') as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, item, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameFormData) => {\n if (!item) return;\n\n try {\n await onConfirm(item.id, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename item:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n const itemType = item?.information.type === 'FOLDER' ? 'Folder' : 'File';\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename {itemType}</DialogTitle>\n <DialogDescription>Enter a new name for this {itemType.toLowerCase()}</DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"rename-input\">Name</Label>\n <Input\n id=\"rename-input\"\n {...register('name', {\n required: 'Name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Name cannot be empty';\n if (trimmed.length > 255) return 'Name is too long';\n return true;\n },\n })}\n placeholder=\"Enter name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Renaming...' : 'Rename'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** DriveFileGrid Component - Pure file display (no chrome)\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useDriveDnd } from '@/client/components/drive/dnd-provider';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight, Pencil, Trash2 } from 'lucide-react';\nimport { Progress } from '@/client/components/ui/progress';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator\n} from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled });\n\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\n// ** File Item Component\nconst FileItem = (props: Readonly<{\n item: TDatabaseDrive;\n isSelected: boolean;\n isDragOver: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onDoubleClick: (e: React.MouseEvent) => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, onSelect, onDoubleClick, onRename, onDelete, onRestore } = props;\n\n const { apiEndpoint, viewMode, currentView } = useDrive();\n const isFolder = item.information.type === 'FOLDER';\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=small${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n className={cn(\n \"group nd:relative nd:cursor-pointer nd:transition-all nd:select-none\",\n \"nd:focus:outline-none nd:focus-visible:ring-2 nd:focus-visible:ring-primary\",\n viewMode === 'GRID'\n ? \"nd:flex nd:flex-col nd:rounded-lg nd:sm:rounded-xl nd:border nd:bg-card nd:dark:bg-card/50 nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:overflow-hidden\"\n : \"nd:flex nd:items-center nd:gap-2 nd:sm:gap-3 nd:p-1.5 nd:sm:p-2 nd:rounded-lg nd:border nd:border-transparent nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:hover:border-border\",\n isSelected && \"nd:ring-2 nd:ring-primary nd:border-primary/50 nd:bg-primary/5 nd:dark:bg-primary/10\",\n isDragOver && \"nd:ring-2 nd:ring-primary nd:border-primary nd:scale-[1.02] nd:bg-primary/10 nd:shadow-lg\"\n )}\n onClick={onSelect}\n onDoubleClick={onDoubleClick}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"nd:aspect-square nd:w-full nd:bg-muted/30 nd:dark:bg-muted/20 nd:flex nd:items-center nd:justify-center nd:overflow-hidden nd:relative\">\n {isThumbnailable ? (\n <img\n src={thumbnailUrl}\n alt={item.name}\n className=\"nd:size-full nd:object-cover nd:transition-transform group-nd:hover:scale-105 nd:duration-300\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"nd:transition-transform group-nd:hover:scale-110 nd:duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-8 nd:sm:size-10 nd:md:size-12 nd:text-muted-foreground/60\")}\n </div>\n )}\n {isSelected && (\n <div className=\"nd:absolute nd:top-1.5 nd:right-1.5 nd:sm:top-2 nd:sm:right-2 nd:size-5 nd:bg-primary nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md nd:animate-in nd:zoom-in-50\">\n <div className=\"nd:size-2 nd:bg-primary-foreground nd:rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"nd:absolute nd:bottom-1.5 nd:right-1.5 nd:sm:bottom-2 nd:sm:right-2 nd:lg:hidden nd:size-5 nd:sm:size-6 nd:bg-primary/90 nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md\">\n <ChevronRight className=\"nd:size-3 nd:sm:size-3.5 nd:text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"nd:p-1.5 nd:sm:p-2\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate nd:leading-tight\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"nd:size-10 nd:shrink-0 nd:rounded-lg nd:overflow-hidden nd:bg-muted/50 nd:dark:bg-muted/30 nd:flex nd:items-center nd:justify-center\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-cover\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-5 nd:text-muted-foreground\")\n )}\n </div>\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"nd:size-4 nd:text-muted-foreground nd:lg:hidden nd:shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={onRestore}>\n <RotateCcw className=\"nd:mr-2 nd:size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={onRename}>\n <Pencil className=\"nd:mr-2 nd:size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n};\n\n// ** Main FileGrid Component\nexport const DriveFileGrid = (props: Readonly<{\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, selectableFolders = false, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state from shared context\n const { dragOverFolderId } = useDriveDnd();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({ newFolder: false, rename: false, delete: false });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n\n\n // ** Process Items\n const processedItems = useMemo(() => {\n let filtered = items;\n if (mimeFilter) {\n filtered = filtered.filter(item =>\n matchesMimeFilter(\n item.information.type === 'FILE' ? item.information.mime : '',\n item.information.type === 'FOLDER',\n mimeFilter\n )\n );\n }\n\n return [...filtered].sort((a, b) => {\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n if (sortBy.field === 'order') return 0;\n\n let valA: any, valB: any;\n if (sortBy.field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (sortBy.field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else {\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n if (valA < valB) return -1 * sortBy.order;\n if (valA > valB) return 1 * sortBy.order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [], 'Yesterday': [], 'Earlier this Week': [], 'Last Week': [], 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n // Single tap/click on folder opens it, on file selects it\n // Double click also works for folders (desktop)\n const handleItemSelect = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n return;\n }\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n toggleSelection(item);\n onItemClick?.(item);\n };\n\n const toggleSelection = (item: TDatabaseDrive) => {\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n // ** Loading State (initial load - no items yet)\n if (isLoading && items.length === 0) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:flex-col\", className)}>\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:justify-center\">\n <Loader2 className=\"nd:size-8 nd:animate-spin nd:text-muted-foreground\" />\n </div>\n </div>\n );\n }\n\n // ** Error State\n if (error) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:items-center nd:justify-center nd:p-8\", className)}>\n <p className=\"nd:text-destructive nd:font-medium nd:text-center\">{error}</p>\n </div>\n );\n }\n\n // ** Empty State\n if (processedItems.length === 0) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:flex-col nd:items-center nd:justify-center nd:p-8 nd:text-center\", className)}>\n <div className=\"nd:size-16 nd:rounded-2xl nd:bg-muted/50 nd:dark:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:mb-4\">\n <Folder className=\"nd:size-8 nd:text-muted-foreground/60\" />\n </div>\n <p className=\"nd:text-sm nd:font-medium nd:text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'This folder is empty'}\n </p>\n </div>\n );\n }\n\n // ** Main Grid\n return (\n <>\n {/* Loading Progress Bar - shows when navigating/searching with existing items */}\n {isLoading && (\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n )}\n\n <div className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}>\n <div className=\"nd:space-y-4 nd:sm:space-y-6\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName}>\n {groupBy !== 'NONE' && (\n <h3 className=\"nd:text-xs nd:font-semibold nd:text-muted-foreground nd:uppercase nd:tracking-wide nd:mb-2 nd:sm:mb-3 nd:px-1\">\n {groupName} <span className=\"nd: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 ? \"nd:grid nd:grid-cols-3 nd:sm:grid-cols-4 nd:md:grid-cols-5 nd:lg:grid-cols-6 nd:xl:grid-cols-7 nd:gap-2 nd:sm:gap-3\"\n : \"nd:flex nd:flex-col nd:gap-1\"\n )}>\n {groupItems.map(item => (\n <SortableItem\n key={item.id}\n id={item.id}\n disabled={!enableDrag}\n isDragOverTarget={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n >\n <FileItem\n item={item}\n isSelected={selectedFileIds.includes(item.id)}\n isDragOver={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n onSelect={(e) => handleItemSelect(e, item)}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n onRename={() => { setItemToRename(item); setDialogs(prev => ({ ...prev, rename: true })); }}\n onDelete={() => { setItemToDelete(item); setDialogs(prev => ({ ...prev, delete: true })); }}\n onRestore={() => restoreItem(item.id)}\n />\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div ref={observerTarget} className=\"nd:flex nd:justify-center nd:py-6\">\n {isLoadingMore && <Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" />}\n </div>\n )}\n </div>\n\n {/* Dialogs */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => { setDialogs(prev => ({ ...prev, rename: false })); setItemToRename(null); }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => { setDialogs(prev => ({ ...prev, delete: false })); setItemToDelete(null); }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`}\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </>\n );\n};\n","// ** Drive Header\n'use client';\n\nimport React, { useState } from 'react';\nimport {\n Trash2, ArrowUpDown, LayoutGrid, List, Group, Calendar,\n ArrowDownAZ, ArrowUpAZ, ArrowDown01, ArrowUp01, Check, RotateCcw, Menu, FolderPlus,\n Search, X\n} from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger\n} from '@/client/components/ui/dropdown-menu';\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\n\nexport const DriveHeader = ({ className }: { className?: string }) => {\n const {\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n selectedFileIds, setItems, setSelectedFileIds,\n currentView, setCurrentView, searchQuery, setSearchQuery,\n searchScope, setSearchScope, deleteItem, restoreItem, callAPI, createFolder\n } = useDrive();\n\n const [dialogs, setDialogs] = useState({ delete: false, emptyTrash: false, newFolder: false });\n\n return (\n <div className={cn(\"nd:flex nd:flex-wrap nd:items-center nd:gap-2 nd:bg-muted/30 nd:dark:bg-muted/20 nd:p-2\", className)}>\n {/* New Folder Button - Only in BROWSE view */}\n {currentView === 'BROWSE' && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"nd:gap-1.5\"\n onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}\n >\n <FolderPlus className=\"nd:size-4\" />\n <span className=\"nd:hidden nd:sm:inline\">New Folder</span>\n </Button>\n )}\n\n {/* Actions Dropdown - Only show if there are actions available */}\n {(selectedFileIds.length > 0 || currentView === 'TRASH') && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"nd:gap-1.5\"\n >\n <Menu className=\"nd:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {/* Restore (Contextual) */}\n {selectedFileIds.length > 0 && currentView === 'TRASH' && (\n <DropdownMenuItem\n onClick={async () => {\n for (const id of selectedFileIds) {\n await restoreItem(id);\n }\n setSelectedFileIds([]);\n }}\n >\n <RotateCcw className=\"nd:size-3.5 nd: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=\"nd:text-destructive nd:focus:text-destructive\"\n >\n <Trash2 className=\"nd:size-3.5 nd: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=\"nd:text-destructive nd:focus:text-destructive\"\n >\n <Trash2 className=\"nd:size-3.5 nd: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=\"nd:gap-1.5\"\n >\n <Group className=\"nd:size-3.5\" />\n <span className=\"nd:hidden nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(groupBy !== \"NONE\" && \"nd:pl-5.5\")}>\n No Grouping\n </span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setGroupBy(\"CREATED_AT\")}>\n {groupBy === \"CREATED_AT\" && <Check className=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(groupBy !== \"CREATED_AT\" && \"nd:pl-5.5\")}>\n Created Date\n </span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Search */}\n <div className=\"nd:flex-1 nd:min-w-0 nd:sm:min-w-50 nd:relative\">\n <Input\n type=\"text\"\n placeholder=\"Search files...\"\n className=\"nd:w-full nd:pl-8 nd:pr-7 nd: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=\"nd:absolute nd:left-2.5 nd:top-1/2 nd:-translate-y-1/2 nd:text-muted-foreground nd:pointer-events-none\">\n <Search className=\"nd:size-3.5\" />\n </div>\n {searchQuery && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"nd:absolute nd:right-0.5 nd:top-1/2 nd:-translate-y-1/2 nd:h-7 nd:w-7 nd:text-muted-foreground\"\n onClick={() => {\n setSearchQuery('');\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }}\n >\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n\n {/* Sort Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:gap-1.5\">\n <ArrowUpDown className=\"nd:size-3.5\" />\n <span className=\"nd:hidden nd:sm:inline nd:max-w-24 nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(sortBy.field !== \"order\" && \"nd:pl-5.5\")}>Custom Order</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"id\", order: 1 })}>\n {sortBy.field === \"id\" && <Check className=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(sortBy.field !== \"id\" && \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <Calendar className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"createdAt\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <Calendar className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"createdAt\" && sortBy.order === 1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowDownAZ className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"name\" && sortBy.order === 1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowUpAZ className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"name\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowDown01 className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"size\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowUp01 className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"size\" && sortBy.order === 1 ? \"\" : \"nd:ml-5.5\")} />\n Size: Small\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"nd:w-px nd:h-5 nd:bg-border\" />\n\n {/* View Toggles */}\n <div className=\"nd:flex nd:bg-muted/50 nd:dark:bg-muted/30 nd:rounded-md nd:p-0.5 nd:gap-0.5\">\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"nd:h-8 nd:w-8\",\n viewMode === \"GRID\" && \"nd:bg-background nd:shadow-sm nd:hover:bg-background nd:dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"GRID\")}\n aria-label=\"Grid View\"\n aria-pressed={viewMode === \"GRID\"}\n >\n <LayoutGrid className=\"nd:size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"nd:h-8 nd:w-8\",\n viewMode === \"LIST\" && \"nd:bg-background nd:shadow-sm nd:hover:bg-background nd:dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"LIST\")}\n aria-label=\"List View\"\n aria-pressed={viewMode === \"LIST\"}\n >\n <List className=\"nd:size-4\" />\n </Button>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => setDialogs(prev => ({ ...prev, delete: false }))}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete ${selectedFileIds.length} item(s). You cannot undo this action.`\n : `Are you sure you want to move ${selectedFileIds.length} item(s) to trash?`\n }\n onConfirm={async () => {\n if (selectedFileIds.length === 0) return [false, 'No files selected'];\n for (const id of selectedFileIds) {\n await deleteItem(id);\n }\n return [true];\n }}\n />\n\n {/* Empty Trash Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.emptyTrash}\n onClose={() => setDialogs(prev => ({ ...prev, emptyTrash: false }))}\n title=\"Empty Trash?\"\n description=\"All items in the trash will be permanently deleted. This action cannot be undone.\"\n onConfirm={async () => {\n await callAPI('emptyTrash', { method: 'POST' });\n setItems([]);\n return [true];\n }}\n />\n\n {/* New Folder Dialog */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n </div>\n );\n};\n\n// ** Content Progress Bar - Shows loading state at top of content area\nimport { Progress } from '@/client/components/ui/progress';\n\nexport const DriveContentProgress = () => {\n const { isLoading } = useDrive();\n\n if (!isLoading) return null;\n\n return (\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n );\n};\n","// ** PathBar Component\n'use client';\n\nimport React from 'react';\nimport { useDrive } from '@/client/context';\nimport { useDroppable } from '@dnd-kit/core';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\n\n// ** Droppable Path Item\nconst DroppablePathItem = (props: Readonly<{\n id: string | null;\n name: string;\n isLast: boolean;\n onClick: () => void;\n}>) => {\n // ** Deconstruct Props\n const { id, name, isLast, onClick } = props;\n const { currentFolderId } = useDrive();\n const droppableId = `path-${id ?? 'root'}`;\n\n const { isOver, setNodeRef } = useDroppable({\n id: droppableId,\n data: { type: 'pathItem', folderId: id }\n });\n\n // Don't allow drop on current folder\n const isCurrentFolder = id === currentFolderId;\n\n if (isLast) {\n return (\n <span\n ref={setNodeRef}\n className={cn(\n \"nd:font-medium nd:text-foreground nd:px-1 nd:text-xs nd:sm:text-sm nd:truncate nd:max-w-30 nd:sm:max-w-none\",\n isOver && !isCurrentFolder && \"nd:bg-primary/20 nd: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 \"nd:h-6 nd:font-normal nd:text-xs nd:sm:text-sm nd:px-1.5 nd:sm:px-2 nd:truncate nd:max-w-25 nd:sm:max-w-37.5\",\n isOver && !isCurrentFolder && \"nd:ring-2 nd:ring-primary nd:bg-primary/10 nd:scale-105\"\n )}\n onClick={onClick}\n type=\"button\"\n title={name}\n >\n {name}\n </Button>\n );\n};\n\nexport const DrivePathBar = ({ className }: { className?: string }) => {\n const { path, navigateToFolder } = useDrive();\n\n return (\n <ol className={cn(\"nd:flex nd:items-center nd:gap-1 nd:sm:gap-1.5 nd:text-sm nd:text-muted-foreground nd:overflow-x-auto nd:flex-nowrap nd:min-w-0\", className)} aria-label=\"Breadcrumb\" role=\"navigation\">\n {path.map((item, index) => {\n const isLast = index === path.length - 1;\n return (\n <li key={item.id ?? 'root'} className=\"nd:flex nd:items-center nd:gap-1 nd:sm:gap-1.5 nd:shrink-0\">\n {index > 0 && <span className=\"nd:text-muted-foreground/50 nd:text-xs\" aria-hidden=\"true\">/</span>}\n <DroppablePathItem\n id={item.id}\n name={item.name}\n isLast={isLast}\n onClick={() => navigateToFolder(item)}\n />\n </li>\n );\n })}\n </ol>\n );\n};\n","// ** Upload Component\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/useUpload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock, RefreshCw, FileText } from 'lucide-react';\nimport { cn, matchesMimeFilter } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/client/components/ui/dialog';\nimport type { TDriveUploadState } from '@/types/client';\n\nconst UploadStatusIcon = (props: Readonly<{ status: TDriveUploadState['status'] }>) => {\n const { status } = props;\n\n switch (status) {\n case 'complete':\n return <CheckCircle2 className=\"nd:size-4 nd:text-emerald-500\" />;\n case 'error':\n return <AlertCircle className=\"nd:size-4 nd:text-destructive\" />;\n case 'cancelled':\n return <X className=\"nd:size-4 nd:text-muted-foreground\" />;\n case 'uploading':\n return <Loader2 className=\"nd:size-4 nd:text-primary nd:animate-spin\" />;\n default:\n return <Clock className=\"nd:size-4 nd:text-muted-foreground\" />;\n }\n};\n\nconst LogViewerDialog = (props: Readonly<{ upload: TDriveUploadState; open: boolean; onOpenChange: (open: boolean) => void }>) => {\n const { upload, open, onOpenChange } = props;\n const logs = upload.logs || [];\n\n const handleCopy = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n navigator.clipboard.writeText(logText);\n };\n\n const handleDownload = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n const blob = new Blob([logText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${upload.name}-logs.txt`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"nd:sm:max-w-lg nd:p-0 nd:gap-0 nd:max-h-[85vh] nd:flex nd:flex-col\">\n <DialogHeader className=\"nd:px-4 nd:py-3 nd:border-b\">\n <DialogTitle className=\"nd:text-base nd:truncate\">{upload.name}</DialogTitle>\n </DialogHeader>\n <div className=\"nd:sticky nd:top-0 nd:z-10 nd:bg-background nd:px-4 nd:py-2 nd:border-b nd:flex nd:items-center nd:gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCopy}\n disabled={logs.length === 0}\n >\n Copy\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDownload}\n disabled={logs.length === 0}\n >\n Download\n </Button>\n </div>\n <div className=\"nd:flex-1 nd:overflow-y-auto nd:p-4 nd:space-y-2\">\n {logs.length === 0 && (\n <p className=\"nd:text-sm nd:text-muted-foreground nd:text-center nd:py-8\">No logs available</p>\n )}\n {logs.map((log, index) => (\n <div\n key={index}\n className={cn(\n \"nd:flex nd:items-start nd:gap-2 nd:p-2 nd:rounded-md nd:border nd:text-sm\",\n log.type === 'error' && \"nd:bg-destructive/5 nd:border-destructive/20\",\n log.type === 'warning' && \"nd:bg-yellow-500/5 nd:border-yellow-500/20\",\n log.type === 'success' && \"nd:bg-emerald-500/5 nd:border-emerald-500/20\",\n log.type === 'info' && \"nd:bg-muted/50 nd:border-border\"\n )}\n >\n <div className={cn(\n \"nd:shrink-0 nd:size-1.5 nd:rounded-full nd:mt-1.5\",\n log.type === 'error' && \"nd:bg-destructive\",\n log.type === 'warning' && \"nd:bg-yellow-500\",\n log.type === 'success' && \"nd:bg-emerald-500\",\n log.type === 'info' && \"nd:bg-muted-foreground\"\n )} />\n <div className=\"nd:flex-1 nd:min-w-0 nd:space-y-1\">\n <p className=\"nd:break-words nd:whitespace-pre-wrap\">{log.message}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </p>\n </div>\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const DriveUpload = (props: Readonly<{\n compact?: boolean;\n onComplete?: (item: unknown) => void;\n accept?: string;\n}>) => {\n // ** Deconstruct Props\n const { compact = false, onComplete, accept } = props;\n\n const [isDragging, setIsDragging] = useState(false);\n const [showUploadsDialog, setShowUploadsDialog] = useState(false);\n const [logViewerUpload, setLogViewerUpload] = useState<TDriveUploadState | null>(null);\n const [manuallyOpened, setManuallyOpened] = useState(false);\n const hasAutoClosedRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { currentFolderId, setItems, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {\n // Optimistically add the uploaded item to the items list\n if (uploadedItem) {\n setItems(prev => [uploadedItem as TDatabaseDrive, ...prev]);\n }\n onComplete?.(uploadedItem);\n });\n\n // Auto-hide dialog when all uploads are finished (only once, and not if manually opened)\n React.useEffect(() => {\n if (!showUploadsDialog || uploads.length === 0 || manuallyOpened || hasAutoClosedRef.current) return;\n\n const allFinished = uploads.every(u =>\n ['complete', 'error', 'cancelled'].includes(u.status)\n );\n\n if (allFinished) {\n const timer = setTimeout(() => {\n setShowUploadsDialog(false);\n hasAutoClosedRef.current = true;\n }, 2000);\n return () => clearTimeout(timer);\n }\n }, [uploads, showUploadsDialog, manuallyOpened]);\n\n // Filter files based on accept prop\n const filterFiles = useCallback((files: File[]): File[] => {\n if (!accept) return files;\n return files.filter(file => matchesMimeFilter(file.type, false, accept));\n }, [accept]);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files || files.length === 0) return;\n const filteredFiles = filterFiles(Array.from(files));\n if (filteredFiles.length === 0) return;\n uploadFiles(filteredFiles, currentFolderId);\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, filterFiles]);\n\n const handleDrag = useCallback((e: React.DragEvent, dragging: boolean) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(dragging);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(false); handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const hasUploadsInProgress = uploads.some(u => ['uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['uploading', 'queued', 'pending'].includes(u.status));\n\n const renderDialog = () => (\n <Dialog open={showUploadsDialog} onOpenChange={setShowUploadsDialog}>\n <DialogContent className=\"nd:sm:max-w-md nd:p-0 nd:gap-0\" showCloseButton={false}>\n <DialogHeader className=\"nd:px-4 nd:py-3 nd:border-b nd:flex-row nd:items-center nd:justify-between nd:space-y-0\">\n <DialogTitle className=\"nd:text-base\">Upload Status</DialogTitle>\n {hasUploadsInProgress && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"nd:text-destructive nd:hover:text-destructive\"\n onClick={cancelAllUploads}\n >\n Cancel All\n </Button>\n )}\n </DialogHeader>\n\n <div className=\"nd:divide-y nd:max-h-80 nd:overflow-y-auto\">\n {uploads.length === 0 && (\n <div className=\"nd:p-4 nd:text-center nd:text-sm nd: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=\"nd:px-4 nd:py-2.5\">\n <div className=\"nd:flex nd:items-start nd:gap-2 nd:mb-1.5\">\n <UploadStatusIcon status={upload.status} />\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\">{upload.name}</p>\n <p className={cn(\n \"nd:text-xs nd:break-words\",\n upload.status === 'error' ? \"nd:text-destructive\" : \"nd:text-muted-foreground\"\n )}>\n {upload.status === 'uploading' && 'Uploading...'}\n {upload.status === 'queued' && 'Waiting in queue'}\n {upload.status === 'pending' && 'Preparing...'}\n {upload.status === 'complete' && 'Upload complete'}\n {upload.status === 'error' && (upload.error || 'Upload failed')}\n {upload.status === 'cancelled' && 'Upload cancelled'}\n </p>\n </div>\n <div className=\"nd:flex nd:items-center nd:gap-1 nd:shrink-0\">\n {(upload.logs && upload.logs.length > 0) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"nd:text-muted-foreground nd:hover:text-foreground\"\n onClick={() => setLogViewerUpload(upload)}\n title=\"View logs\"\n >\n <FileText className=\"nd:size-3.5\" />\n </Button>\n )}\n {['uploading', 'queued', 'pending'].includes(upload.status) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"nd:text-muted-foreground nd:hover:text-destructive\"\n onClick={() => cancelUpload(upload.id)}\n title=\"Cancel\"\n >\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n {upload.status === 'uploading' && (\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:pl-6\">\n <Progress value={percent} className=\"nd:flex-1\" />\n <span className=\"nd:text-xs nd:tabular-nums nd:text-muted-foreground nd:w-8\">\n {percent}%\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </DialogContent>\n </Dialog>\n );\n\n if (compact) {\n return (\n <>\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n <div className=\"nd:flex nd:items-center nd:gap-2\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"nd:hidden\"\n aria-hidden=\"true\"\n />\n {activeAccountId && (\n <Button\n onClick={() => fetchItems()}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLoading}\n title=\"Refresh\"\n >\n <RefreshCw className={cn(\"nd:size-4 nd:shrink-0\", isLoading && \"nd:animate-spin\")} />\n </Button>\n )}\n <Button\n onClick={() => inputRef.current?.click()}\n type=\"button\"\n size=\"sm\"\n disabled={hasUploadsInProgress}\n >\n <UploadIcon className=\"nd:size-4 nd:shrink-0\" />\n <span>Upload</span>\n </Button>\n\n {uploads.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}\n >\n {activeUploads.length > 0 ? (\n <Loader2 className=\"nd:size-4 nd:shrink-0 nd:animate-spin\" />\n ) : (\n <CheckCircle2 className=\"nd:size-4 nd:shrink-0\" />\n )}\n <span>\n {activeUploads.length > 0\n ? `(${activeUploads.length})`\n : 'Status'\n }\n </span>\n </Button>\n )}\n </div>\n {renderDialog()}\n </>\n );\n }\n\n return (\n <div className=\"nd:w-full\">\n <div\n className={cn(\n \"nd:flex nd:flex-col nd:items-center nd:justify-center nd:p-8 nd:border-2 nd:border-dashed nd:rounded-lg nd:cursor-pointer nd:transition-colors\",\n isDragging ? \"nd:border-primary nd:bg-primary/5\" : \"nd:border-muted-foreground/25 nd:hover:border-primary/50 nd:hover:bg-muted/50\"\n )}\n onDragEnter={(e) => handleDrag(e, true)} onDragLeave={(e) => handleDrag(e, false)} onDragOver={(e) => handleDrag(e, true)} onDrop={handleDrop}\n onClick={() => inputRef.current?.click()} role=\"button\" tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"nd:hidden\"\n aria-hidden=\"true\"\n />\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-2 nd:text-center\">\n <div className=\"nd:p-3 nd:rounded-full nd:bg-background nd:border nd:shadow-sm\">\n <UploadIcon className=\"nd:size-6 nd:text-muted-foreground\" />\n </div>\n <div className=\"nd:text-sm nd:font-medium nd: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=\"nd:mt-4 nd:text-center\">\n <Button variant=\"link\" onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}>View Upload Progress</Button>\n </div>\n )}\n {renderDialog()}\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n </div>\n );\n};\n","// ** DriveStorageIndicator Component\n'use client';\n\nimport React, { useEffect } from 'react';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, cn } from '@/client/utils';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Cloud, AlertCircle } from 'lucide-react';\n\nexport const DriveStorageIndicator = (props: Readonly<{ compact?: boolean; className?: string }>) => {\n // ** Deconstruct Props\n const { compact = false, className } = props;\n\n const { quota, refreshQuota } = useDrive();\n\n useEffect(() => { refreshQuota(); }, []);\n\n if (!quota) return null;\n const { usedInBytes, totalInBytes, percentage } = quota;\n\n const isNearFull = percentage >= 90;\n const isFull = percentage >= 100;\n\n const stateColor = isFull ? \"nd:text-destructive\" : isNearFull ? \"nd:text-yellow-600 nd:dark:text-yellow-500\" : \"nd:text-primary\";\n const solidColor = isFull ? \"nd:bg-destructive\" : isNearFull ? \"nd:bg-yellow-500\" : \"nd:bg-primary\";\n\n if (compact) {\n return (\n <div className={cn(\"nd:flex nd:items-center nd:gap-3 nd:text-xs nd:font-medium nd:text-muted-foreground\", className)}>\n <span className=\"nd:shrink-0 nd:flex nd:items-center nd:gap-1.5\">\n <Cloud className=\"nd:size-3.5\" />\n Storage\n </span>\n <Progress value={percentage} indicatorClassName={cn(\"nd:bg-gradient-to-r nd:from-blue-500 nd:to-cyan-500\", isNearFull && \"nd:from-yellow-500 nd:to-orange-500\", isFull && \"nd:bg-destructive\")} className=\"nd:w-24 nd:sm:w-32\" />\n <span className=\"nd:shrink-0 nd:whitespace-nowrap\">{formatBytes(usedInBytes)} / {formatBytes(totalInBytes)}</span>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"nd:flex nd:items-center nd:justify-between nd:gap-2 nd:mb-2\">\n <div className=\"nd:flex nd:items-center nd:gap-2\">\n <Cloud className={cn(\"nd:size-4\", stateColor)} />\n <span className=\"nd:text-xs nd:font-medium nd:text-muted-foreground\">Storage</span>\n </div>\n <span className=\"nd:text-xs nd:font-semibold nd:tabular-nums\">\n {percentage}%\n </span>\n </div>\n\n <Progress\n value={percentage}\n className=\"nd:h-1.5\"\n indicatorClassName={cn(\n \"nd:transition-all nd:duration-500\",\n isFull ? \"nd:bg-destructive\" : isNearFull ? \"nd:bg-yellow-500\" : \"nd:bg-gradient-to-r nd:from-blue-500 nd:to-purple-500\"\n )}\n />\n\n <div className=\"nd:flex nd:justify-between nd:items-center nd:mt-1.5\">\n <span className=\"nd:text-[10px] nd:text-muted-foreground nd:tabular-nums\">\n {formatBytes(usedInBytes)}\n </span>\n <span className=\"nd:text-[10px] nd:text-muted-foreground nd:tabular-nums\">\n {formatBytes(totalInBytes)}\n </span>\n </div>\n\n {isNearFull && (\n <div className={cn(\n \"nd:flex nd:items-center nd:gap-1.5 nd:text-[10px] nd:font-medium nd:px-2 nd:py-1 nd:rounded-md nd:mt-2\",\n isFull ? \"nd:bg-destructive/10 nd:text-destructive\" : \"nd:bg-yellow-500/10 nd:text-yellow-600 nd:dark:text-yellow-500\"\n )}>\n <AlertCircle className=\"nd:size-3 nd:shrink-0\" />\n <span>{isFull ? \"Storage full\" : \"Almost full\"}</span>\n </div>\n )}\n </>\n );\n};\n","// ** Drive File Chooser Component - Completely Redesigned\n'use client';\n\nimport React, { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { cn, getFileIcon } from '@/client/utils';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/dialog-fullscreen';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd-provider';\nimport { DriveHeader } from '@/client/components/drive/header';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Icons\nimport {\n Upload as UploadIcon, X, Menu, FolderOpen, Trash2,\n Database, HardDrive, ChevronsUpDown, Check, Plus, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\n\n// ============================================================================\n// INLINE SIDEBAR - Simplified for the chooser context\n// ============================================================================\nconst ChooserSidebar = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', { method: 'PATCH', query: { id: account.id }, body: JSON.stringify({ name: newName.trim() }) });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', ml);\n window.removeEventListener('storage', sl);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const ml = (e: MessageEvent) => { if (e.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n const sl = (e: StorageEvent) => { if (e.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n window.addEventListener('message', ml);\n window.addEventListener('storage', sl);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"nd:flex nd:flex-col nd:h-full nd:w-full nd:bg-muted/5 nd:dark:bg-muted/10\">\n {/* Account Switcher */}\n <div className=\"nd:p-2 nd:border-b nd:border-border/50\">\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:gap-2 nd:px-2 nd:h-11 nd:min-w-0\">\n <div className=\"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0 nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\">\n <HardDrive className=\"nd:size-3.5\" />\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">Local Storage</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"nd:flex-1 nd:min-w-0 nd:justify-between nd:px-2 nd:h-11 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:text-left nd:min-w-0 nd:flex-1\">\n <div className={cn(\n \"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n activeAccountId ? \"nd:bg-blue-500/10 nd:text-blue-600 nd:dark:bg-blue-500/20 nd:dark:text-blue-400\" : \"nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"nd:size-3.5\" /> : <HardDrive className=\"nd:size-3.5\" />}\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">{currentAccountName}</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"nd:size-3.5 nd:text-muted-foreground/60 nd:shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"nd:w-56\" align=\"start\">\n <DropdownMenuLabel className=\"nd:text-[11px] nd:font-medium nd:text-muted-foreground nd:uppercase nd:tracking-wide\">Storage</DropdownMenuLabel>\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"nd:gap-2 nd:py-2\">\n <span className=\"nd:flex-1 nd:text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n {accounts.length > 0 && <DropdownMenuSeparator />}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"nd:gap-2 nd:py-2\"\n >\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{account.name}</p>\n <p className=\"nd:text-[10px] nd:text-muted-foreground nd:truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n ))}\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"nd:gap-2\"><Plus className=\"nd:size-3.5\" /><span className=\"nd:text-sm\">Add Account</span></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>Google Drive</DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9 nd:shrink-0 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <Settings2 className=\"nd:size-4 nd:text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"nd:w-40\">\n <DropdownMenuLabel className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => { setRenameDialog({ open: true, account: currentAccount }); }}>\n <Pencil className=\"nd:size-3.5 nd:mr-2\" /> Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"nd:size-3.5 nd:mr-2\" /> Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => setDeleteDialog({ open: true, account: currentAccount })}>\n <Trash className=\"nd:size-3.5 nd:mr-2\" /> Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"nd:flex-1 nd:p-2 nd:space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\", currentView !== 'TRASH' ? \"nd:bg-primary/10 nd:text-primary nd:hover:bg-primary/15\" : \"nd:hover:bg-muted/50\")}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"nd:size-4\" /> My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\", currentView === 'TRASH' ? \"nd:bg-destructive/10 nd:text-destructive nd:hover:bg-destructive/15\" : \"nd:hover:bg-muted/50\")}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"nd:size-4\" /> Trash\n </Button>\n </nav>\n\n {/* Storage */}\n <div className=\"nd:p-2.5 nd:border-t nd:border-border/50 nd:bg-background/50 nd:dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Dialogs */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"nd:sm:max-w-xs\" showCloseButton={false}>\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-4 nd:py-4\">\n <Loader2 className=\"nd:size-8 nd:text-primary nd:animate-spin\" />\n <div className=\"nd:text-center\">\n <DialogTitle className=\"nd:text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"nd:text-sm nd:mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ============================================================================\n// MOBILE SIDEBAR SHEET\n// ============================================================================\nconst MobileSidebarSheet = () => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9 nd:md:hidden nd:shrink-0\">\n <Menu className=\"nd:size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"nd:w-72 nd:p-0\" hideCloseButton>\n <SheetTitle className=\"nd:sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"nd:sr-only\">Storage and navigation</SheetDescription>\n <ChooserSidebar onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n );\n};\n\n// ============================================================================\n// MAIN FILE CHOOSER COMPONENT\n// ============================================================================\nexport const DriveFileChooser = (props: Readonly<{\n value: TDriveFile | TDriveFile[] | null;\n onChange: (files: TDriveFile | TDriveFile[] | null) => void;\n multiple?: boolean;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n}>) => {\n // ** Deconstruct Props\n const {\n value, onChange, multiple = false, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText\n } = props;\n\n const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();\n const [isOpen, setIsOpen] = useState(false);\n\n // Sync selection on open and trigger fetch\n useEffect(() => {\n if (isOpen) {\n // Trigger API fetch when dialog opens (for lazy mode)\n triggerFetch();\n\n if (!value) setSelectedFileIds([]);\n else if (Array.isArray(value)) setSelectedFileIds(value.map(f => f.id));\n else setSelectedFileIds([value.id]);\n }\n }, [isOpen, value, setSelectedFileIds, triggerFetch]);\n\n const handleConfirm = useCallback(() => {\n const selectedItems = items.filter(item => selectedFileIds.includes(item.id));\n const files: TDriveFile[] = selectedItems.map(item => ({\n id: item.id,\n file: {\n name: item.name,\n mime: item.information.type === 'FILE' ? item.information.mime : '',\n size: item.information.type === 'FILE' ? item.information.sizeInBytes : 0\n }\n }));\n onChange(multiple ? files : files[0] || null);\n setIsOpen(false);\n }, [items, selectedFileIds, multiple, onChange]);\n\n const handleRemove = useCallback((idToRemove: string) => {\n if (multiple && Array.isArray(value)) onChange(value.filter(f => f.id !== idToRemove));\n else onChange(null);\n }, [multiple, value, onChange]);\n\n const hasSelection = value && (Array.isArray(value) ? value.length > 0 : true);\n const displayFiles = useMemo(() => !value ? [] : Array.isArray(value) ? value : [value], [value]);\n\n return (\n <div className={cn(\"nd:w-full\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n className={cn(\n \"nd:w-full nd:h-auto nd:justify-start nd:gap-3 nd:px-3 nd:py-2.5 nd:border-dashed\",\n error && \"nd:border-destructive\"\n )}\n >\n <div className={cn(\n \"nd:size-9 nd:rounded-lg nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n error ? \"nd:bg-destructive/10 nd:text-destructive\" : \"nd:bg-muted/50 nd:text-muted-foreground\"\n )}>\n <UploadIcon className=\"nd:size-4\" />\n </div>\n <div className=\"nd:flex-1 nd:min-w-0 nd:text-left\">\n <p className={cn(\"nd:text-sm nd:font-medium\", error && \"nd:text-destructive\")}>\n {multiple ? \"Select files\" : \"Select a file\"}\n </p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:font-normal nd:truncate\">{placeholder}</p>\n </div>\n </Button>\n ) : (\n /* Selected Files Display */\n <div className={cn(\"nd:rounded-lg nd:border\", error ? \"nd:border-destructive\" : \"nd:border-border\", disabled && \"nd:opacity-50\")}>\n {!multiple && displayFiles[0] && (\n <div className=\"nd:flex nd:items-center nd:gap-3 nd:p-2.5\">\n <div className=\"nd:size-12 nd:rounded-lg nd:overflow-hidden nd:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:shrink-0\">\n {displayFiles[0].file.mime.startsWith('image/') ? (\n <img src={createUrl(displayFiles[0], { quality: 'low', format: 'webp' })} alt={displayFiles[0].file.name} className=\"nd:size-full nd:object-cover\" />\n ) : (\n getFileIcon(displayFiles[0].file.mime, false, \"nd:size-6 nd:text-muted-foreground\")\n )}\n </div>\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\">{displayFiles[0].file.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">{displayFiles[0].file.mime || 'File'}</p>\n </div>\n <div className=\"nd:flex nd:items-center nd:gap-1 nd:shrink-0\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsOpen(true)} disabled={disabled}>Change</Button>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-8\" onClick={() => handleRemove(displayFiles[0].id)}>\n <X className=\"nd:size-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {multiple && (\n <>\n <div className=\"nd:flex nd:items-center nd:justify-between nd:px-3 nd:py-2 nd:border-b nd:bg-muted/20\">\n <span className=\"nd:text-xs nd:text-muted-foreground nd:font-medium\">{displayFiles.length} file{displayFiles.length !== 1 ? 's' : ''} selected</span>\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:h-7 nd:text-xs\" onClick={() => setIsOpen(true)} disabled={disabled}>Add more</Button>\n {!disabled && <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:h-7 nd:text-xs nd:text-muted-foreground\" onClick={() => onChange([])}>Clear</Button>}\n </div>\n </div>\n <div className=\"nd:max-h-40 nd:overflow-y-auto nd:divide-y nd:divide-border/50\">\n {displayFiles.map((file) => (\n <div key={file.id} className=\"nd:flex nd:items-center nd:gap-2.5 nd:px-3 nd:py-2 nd:hover:bg-muted/20\">\n <div className=\"nd:size-8 nd:rounded nd:overflow-hidden nd:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:shrink-0\">\n {file.file.mime.startsWith('image/') ? (\n <img src={createUrl(file, { quality: 'ultralow', format: 'webp' })} alt={file.file.name} className=\"nd:size-full nd:object-cover\" />\n ) : (\n getFileIcon(file.file.mime, false, \"nd:size-4 nd:text-muted-foreground\")\n )}\n </div>\n <span className=\"nd:flex-1 nd:text-sm nd:truncate\">{file.file.name}</span>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-7 nd:shrink-0\" onClick={() => handleRemove(file.id)}>\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {error && helperText && <p className=\"nd:text-xs nd:text-destructive nd:mt-1.5\">{helperText}</p>}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content showCloseButton={false} className=\"nd-drive-root\">\n {/* Header */}\n <Dialog2Header className=\"nd:gap-2\">\n <MobileSidebarSheet />\n <Dialog2Title className=\"nd:flex-1\">Select {multiple ? 'Files' : 'File'}</Dialog2Title>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-8\" onClick={() => setIsOpen(false)}>\n <X className=\"nd:size-4\" />\n </Button>\n </Dialog2Header>\n\n {/* Body */}\n <Dialog2Body className=\"nd:flex nd:flex-col nd:md:flex-row\">\n {/* Sidebar - Desktop */}\n <div className=\"nd:hidden nd:md:flex nd:w-52 nd:lg:w-56 nd:border-r nd:shrink-0\">\n <ChooserSidebar />\n </div>\n\n {/* Main Content */}\n <DriveDndProvider>\n <div className=\"nd:flex-1 nd:flex nd:flex-col nd:min-w-0 nd:min-h-0\">\n <DriveHeader className=\"nd:border-b\" />\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:px-3 nd:py-2 nd:border-b nd:bg-muted/20 nd:dark:bg-muted/10\">\n <DrivePathBar className=\"nd:flex-1\" />\n <DriveUpload compact accept={accept} />\n </div>\n <DriveFileGrid mimeFilter={accept} className=\"nd:flex-1\" />\n </div>\n </DriveDndProvider>\n </Dialog2Body>\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectedFileIds.length === 0}>\n Select{selectedFileIds.length > 0 ? ` (${selectedFileIds.length})` : ''}\n </Button>\n </Dialog2Footer>\n </Dialog2Content>\n </Dialog2>\n </div>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Database, HardDrive, Plus, Check,\n ChevronsUpDown, FolderOpen, Trash2, Menu, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Sidebar Content Component (reusable for both desktop and mobile)\nconst SidebarContent = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n // Dialog states for account management\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', {\n method: 'PATCH',\n query: { id: account.id },\n body: JSON.stringify({ name: newName.trim() })\n });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n window.removeEventListener('storage', storageListener);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const messageListener = (event: MessageEvent) => {\n if (event.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n const storageListener = (event: StorageEvent) => {\n if (event.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n window.addEventListener('message', messageListener);\n window.addEventListener('storage', storageListener);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch (err) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"nd:w-full nd:h-full nd:flex nd:flex-col nd:bg-muted/5 nd:dark:bg-muted/10\">\n {/* Account Switcher - Compact */}\n <div className=\"nd:p-2 nd:border-b nd:border-border/50\">\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:gap-2.5 nd:px-2 nd:h-11 nd:min-w-0\">\n <div className=\"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0 nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\">\n <HardDrive className=\"nd:size-3.5\" />\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">Local Storage</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"nd:flex-1 nd:min-w-0 nd:justify-between nd:px-2 nd:h-11 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <div className=\"nd:flex nd:items-center nd:gap-2.5 nd:text-left nd:min-w-0 nd:flex-1\">\n <div className={cn(\n \"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n activeAccountId\n ? \"nd:bg-blue-500/10 nd:text-blue-600 nd:dark:bg-blue-500/20 nd:dark:text-blue-400\"\n : \"nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"nd:size-3.5\" /> : <HardDrive className=\"nd:size-3.5\" />}\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">{currentAccountName}</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"nd:size-3.5 nd:text-muted-foreground/60 nd:shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"nd:w-56\" align=\"start\">\n <DropdownMenuLabel className=\"nd:text-[11px] nd:font-medium nd:text-muted-foreground nd:uppercase nd:tracking-wide\">\n Storage\n </DropdownMenuLabel>\n\n {/* Local Storage */}\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"nd:gap-2 nd:py-2\">\n <span className=\"nd:flex-1 nd:text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n\n {accounts.length > 0 && <DropdownMenuSeparator />}\n\n {/* Connected Accounts */}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"nd:gap-2 nd:py-2\"\n >\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{account.name}</p>\n <p className=\"nd:text-[10px] nd:text-muted-foreground nd:truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n ))}\n\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"nd:gap-2\">\n <Plus className=\"nd:size-3.5\" />\n <span className=\"nd:text-sm\">Add Account</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>\n Google Drive\n </DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"nd:size-9 nd:shrink-0 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n >\n <Settings2 className=\"nd:size-4 nd:text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"nd:w-40\">\n <DropdownMenuLabel className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => {\n setRenameDialog({ open: true, account: currentAccount });\n }}>\n <Pencil className=\"nd:size-3.5 nd:mr-2\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"nd:size-3.5 nd:mr-2\" />\n Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"nd:text-destructive nd:focus:text-destructive\"\n onClick={() => setDeleteDialog({ open: true, account: currentAccount })}\n >\n <Trash className=\"nd:size-3.5 nd:mr-2\" />\n Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"nd:flex-1 nd:p-2 nd:space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\n \"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\",\n currentView !== 'TRASH'\n ? \"nd:bg-primary/10 nd:text-primary nd:hover:bg-primary/15 nd:dark:bg-primary/15 nd:dark:hover:bg-primary/20\"\n : \"nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"nd:size-4\" />\n My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\n \"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\",\n currentView === 'TRASH'\n ? \"nd:bg-destructive/10 nd:text-destructive nd:hover:bg-destructive/15 nd:dark:bg-destructive/15\"\n : \"nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"nd:size-4\" />\n Trash\n </Button>\n </nav>\n\n {/* Storage Indicator */}\n <div className=\"nd:p-2.5 nd:border-t nd:border-border/50 nd:bg-background/50 nd:dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Rename Dialog */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Are you sure you want to disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed from local cache.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"nd:sm:max-w-xs\" showCloseButton={false}>\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-4 nd:py-4\">\n <Loader2 className=\"nd:size-8 nd:text-primary nd:animate-spin\" />\n <div className=\"nd:text-center\">\n <DialogTitle className=\"nd:text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"nd:text-sm nd:mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ** Desktop Sidebar (always visible on larger screens)\nexport const DriveSidebar = ({ className }: { className?: string }) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <div className={className}>\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9\" aria-label=\"Open menu\">\n <Menu className=\"nd:size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"nd:w-70 nd:sm:w-80 nd:p-0\" hideCloseButton>\n <SheetTitle className=\"nd:sr-only\">Navigation Menu</SheetTitle>\n <SheetDescription className=\"nd:sr-only\">Storage accounts and navigation</SheetDescription>\n <SidebarContent onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n </div>\n );\n};\n","// ** DriveExplorer Component\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight } from 'lucide-react';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport { Pencil, Trash2, FolderPlus } from \"lucide-react\";\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { DriveContentProgress } from '@/client/components/drive/header';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id, disabled });\n\n // Don't apply transform when this is a folder being hovered (prevents sliding)\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className, selectableFolders = false } = props;\n const {\n items, isLoading, error, apiEndpoint, currentFolderId,\n setItems,\n viewMode, groupBy, sortBy, setSortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n callAPI, currentView, moveItem, deleteItem, restoreItem, createFolder, renameItem: renameItemAction\n } = useDrive();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({\n newFolder: false,\n rename: false,\n delete: false\n });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Item State\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Drag & Drop State\n const [dragOverFolderId, setDragOverFolderId] = React.useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = React.useState<string | null>(null);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), // Prevent drag on simple click\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handle Drag Start\n const handleDragStart = (event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n };\n\n // ** Handle Drag Over (track folder hover)\n const handleDragOver = (event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n const overItem = items.find(i => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n };\n\n // ** Handle Drag End\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) {\n return;\n }\n\n // Check if dropping on a path bar item\n const overId = over.id as string;\n if (overId.startsWith('path-')) {\n const targetFolderId = overId.replace('path-', '');\n // Move to target folder (root = 'root')\n await moveItem(active.id as string, targetFolderId === 'root' ? 'root' : targetFolderId);\n return;\n }\n\n const overItem = items.find(i => i.id === over.id);\n const activeItem = items.find(i => i.id === active.id);\n\n // If dropping on a folder (and not the item itself), MOVE into folder\n if (overItem?.information.type === 'FOLDER' && activeItem) {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Otherwise, reorder\n // Optimistic Update\n setItems((prevItems) => {\n const oldIndex = prevItems.findIndex((i) => i.id === active.id);\n const newIndex = prevItems.findIndex((i) => i.id === over.id);\n return arrayMove(prevItems, oldIndex, newIndex);\n });\n\n // Switch to custom order if not already\n if (sortBy.field !== 'order') {\n setSortBy({ field: 'order', order: 1 });\n }\n\n // Sync with Server\n const oldIndex = items.findIndex((i) => i.id === active.id);\n const newIndex = items.findIndex((i) => i.id === over.id);\n const newOrderIds = arrayMove(items, oldIndex, newIndex).map(i => i.id);\n\n await callAPI('reorder', {\n method: 'POST',\n body: JSON.stringify({ ids: newOrderIds })\n });\n };\n\n // ** Filter & Sort Items (Memoized)\n // Note: If we drag, we update 'items'. The Memo needs to respect 'items' order if sortBy.field === 'order'.\n const processedItems = useMemo(() => {\n let filtered = items;\n\n if (mimeFilter) {\n filtered = filtered.filter(item => matchesMimeFilter(item.information.type === 'FILE' ? item.information.mime : '', item.information.type === 'FOLDER', mimeFilter));\n }\n\n return [...filtered].sort((a, b) => {\n // Always folders first\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n\n const field = sortBy.field;\n const order = sortBy.order;\n\n if (field === 'order') {\n // If we are sorting by order, we trust the array index implicity or use explicit order field if stable.\n // However, dnd:kit arrayMove changes array index.\n // But DB store `order` number.\n // Since we update `items` state array order on drag, we should just return 0 (maintain array order)\n // OR sort by `a.order - b.order`.\n // If we optimistically update `items` array, we prefer the Array Order if field is 'order'.\n // But backend `reorder` updates `order` field.\n // Let's rely on Array Order if 'order', assuming `items` is loaded sorted by order initially?\n // `refreshItems` calls `list`. API `list` usually sorts by default.\n // If `sortBy.field` is 'order', we want to respect the current array order (which dnd manipulates).\n return 0; // Maintain array index order\n }\n\n let valA: any, valB: any;\n\n if (field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else { // createdAt / default\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n\n if (valA < valB) return -1 * order;\n if (valA > valB) return 1 * order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n // ... grouping logic same as before ...\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [],\n 'Yesterday': [],\n 'Earlier this Week': [],\n 'Last Week': [],\n 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll Observer\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n const handleItemClick = (e: React.MouseEvent | React.TouchEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n onItemClick?.(item);\n return;\n }\n\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n onItemClick?.(item);\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // This is for mouse double-click on desktop\n if (item.information.type === 'FOLDER') {\n if (currentView === 'BROWSE') navigateToFolder(item);\n }\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n const stateContent = (() => {\n // Loading State (empty)\n if (isLoading && items.length === 0) {\n return <div className=\"nd:flex nd:items-center nd:justify-center nd:py-12 nd:flex-1\"><Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" /></div>;\n }\n // Error State\n if (error) {\n return <div className=\"nd:flex nd:items-center nd:justify-center nd:p-12 nd:text-destructive nd:bg-destructive/10 nd:rounded-lg nd:flex-1\">{error}</div>;\n }\n // Empty State\n if (processedItems.length === 0) {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"nd:flex nd:flex-col nd:items-center nd:justify-center nd:py-12 nd:text-center nd:flex-1\", className)}>\n <div className=\"nd:size-12 nd:rounded-full nd:bg-muted nd:flex nd:items-center nd:justify-center nd:mb-3\"><Folder className=\"nd:size-6 nd:text-muted-foreground\" /></div>\n <p className=\"nd:text-sm nd:text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'No files found'}\n </p>\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"nd:mr-2 nd:size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"nd:px-2 nd:py-6 nd:text-center\">\n <p className=\"nd:text-xs nd: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=\"nd-drive-root nd:flex nd:flex-col nd:h-full nd:w-full nd:overflow-hidden nd:bg-background/50 nd:dark:bg-background/30 nd:relative\">\n {/* Top Progress Bar */}\n <DriveContentProgress />\n\n {/* Header Row */}\n <div className=\"nd:h-12 nd:px-3 nd:sm:px-4 nd:border-b nd:bg-background/95 nd:dark:bg-background/80 nd:backdrop-blur-sm nd:flex nd:items-center nd:gap-3\">\n <DriveSidebar className=\"nd:lg:hidden\" />\n <DrivePathBar className=\"nd:hidden nd:lg:flex nd:flex-1\" />\n <DriveUpload compact accept={mimeFilter} />\n </div>\n\n {/* Path Bar - Mobile */}\n <div className=\"nd:lg:hidden nd:px-3 nd:py-2 nd:border-b nd:bg-background/95 nd:dark:bg-background/80 nd:backdrop-blur-sm\">\n <DrivePathBar />\n </div>\n\n {stateContent || (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:container nd:mx-auto nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}>\n <div className=\"nd:space-y-4 nd:sm:space-y-6 nd:pb-8 nd:sm:pb-12\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName} className=\"nd:space-y-3\">\n {groupBy !== 'NONE' && (\n <h3 className=\"nd:text-sm nd:font-medium nd:text-muted-foreground nd:flex nd:items-center nd:gap-2\">\n {groupName} <span className=\"nd:text-xs nd: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 ? \"nd:grid nd:grid-cols-2 nd:sm:grid-cols-3 nd:md:grid-cols-4 nd:lg:grid-cols-5 nd:xl:grid-cols-6 2nd:xl:grid-cols-7 nd:gap-2 nd:sm:gap-3 nd:md:gap-4\"\n : \"nd:flex nd:flex-col nd: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 nd:relative nd:cursor-pointer nd:transition-all nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-primary nd:focus:ring-offset-2\",\n viewMode === 'GRID'\n ? \"nd:flex nd:flex-col nd:rounded-xl nd:border nd:bg-card nd:dark:bg-card/50 nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:hover:shadow-sm nd:overflow-hidden\"\n : \"nd:flex nd:items-center nd:p-2 nd:rounded-lg nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:gap-3 nd:border nd:border-transparent nd:hover:border-border\",\n isSelected && \"nd:ring-2 nd:ring-primary nd:border-primary/50 nd:bg-accent/30 nd:dark:bg-accent/20\",\n isDragOver && \"nd:ring-2 nd:ring-primary nd:border-primary nd:scale-[1.02] nd:bg-primary/10 nd:shadow-lg nd:transition-transform\"\n )}\n onClick={(e) => handleItemClick(e, item)}\n onTouchEnd={(e) => {\n e.preventDefault();\n handleItemClick(e, item);\n }}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"nd:aspect-square nd:w-full nd:bg-muted/20 nd:dark:bg-muted/10 nd:flex nd:items-center nd:justify-center nd:overflow-hidden nd:relative\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-contain nd:transition-transform group-nd:hover:scale-105 nd:duration-300\" loading=\"lazy\" />\n ) : (\n <div className=\"nd:transition-transform group-nd:hover:scale-110 nd:duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-10 nd:text-muted-foreground/70\")}\n </div>\n )}\n {isSelected && (\n <div className=\"nd:absolute nd:top-2 nd:right-2 nd:size-5 nd:bg-primary nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-sm nd:animate-in nd:zoom-in-50\">\n <div className=\"nd:size-2 nd:bg-primary-foreground nd:rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"nd:absolute nd:bottom-2 nd:right-2 nd:lg:hidden nd:size-6 nd:bg-primary/90 nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md\">\n <ChevronRight className=\"nd:size-3.5 nd:text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"nd:p-2.5\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"nd:size-9 nd:shrink-0 nd:rounded-md nd:overflow-hidden nd:bg-muted/40 nd:dark:bg-muted/20 nd:flex nd:items-center nd:justify-center nd:border\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-contain\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-4 nd:text-muted-foreground\")\n )}\n </div>\n <span className=\"nd:text-sm nd:font-medium nd:truncate nd:flex-1\" title={item.name}>{item.name}</span>\n <span className=\"nd:text-xs nd:text-muted-foreground nd:w-20 nd:text-right nd:shrink-0\">\n {isFolder ? '-' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </span>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"nd:size-4 nd:text-muted-foreground nd:lg:hidden nd:shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={() => restoreItem(item.id)}>\n <RotateCcw className=\"nd:mr-2 nd:size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={() => {\n setItemToRename(item);\n setDialogs(prev => ({ ...prev, rename: true }));\n }}>\n <Pencil className=\"nd:mr-2 nd:size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"nd:mr-2 nd: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=\"nd:flex nd:justify-center nd:py-4\">\n {isLoadingMore && <Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" />}\n {!isLoadingMore && <div className=\"nd:h-4 nd:w-full\" />}\n </div>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"nd:mr-2 nd:size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"nd:px-2 nd:py-6 nd:text-center\">\n <p className=\"nd:text-xs nd:text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n )}\n\n {/* Dialogs - Outside of ContextMenu to prevent z-index/portal issues */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => {\n setDialogs(prev => ({ ...prev, rename: false }));\n setItemToRename(null);\n }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => {\n setDialogs(prev => ({ ...prev, delete: false }));\n setItemToDelete(null);\n }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`\n }\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </div>\n </DndContext>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/context.tsx","../../src/client/hooks/useUpload.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/dialog-fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/dialog.tsx","../../src/client/components/ui/dropdown-menu.tsx","../../src/client/components/ui/alert.tsx","../../src/client/components/ui/input.tsx","../../src/client/components/ui/label.tsx","../../src/client/components/dialog.tsx","../../src/client/components/drive/RenameAccountDialog.tsx","../../src/client/components/drive/dnd-provider.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/CreateFolderDialog.tsx","../../src/client/components/drive/RenameDialog.tsx","../../src/client/components/drive/file-grid.tsx","../../src/client/components/drive/header.tsx","../../src/client/components/drive/path-bar.tsx","../../src/client/components/drive/upload.tsx","../../src/client/components/drive/storage/indicator.tsx","../../src/client/file-chooser.tsx","../../src/client/components/drive/sidebar.tsx","../../src/client/components/drive/explorer.tsx"],"names":["createContext","React","useState","useCallback","driveCreateUrl","jsx","useContext","useRef","useEffect","cva","Slot","cn","DialogPrimitive","jsxs","X","SheetPrimitive","React2","DialogPrimitive2","DropdownMenuPrimitive","React3","ChevronRight","Check","Circle","Label","LabelPrimitive","AlertCircle","useForm","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","pointerWithin","ProgressPrimitive","ContextMenuPrimitive","React5","useSortable","CSS","Fragment","getFileIcon","formatBytes","RotateCcw","Trash2","Pencil","useMemo","matchesMimeFilter","startOfWeek","subWeeks","isToday","isYesterday","isAfter","items","Loader2","Folder","SortableContext","rectSortingStrategy","FolderPlus","Menu","Group","Search","ArrowUpDown","Calendar","ArrowDownAZ","ArrowUpAZ","ArrowDown01","ArrowUp01","LayoutGrid","List","useDroppable","CheckCircle2","Clock","FileText","RefreshCw","UploadIcon","Cloud","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen","SortableItem","oldIndex","newIndex","closestCenter"],"mappings":"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","file":"index.cjs","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, TDriveFile } from '@/types/client';\nimport { driveCreateUrl } from '@/client/utils';\n\n// ** Context Types\nexport type TDriveContext = {\n apiEndpoint: string;\n withCredentials: boolean;\n\n // ** Navigation\n currentFolderId: string | null;\n path: TDrivePathItem[];\n navigateToFolder: (item: { id: string | null; name: string } | null) => void;\n navigateUp: () => void;\n\n // ** Items\n items: TDatabaseDrive[];\n setItems: React.Dispatch<React.SetStateAction<TDatabaseDrive[]>>;\n isLoading: boolean;\n error: string | null;\n fetchItems: () => Promise<void>;\n triggerFetch: () => void;\n\n // ** Accounts\n accounts: { id: string; name: string; email: string; provider: 'GOOGLE' }[];\n activeAccountId: string | null;\n setActiveAccountId: (id: string | null) => void;\n refreshAccounts: () => Promise<void>;\n availableProviders: { google: boolean };\n\n // ** Storage\n quota: TDriveQuota | null;\n refreshQuota: () => Promise<void>;\n\n // ** UI State\n viewMode: 'GRID' | 'LIST';\n setViewMode: (mode: 'GRID' | 'LIST') => void;\n currentView: 'BROWSE' | 'TRASH' | 'SEARCH';\n setCurrentView: (view: 'BROWSE' | 'TRASH' | 'SEARCH') => void;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchScope: 'ACTIVE' | 'TRASH';\n setSearchScope: (scope: 'ACTIVE' | 'TRASH') => void;\n groupBy: 'NONE' | 'CREATED_AT';\n setGroupBy: (group: 'NONE' | 'CREATED_AT') => void;\n sortBy: { field: string; order: number };\n setSortBy: (sort: { field: string; order: number }) => void;\n\n // ** Selection\n selectionMode: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n selectedFileIds: string[];\n setSelectedFileIds: React.Dispatch<React.SetStateAction<string[]>>;\n\n // ** Pagination\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n\n // ** Utilities\n createUrl: (driveFile: TDriveFile) => string;\n callAPI: <T>(action: string, options?: RequestInit & { query?: Record<string, string> }) => Promise<TDriveAPIResponse<T>>;\n\n // ** Actions (Optimistic)\n createFolder: (name: string) => Promise<void>;\n renameItem: (id: string, newName: string) => Promise<void>;\n deleteItem: (id: string) => Promise<void>;\n moveItem: (id: string, targetFolderId: string) => Promise<void>;\n restoreItem: (id: string) => Promise<void>;\n};\n\nconst DriveContext = createContext<TDriveContext | null>(null);\n\n// ** Provider\nexport const DriveProvider = (props: Readonly<{\n children: ReactNode;\n apiEndpoint: string;\n initialActiveAccountId?: string | null;\n initialSelectionMode?: { type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number };\n defaultSelectedFileIds?: string[];\n withCredentials?: boolean;\n lazyFetch?: boolean;\n}>) => {\n const {\n children,\n apiEndpoint,\n initialActiveAccountId = null,\n initialSelectionMode = { type: 'SINGLE' },\n defaultSelectedFileIds = [],\n withCredentials = false,\n lazyFetch = false\n } = props;\n\n // Track if initial fetch has been triggered (for lazy mode)\n const [hasFetched, setHasFetched] = React.useState(!lazyFetch);\n\n // =========================================================================\n // STATE\n // =========================================================================\n\n // ** Items - Simple flat array for current view\n const [items, setItems] = useState<TDatabaseDrive[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // ** Navigation\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [path, setPath] = useState<TDrivePathItem[]>([{ id: null, name: 'Home' }]);\n\n // ** Accounts\n const [accounts, setAccounts] = useState<{ id: string; name: string; email: string; provider: 'GOOGLE' }[]>([]);\n const [activeAccountId, setActiveAccountIdState] = useState<string | null>(initialActiveAccountId);\n const [availableProviders, setAvailableProviders] = useState<{ google: boolean }>({ google: false });\n\n // ** Storage\n const [quota, setQuota] = useState<TDriveQuota | null>(null);\n\n // ** UI State\n const [viewMode, setViewMode] = useState<'GRID' | 'LIST'>(() => {\n if (typeof window !== 'undefined') return window.innerWidth < 768 ? 'LIST' : 'GRID';\n return 'GRID';\n });\n const [currentView, setCurrentView] = useState<'BROWSE' | 'TRASH' | 'SEARCH'>('BROWSE');\n const [searchQuery, setSearchQuery] = useState('');\n const [searchScope, setSearchScope] = useState<'ACTIVE' | 'TRASH'>('ACTIVE');\n const [groupBy, setGroupBy] = useState<'NONE' | 'CREATED_AT'>('NONE');\n const [sortBy, setSortBy] = useState<{ field: string; order: number }>({ field: 'createdAt', order: -1 });\n\n // ** Selection\n const [selectionMode] = useState(initialSelectionMode);\n const [selectedFileIds, setSelectedFileIds] = useState<string[]>(defaultSelectedFileIds);\n\n // ** Pagination\n const [hasMore, setHasMore] = useState(false);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // =========================================================================\n // API HELPER\n // =========================================================================\n\n const callAPI = useCallback(async <T,>(\n action: string,\n options?: RequestInit & { query?: Record<string, string> }\n ): Promise<TDriveAPIResponse<T>> => {\n const { query, ...fetchOptions } = options || {};\n const params = new URLSearchParams({ action, ...query });\n const url = `${apiEndpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...((fetchOptions?.headers as Record<string, string>) || {})\n };\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n return await res.json();\n } catch (err) {\n return { status: 0, message: err instanceof Error ? err.message : 'Network error' };\n }\n }, [apiEndpoint, activeAccountId, withCredentials]);\n\n // =========================================================================\n // FETCH FUNCTIONS\n // =========================================================================\n\n const fetchItems = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n let res: TDriveAPIResponse<{ items: TDatabaseDrive[]; hasMore?: boolean }>;\n\n if (currentView === 'TRASH') {\n res = await callAPI('trash');\n } else if (currentView === 'SEARCH' && searchQuery) {\n res = await callAPI('search', { query: { q: searchQuery, limit: '50' } });\n } else {\n res = await callAPI('list', { query: { folderId: currentFolderId || 'root', limit: '50' } });\n }\n\n if (res.status === 200 && res.data) {\n setItems(res.data.items);\n setHasMore(!!res.data.hasMore);\n } else {\n setError(res.message || 'Failed to load');\n setItems([]);\n }\n\n setIsLoading(false);\n }, [callAPI, currentFolderId, currentView, searchQuery]);\n\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading || isLoadingMore) return;\n\n const lastItem = items[items.length - 1];\n if (!lastItem) return;\n\n setIsLoadingMore(true);\n\n const res = await callAPI<{ items: TDatabaseDrive[]; hasMore?: boolean }>('list', {\n query: { folderId: currentFolderId || 'root', limit: '50', afterId: lastItem.id }\n });\n\n if (res.status === 200 && res.data) {\n setItems(prev => [...prev, ...res.data!.items]);\n setHasMore(!!res.data.hasMore);\n }\n\n setIsLoadingMore(false);\n }, [callAPI, currentFolderId, hasMore, isLoading, isLoadingMore, items]);\n\n const refreshAccounts = useCallback(async () => {\n const res = await callAPI<{ accounts: typeof accounts }>('listAccounts');\n if (res.status === 200 && res.data) setAccounts(res.data.accounts);\n\n // Also fetch available providers\n const infoRes = await callAPI<{ providers: { google: boolean } }>('information');\n if (infoRes.status === 200 && infoRes.data) setAvailableProviders(infoRes.data.providers);\n }, [callAPI]);\n\n const refreshQuota = useCallback(async () => {\n const res = await callAPI<TDriveQuota>('quota');\n if (res.status === 200 && res.data) setQuota(res.data);\n }, [callAPI]);\n\n // =========================================================================\n // NAVIGATION\n // =========================================================================\n\n const setActiveAccountId = useCallback((id: string | null) => {\n setActiveAccountIdState(id);\n if (id) localStorage.setItem('drive_active_account', id);\n else localStorage.removeItem('drive_active_account');\n // Reset state\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n setItems([]);\n setSelectedFileIds([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n\n if (!item) {\n setCurrentFolderId(null);\n setPath([{ id: null, name: 'Home' }]);\n return;\n }\n\n setCurrentFolderId(item.id);\n setPath(prev => {\n const idx = prev.findIndex(p => p.id === item.id);\n return idx !== -1 ? prev.slice(0, idx + 1) : [...prev, { id: item.id, name: item.name }];\n });\n }, []);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n setSelectedFileIds([]);\n setIsLoading(true); // Show loading immediately when navigating\n const newPath = path.slice(0, -1);\n setPath(newPath);\n setCurrentFolderId(newPath[newPath.length - 1]?.id || null);\n }, [path]);\n\n // =========================================================================\n // OPTIMISTIC ACTIONS\n // =========================================================================\n\n const createFolder = useCallback(async (name: string) => {\n // Optimistic: Add temp folder\n const tempId = `temp-${Date.now()}`;\n const tempFolder = {\n id: tempId,\n name,\n parentId: currentFolderId,\n information: { type: 'FOLDER' as const },\n createdAt: new Date(),\n trashedAt: null,\n } as TDatabaseDrive;\n setItems(prev => [tempFolder, ...prev]);\n\n // API call\n const res = await callAPI<{ item: TDatabaseDrive }>('createFolder', {\n method: 'POST',\n body: JSON.stringify({ name, parentId: currentFolderId || 'root' })\n });\n\n // Replace temp with real\n if ((res.status === 200 || res.status === 201) && res.data?.item) {\n setItems(prev => prev.map(i => i.id === tempId ? res.data!.item : i));\n } else {\n // Rollback\n setItems(prev => prev.filter(i => i.id !== tempId));\n }\n }, [callAPI, currentFolderId]);\n\n const renameItem = useCallback(async (id: string, newName: string) => {\n // Optimistic: Update name immediately\n setItems(prev => prev.map(i => i.id === id ? { ...i, name: newName } : i));\n\n // API call (fire and forget, already updated)\n await callAPI('rename', {\n method: 'PATCH',\n query: { id },\n body: JSON.stringify({ newName })\n });\n }, [callAPI]);\n\n const deleteItem = useCallback(async (id: string) => {\n // Optimistic: Remove from list immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call\n if (currentView === 'TRASH') {\n await callAPI('deletePermanent', { query: { id } });\n } else {\n await callAPI('delete', { query: { id } });\n }\n }, [callAPI, currentView]);\n\n const moveItem = useCallback(async (id: string, targetFolderId: string) => {\n // Optimistic: Remove from current view (it's moving away)\n setItems(prev => prev.filter(i => i.id !== id));\n\n // API call\n await callAPI('move', {\n method: 'POST',\n body: JSON.stringify({ ids: [id], targetFolderId })\n });\n }, [callAPI]);\n\n const restoreItem = useCallback(async (id: string) => {\n // Optimistic: Remove from trash view immediately\n setItems(prev => prev.filter(i => i.id !== id));\n setSelectedFileIds(prev => prev.filter(sid => sid !== id));\n\n // API call in background\n await callAPI('restore', { method: 'POST', query: { id } });\n }, [callAPI]);\n\n // =========================================================================\n // UTILITIES\n // =========================================================================\n\n const createUrl = useCallback((driveFile: TDriveFile) => {\n return driveCreateUrl(driveFile, apiEndpoint);\n }, [apiEndpoint]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n\n // Load stored account on mount\n React.useEffect(() => {\n const stored = localStorage.getItem('drive_active_account');\n if (stored) setActiveAccountIdState(stored);\n }, []);\n\n // Fetch items when view/folder/account changes (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n fetchItems();\n }, [fetchItems, hasFetched]);\n\n // Fetch accounts & quota on mount and account change (skip if lazy and not yet triggered)\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshAccounts();\n }, [refreshAccounts, hasFetched]);\n React.useEffect(() => {\n if (!hasFetched) return;\n refreshQuota();\n }, [refreshQuota, activeAccountId, hasFetched]);\n\n // Trigger initial fetch (used by components to start fetching in lazy mode)\n const triggerFetch = React.useCallback(() => {\n if (!hasFetched) setHasFetched(true);\n }, [hasFetched]);\n\n // =========================================================================\n // RENDER\n // =========================================================================\n\n return (\n <DriveContext.Provider value={{\n apiEndpoint,\n withCredentials,\n\n // Navigation\n currentFolderId,\n path,\n navigateToFolder,\n navigateUp,\n\n // Items\n items,\n setItems,\n isLoading,\n error,\n fetchItems,\n triggerFetch,\n\n // Accounts\n accounts,\n activeAccountId,\n setActiveAccountId,\n refreshAccounts,\n availableProviders,\n\n // Storage\n quota,\n refreshQuota,\n\n // UI\n viewMode,\n setViewMode,\n currentView,\n setCurrentView,\n searchQuery,\n setSearchQuery,\n searchScope,\n setSearchScope,\n groupBy,\n setGroupBy,\n sortBy,\n setSortBy,\n\n // Selection\n selectionMode,\n selectedFileIds,\n setSelectedFileIds,\n\n // Pagination\n hasMore,\n isLoadingMore,\n loadMore,\n\n // Utilities\n createUrl,\n callAPI,\n\n // Optimistic Actions\n createFolder,\n renameItem,\n deleteItem,\n moveItem,\n restoreItem,\n }}>\n {children}\n </DriveContext.Provider>\n );\n};\n\n// ** Hook\nexport const useDrive = (): TDriveContext => {\n const context = useContext(DriveContext);\n if (!context) throw new Error('useDrive must be used within a DriveProvider');\n return context;\n};\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nconst getChunkSize = (fileSize: number) => {\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\n return 16 * 1024 * 1024;\n};\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: unknown) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n\n // ** Refs for data storage\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null }>>(new Map());\n\n const updateUpload = useCallback((id: string, updates: Partial<TDriveUploadState>) => {\n setUploads(prev => prev.map(u => (u.id === id ? { ...u, ...updates } : u)));\n }, []);\n\n const addLog = useCallback((id: string, type: 'info' | 'warning' | 'error' | 'success', message: string) => {\n setUploads(prev => prev.map(u => {\n if (u.id !== id) return u;\n const logs = u.logs || [];\n return { ...u, logs: [...logs, { type, message, timestamp: Date.now() }] };\n }));\n }, []);\n\n const uploadChunk = async (uploadId: string, formData: FormData): Promise<[boolean, any, boolean]> => {\n try {\n const headers: Record<string, string> = {};\n if (activeAccountId) headers['x-drive-account'] = activeAccountId;\n const url = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\n addLog(uploadId, 'info', `Sending chunk to ${url}`);\n\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const text = await response.text();\n addLog(uploadId, 'error', `HTTP ${response.status}: ${response.statusText}`);\n try {\n const json = JSON.parse(text);\n const msg = json.message || json.error?.message || `Status ${response.status}`;\n addLog(uploadId, 'error', `Server response: ${msg}`);\n\n // Retry on Gateway errors (502, 503, 504) or Request Timeout (408) or Too Many Requests (429)\n const canRetry = [408, 429, 502, 503, 504].includes(response.status);\n if (canRetry) {\n addLog(uploadId, 'warning', `Error is retryable (status ${response.status})`);\n }\n return [false, msg, canRetry];\n } catch {\n // If parsing fails, it's likely a severe server error (500 HTML) or network glitch response?\n // Assume retryable for 5xx range, non-retryable for 4xx?\n addLog(uploadId, 'error', `Failed to parse error response: ${text.slice(0, 100)}`);\n const isRetryable = response.status >= 500 || response.status === 429;\n return [false, `Server error ${response.status}: ${text.slice(0, 100)}`, isRetryable];\n }\n }\n\n const data = await response.json();\n if (data.status !== 200) {\n addLog(uploadId, 'error', `Upload API error: ${data.message || 'Unknown error'}`);\n return [false, data.message || 'Upload failed', false]; // Business logic errors are fatal\n }\n\n addLog(uploadId, 'success', `Chunk uploaded successfully`);\n return [true, data.data, false];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Network error';\n addLog(uploadId, 'error', `Network/Fetch error: ${errorMsg}`);\n return [false, errorMsg, true]; // Network errors are retryable\n }\n };\n\n const processItem = async (item: TDriveUploadState, file: File, folderId: string | null) => {\n const controller = new AbortController();\n abortControllers.current.set(item.id, controller);\n\n addLog(item.id, 'info', `Starting upload: ${file.name} (${file.size} bytes)`);\n updateUpload(item.id, { status: 'uploading' });\n\n const chunkSize = getChunkSize(file.size);\n const totalChunks = Math.ceil(file.size / chunkSize);\n addLog(item.id, 'info', `File split into ${totalChunks} chunks of ${chunkSize} bytes each`);\n\n let driveId = item.driveId;\n\n try {\n for (let i = item.currentChunk; i < totalChunks; i++) {\n if (controller.signal.aborted) throw new Error('Cancelled');\n\n updateUpload(item.id, { currentChunk: i });\n addLog(item.id, 'info', `Processing chunk ${i + 1}/${totalChunks}`);\n\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n const formData = new FormData();\n formData.append('chunk', chunk);\n formData.append('chunkIndex', String(i));\n formData.append('totalChunks', String(totalChunks));\n formData.append('fileName', file.name);\n formData.append('fileSize', String(file.size));\n formData.append('fileType', file.type);\n formData.append('folderId', folderId || 'root');\n if (driveId) formData.append('driveId', driveId);\n\n // Smart retry logic\n let attempts = 0;\n let success = false;\n while (!success && attempts < 3 && !controller.signal.aborted) {\n const [ok, result, canRetry] = await uploadChunk(item.id, formData);\n if (ok) {\n success = true;\n if (result.type === 'UPLOAD_STARTED' && result.driveId) {\n driveId = result.driveId;\n updateUpload(item.id, { driveId });\n addLog(item.id, 'success', `Upload session started with ID: ${driveId}`);\n } else if (result.type === 'UPLOAD_COMPLETE') {\n // Single chunk upload complete\n addLog(item.id, 'success', `Upload completed successfully`);\n if (onUploadComplete) onUploadComplete(result.item);\n }\n } else {\n if (!canRetry) {\n addLog(item.id, 'error', `Non-retryable error: ${result as string}`);\n throw new Error(result as string); // Immediate failure for non-retryable errors\n }\n\n attempts++;\n addLog(item.id, 'warning', `Retry attempt ${attempts}/3 after error`);\n if (attempts === 3) {\n addLog(item.id, 'error', `Max retry attempts reached: ${result as string}`);\n throw new Error(result as string);\n }\n await new Promise(r => setTimeout(r, 1000 * attempts));\n }\n }\n }\n addLog(item.id, 'success', `All ${totalChunks} chunks uploaded successfully`);\n updateUpload(item.id, { status: 'complete', currentChunk: totalChunks });\n // Since we don't get the item in the final chunk response here easily without parsing the loop result,\n // wait, the server returns UPLOAD_COMPLETE with item in the last chunk response.\n // But loop logic handles it?\n // \"if (result.type === 'UPLOAD_COMPLETE')\" is handled inside the loop for single files OR last chunk.\n // So onUploadComplete is called there.\n // Wait, chunked upload response handling loop (lines 96-103) ONLY handles UPLOAD_STARTED.\n // I need to update the loop to checks for UPLOAD_COMPLETE too.\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n if (errorMessage === 'Cancelled') {\n addLog(item.id, 'warning', 'Upload cancelled by user');\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n addLog(item.id, 'error', `Upload failed: ${errorMessage}`);\n updateUpload(item.id, { status: 'error', error: errorMessage });\n }\n } finally {\n abortControllers.current.delete(item.id);\n }\n };\n\n const uploadFiles = useCallback(async (files: File[], folderId: string | null) => {\n const newUploads: TDriveUploadState[] = [];\n files.forEach(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const chunkSize = getChunkSize(file.size);\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n newUploads.push({\n id,\n name: file.name,\n size: file.size,\n status: 'queued',\n currentChunk: 0,\n totalChunks: Math.ceil(file.size / chunkSize),\n logs: [],\n });\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const cancelUpload = useCallback(\n async (id: string) => {\n const controller = abortControllers.current.get(id);\n if (controller) {\n controller.abort();\n } else {\n updateUpload(id, { status: 'cancelled' });\n }\n\n const upload = uploads.find(u => u.id === id);\n if (upload?.driveId) {\n fetch(`${apiEndpoint.replace(/\\/$/, '')}?action=cancel&id=${upload.driveId}`, {\n method: 'POST',\n credentials: withCredentials ? 'include' : 'same-origin',\n }).catch(() => { });\n }\n },\n [apiEndpoint, updateUpload, uploads, withCredentials],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['queued', 'uploading', 'pending'].includes(u.status)) {\n cancelUpload(u.id);\n }\n });\n }, [uploads, cancelUpload]);\n\n // ** Robust Scheduler\n useEffect(() => {\n const activeCount = uploads.filter(u => u.status === 'uploading').length;\n\n if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued');\n\n if (queued) {\n const file = filesRef.current.get(queued.id);\n const meta = metaRef.current.get(queued.id);\n\n if (file) {\n processItem(queued, file, meta?.folderId || null);\n }\n }\n // eslint-disable-next-line\n }, [uploads]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads };\n};\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst buttonVariants = cva(\n \"nd:inline-flex nd:items-center nd:justify-center nd:gap-2 nd:whitespace-nowrap nd:rounded-md nd:text-sm nd:font-medium nd:transition-all nd:disabled:pointer-events-none nd:disabled:opacity-50 [&_svg]:nd:pointer-events-none [&_svg:not([class*='size-'])]:nd:size-4 nd:shrink-0 [&_svg]:nd:shrink-0 nd:outline-none nd:focus-visible:border-ring nd:focus-visible:ring-ring/50 nd:focus-visible:ring-[3px] aria-invalid:nd:ring-destructive/20 dark:aria-invalid:nd:ring-destructive/40 aria-invalid:nd:border-destructive\",\n {\n variants: {\n variant: {\n default: \"nd:bg-primary nd:text-primary-foreground nd:hover:bg-primary/90\",\n destructive:\n \"nd:bg-destructive nd:text-white nd:hover:bg-destructive/90 nd:focus-visible:ring-destructive/20 dark:nd:focus-visible:ring-destructive/40\",\n outline:\n \"nd:border nd:bg-background nd:shadow-xs nd:hover:bg-accent nd:hover:text-accent-foreground nd:dark:bg-input/30 nd:dark:border-input nd:dark:hover:bg-input/50\",\n secondary:\n \"nd:bg-secondary nd:text-secondary-foreground nd:hover:bg-secondary/80\",\n ghost:\n \"nd:hover:bg-accent nd:hover:text-accent-foreground nd:dark:hover:bg-accent/50\",\n link: \"nd:text-primary nd:underline-offset-4 nd:hover:underline\",\n },\n size: {\n default: \"nd:h-9 nd:px-4 nd:py-2 nd:has-[>svg]:px-3\",\n sm: \"nd:h-8 nd:rounded-md nd:gap-1.5 nd:px-3 nd:has-[>svg]:px-2.5\",\n lg: \"nd:h-10 nd:rounded-md nd:px-6 nd:has-[>svg]:px-4\",\n icon: \"nd:size-9\",\n \"icon-sm\": \"nd:size-8\",\n \"icon-lg\": \"nd:size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/client/utils\"\n\n// ** Dialog2 - Modern fullscreen dialog on mobile, centered on desktop\nfunction Dialog2({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog2\" {...props} />\n}\n\nfunction Dialog2Trigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog2-trigger\" {...props} />\n}\n\nfunction Dialog2Close({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog2-close\" {...props} />\n}\n\nfunction Dialog2Content({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPrimitive.Portal data-slot=\"dialog2-portal\">\n {/* Overlay with higher z-index for proper stacking */}\n <DialogPrimitive.Overlay\n data-slot=\"dialog2-overlay\"\n className={cn(\n \"nd:fixed nd:inset-0 nd:z-50 nd:bg-black/60 nd:backdrop-blur-sm\",\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out\",\n \"nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0\"\n )}\n />\n {/* Content: Fullscreen on mobile, centered modal on desktop */}\n <DialogPrimitive.Content\n data-slot=\"dialog2-content\"\n className={cn(\n \"nd:overflow-hidden\",\n\n // Base styles\n \"nd:fixed nd:z-50 nd:flex nd:flex-col nd:bg-background nd:shadow-2xl nd:outline-none\",\n // Mobile: Full screen\n \"nd:inset-0 nd:rounded-none\",\n // Desktop: Centered modal with max dimensions\n \"nd:md:inset-auto nd:md:top-[50%] nd:md:left-[50%] nd:md:translate-x-[-50%] nd:md:translate-y-[-50%]\",\n \"nd:md:max-w-5xl nd:md:w-[95vw] nd:md:max-h-[90vh] nd:md:rounded-xl nd:md:border\",\n // Animations\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out\",\n \"nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0\",\n \"nd:data-[state=closed]:slide-out-to-bottom-2 nd:data-[state=open]:slide-in-from-bottom-2\",\n \"nd:md:data-[state=closed]:zoom-out-95 nd:md:data-[state=open]:zoom-in-95\",\n \"nd:md:data-[state=closed]:slide-out-to-bottom-0 nd:md:data-[state=open]:slide-in-from-bottom-0\",\n \"nd:duration-200\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog2-close\"\n className={cn(\n \"nd:absolute nd:top-3 nd:right-3 nd:z-10\",\n \"nd:flex nd:items-center nd:justify-center nd:size-8 nd:rounded-full\",\n \"nd:bg-muted/80 nd:hover:bg-muted nd:text-muted-foreground nd:hover:text-foreground\",\n \"nd:transition-colors nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-ring nd:focus:ring-offset-2\",\n \"nd:md:top-4 nd:md:right-4 nd:md:size-7 nd:md:rounded-md nd:md:bg-transparent\"\n )}\n >\n <X className=\"nd:size-4\" />\n <span className=\"nd:sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\n}\n\nfunction Dialog2Header({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-header\"\n className={cn(\n \"nd:flex nd:items-center nd:justify-between nd:shrink-0 nd:px-4 nd:h-14 nd:border-b nd:bg-background/95 nd:backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Body({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-body\"\n className={cn(\"nd:flex-1 nd:min-h-0 nd:overflow-hidden\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Footer({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog2-footer\"\n className={cn(\n \"nd:flex nd:items-center nd:justify-end nd:gap-2 nd:shrink-0 nd:px-4 nd:py-3 nd:border-t nd:bg-background/95 nd:backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction Dialog2Title({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog2-title\"\n className={cn(\"nd:text-base nd:font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction Dialog2Description({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog2-description\"\n className={cn(\"nd:text-sm nd:text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog2,\n Dialog2Close,\n Dialog2Content,\n Dialog2Body,\n Dialog2Description,\n Dialog2Footer,\n Dialog2Header,\n Dialog2Title,\n Dialog2Trigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"nd:fixed nd:inset-0 nd:z-50 nd:bg-black/80 nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd: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 \"nd:fixed nd:z-50 nd:gap-4 nd:bg-background nd:p-6 nd:shadow-lg nd:transition nd:ease-in-out nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:duration-300 nd:data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"nd:inset-x-0 nd:top-0 nd:border-b nd:data-[state=closed]:slide-out-to-top nd:data-[state=open]:slide-in-from-top\",\n bottom:\n \"nd:inset-x-0 nd:bottom-0 nd:border-t nd:data-[state=closed]:slide-out-to-bottom nd:data-[state=open]:slide-in-from-bottom\",\n left: \"nd:inset-y-0 nd:left-0 nd:h-full nd:w-3/4 nd:border-r nd:data-[state=closed]:slide-out-to-left nd:data-[state=open]:slide-in-from-left nd:sm:max-w-sm\",\n right:\n \"nd:inset-y-0 nd:right-0 nd:h-full nd:w-3/4 nd:border-l nd:data-[state=closed]:slide-out-to-right nd:data-[state=open]:slide-in-from-right nd:sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, hideCloseButton, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"nd:absolute nd:right-4 nd:top-4 nd:rounded-sm nd:opacity-70 nd:ring-offset-background nd:transition-opacity nd:hover:opacity-100 nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-ring nd:focus:ring-offset-2 nd:disabled:pointer-events-none nd:data-[state=open]:bg-secondary\">\n <X className=\"nd:h-4 nd:w-4\" />\n <span className=\"nd:sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"nd:flex nd:flex-col nd:space-y-2 nd:text-center nd: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 \"nd:flex nd:flex-col-reverse nd:sm:flex-row nd:sm:justify-end nd: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(\"nd:text-lg nd:font-semibold nd: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(\"nd:text-sm nd:text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:fixed nd:inset-0 nd:z-50 nd: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 \"nd:bg-background nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:fixed nd:top-[50%] nd:left-[50%] nd:z-50 nd:grid nd:w-full nd:max-w-[calc(100%-2rem)] nd:translate-x-[-50%] nd:translate-y-[-50%] nd:gap-4 nd:rounded-lg nd:border nd:p-6 nd:shadow-lg nd:duration-200 nd:sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"nd:ring-offset-background nd:focus:ring-ring nd:data-[state=open]:bg-accent nd:data-[state=open]:text-muted-foreground nd:absolute nd:top-4 nd:right-4 nd:rounded-xs nd:opacity-70 nd:transition-opacity nd:hover:opacity-100 nd:focus:ring-2 nd:focus:ring-offset-2 nd:focus:outline-hidden nd:disabled:pointer-events-none [&_svg]:nd:pointer-events-none [&_svg]:nd:shrink-0 [&_svg:not([class*='size-'])]:nd:size-4\"\n >\n <X className=\"nd:size-4\" />\n <span className=\"nd: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(\"nd:flex nd:flex-col nd:gap-2 nd:text-center nd: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 \"nd:flex nd:flex-col-reverse nd:gap-2 nd:sm:flex-row nd: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(\"nd:text-lg nd:leading-none nd: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(\"nd:text-muted-foreground nd:text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:data-[state=open]:bg-accent\",\n inset && \"nd:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"nd:ml-auto nd:h-4 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-lg nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n inset && \"nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"nd:h-4 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:transition-colors nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"nd:h-2 nd:w-2 nd: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 \"nd:px-2 nd:py-1.5 nd:text-sm nd:font-semibold\",\n inset && \"nd: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(\"-nd:mx-1 nd:my-1 nd:h-px nd: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(\"nd:ml-auto nd:text-xs nd:tracking-widest nd:opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/client/utils\"\n\nconst alertVariants = cva(\n \"nd:relative nd:w-full nd:rounded-lg nd:border nd:px-4 nd:py-3 nd:text-sm nd:grid nd:has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] nd:grid-cols-[0_1fr] nd:has-[>svg]:gap-x-3 nd:gap-y-0.5 nd:items-start nd:[&>svg]:size-4 nd:[&>svg]:translate-y-0.5 nd:[&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"nd:bg-card nd:text-card-foreground\",\n destructive:\n \"nd:text-destructive nd:bg-card nd:[&>svg]:text-current nd:*: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 \"nd:col-start-2 nd:line-clamp-1 nd:min-h-4 nd:font-medium nd: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 \"nd:text-muted-foreground nd:col-start-2 nd:grid nd:justify-items-start nd:gap-1 nd:text-sm nd:[&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from \"react\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:nd:text-foreground placeholder:nd:text-muted-foreground selection:nd:bg-primary selection:nd:text-primary-foreground nd:dark:bg-input/30 nd:border-input nd:h-9 nd:w-full nd:min-w-0 nd:rounded-md nd:border nd:bg-transparent nd:px-3 nd:py-1 nd:text-base nd:shadow-xs nd:transition-[color,box-shadow] nd:outline-none file:nd:inline-flex file:nd:h-7 file:nd:border-0 file:nd:bg-transparent file:nd:text-sm file:nd:font-medium nd:disabled:pointer-events-none nd:disabled:cursor-not-allowed nd:disabled:opacity-50 nd:md:text-sm\",\n \"nd:focus-visible:border-ring nd:focus-visible:ring-ring/50 nd:focus-visible:ring-[3px]\",\n \"aria-invalid:nd:ring-destructive/20 dark:aria-invalid:nd:ring-destructive/40 aria-invalid:nd: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 \"nd:flex nd:items-center nd:gap-2 nd:text-sm nd:leading-none nd:font-medium nd:select-none group-nd:data-[disabled=true]:pointer-events-none group-nd:data-[disabled=true]:opacity-50 peer-nd:disabled:cursor-not-allowed peer-nd:disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import { useEffect, useState } from 'react';\nimport { AlertCircle } from \"lucide-react\";\nimport { Alert, AlertDescription, AlertTitle } from \"./ui/alert\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\n// ** Define input type with required field\ntype TInputDefinition = {\n type: 'INPUT',\n id: string,\n name: string,\n default?: string,\n required?: boolean\n};\n\n// ** Helper type to extract input values based on input definitions\ntype TInputValues<T extends readonly TInputDefinition[]> = { [K in T[number]['id']]: string };\n\nexport const DialogConfirmation = <T extends readonly TInputDefinition[] | undefined = undefined>(\n props: Readonly<{\n title: string\n description: string\n open: boolean\n onClose: () => void\n inputs?: T\n onConfirm: T extends readonly TInputDefinition[]\n ? (inputs: Readonly<TInputValues<T>>) => Promise<[true] | [false, string]>\n : () => Promise<[true] | [false, string]>\n disableEscapeKeyDown?: boolean\n }>\n) => {\n // ** Deconstruct Props\n const { title, description, onConfirm, disableEscapeKeyDown, inputs, onClose, open } = props\n\n // ** State\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [inputsValue, setInputsValue] = useState<{ [key: string]: string }>(() =>\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n\n // ** Function\n const handleConfirm = async () => {\n setIsLoading(true);\n setError(null);\n try {\n // ** TypeScript cannot narrow generic callback type at runtime, cast required\n type TConfirmFn = (arg?: unknown) => Promise<[true] | [false, string]>;\n const confirmFn = onConfirm as TConfirmFn;\n const response = await (inputs ? confirmFn(inputsValue) : confirmFn());\n if (response[0]) {\n onClose();\n } else {\n setError(response[1]);\n }\n } catch (err) {\n setError(String(err));\n } finally {\n setIsLoading(false);\n }\n }\n\n const handleClose = () => {\n if (isLoading) return\n onClose()\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n }\n\n const handleKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && isFormValid()) {\n event.preventDefault()\n handleConfirm()\n }\n }\n\n const isFormValid = (): boolean => {\n if (!inputs) return true\n return inputs.every(input =>\n !input.required || (inputsValue[input.id] && inputsValue[input.id].trim() !== '')\n )\n }\n\n // ** Effect to reset input values when inputs change or dialog opens\n useEffect(() => {\n if (open) {\n setInputsValue(\n inputs?.reduce((acc, input) => ({\n ...acc, [input.id]: input.default ?? ''\n }), {}) ?? {}\n )\n setError(null)\n }\n }, [inputs, open])\n\n // ** Render\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (disableEscapeKeyDown) {\n e.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {inputs && inputs.length > 0 && (\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n {inputs.map((input, index) => (\n <div key={input.id} className=\"nd:grid nd:gap-2\">\n <Label htmlFor={input.id}>{input.name}</Label>\n <Input\n id={input.id}\n required={input.required}\n value={inputsValue[input.id] || ''}\n onChange={(e) =>\n setInputsValue({ ...inputsValue, [input.id]: e.target.value })\n }\n onKeyDown={index === inputs.length - 1 ? handleKeyPress : undefined}\n />\n </div>\n ))}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose} disabled={isLoading}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading || !isFormValid()}\n >\n Confirm\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype RenameAccountFormData = {\n name: string;\n};\n\ntype Account = {\n id: string;\n name: string;\n email: string;\n provider: 'GOOGLE';\n};\n\nexport const RenameAccountDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n account: Account | null;\n onConfirm: (account: Account, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, account, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameAccountFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or account changes\n useEffect(() => {\n if (open && account) {\n reset({ name: account.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById(\n 'rename-account-input'\n ) as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, account, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameAccountFormData) => {\n if (!account) return;\n\n try {\n await onConfirm(account, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename account:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename Account</DialogTitle>\n <DialogDescription>\n Enter a new display name for this storage account.\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"rename-account-input\">Account name</Label>\n <Input\n id=\"rename-account-input\"\n {...register('name', {\n required: 'Account name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Account name cannot be empty';\n if (trimmed.length > 255)\n return 'Account name is too long';\n return true;\n },\n })}\n placeholder=\"Enter account name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** Drive DnD Provider - Wraps PathBar and FileGrid for drag-drop between them\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useDrive } from '@/client/context';\nimport {\n DndContext,\n pointerWithin,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null\n});\n\nexport const useDriveDnd = () => useContext(DriveDndContext);\n\n// ** Provider Component\nexport const DriveDndProvider = (props: Readonly<{ children: React.ReactNode }>) => {\n // ** Deconstruct Props\n const { children } = props;\n\n const { items, setItems, sortBy, setSortBy, moveItem, callAPI, currentView } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n\n // ** DnD Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handlers\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n }, []);\n\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n\n const overId = over.id as string;\n\n // Check if hovering over a path item\n if (overId.startsWith('path-')) {\n setDragOverFolderId(overId);\n return;\n }\n\n // Check if hovering over a folder in the grid\n const overItem = items.find((i: { id: string }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n }, [items, draggingItemId]);\n\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) return;\n\n const overId = over.id as string;\n\n // Dropping on path bar item (e.g., \"path-root\" or \"path-abc123\")\n if (overId.startsWith('path-')) {\n const pathId = overId.slice(5); // Remove \"path-\" prefix\n const targetFolderId = pathId === 'root' || pathId === 'null' ? 'root' : pathId;\n await moveItem(active.id as string, targetFolderId);\n return;\n }\n\n // Dropping on a folder in the grid\n const overItem = items.find((i: { id: string; information: { type: string } }) => i.id === over.id);\n if (overItem?.information.type === 'FOLDER') {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Reordering items (optimistic)\n const oldIndex = items.findIndex((i: { id: string }) => i.id === active.id);\n const newIndex = items.findIndex((i: { id: string }) => i.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const reordered = arrayMove(items, oldIndex, newIndex);\n\n setItems(reordered);\n if (sortBy.field !== 'order') setSortBy({ field: 'order', order: 1 });\n\n // API call in background\n await callAPI('reorder', { method: 'POST', body: JSON.stringify({ ids: reordered.map((i: { id: string }) => i.id) }) });\n }, [items, setItems, sortBy, setSortBy, moveItem, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId }}>\n {enableDnd ? (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n ) : (\n children\n )}\n </DriveDndContext.Provider>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/client/utils\"\n\nfunction Progress({\n className,\n value,\n indicatorClassName,\n indeterminate = false,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & {\n indicatorClassName?: string;\n indeterminate?: boolean;\n}) {\n const isIndeterminate = indeterminate || value === undefined;\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"nd:bg-primary nd:h-full nd:flex-1 nd:transition-all\",\n isIndeterminate && \"nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]\",\n !isIndeterminate && \"nd:w-full\",\n indicatorClassName\n )}\n style={isIndeterminate ? undefined : { transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/client/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[state=open]:bg-accent nd:data-[state=open]:text-accent-foreground\",\n inset && \"nd:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"nd:ml-auto nd:h-4 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:z-50 nd:min-w-[8rem] nd:overflow-hidden nd:rounded-md nd:border nd:bg-popover nd:p-1 nd:text-popover-foreground nd:shadow-md nd:animate-in nd:fade-in-80 nd:data-[state=open]:animate-in nd:data-[state=closed]:animate-out nd:data-[state=closed]:fade-out-0 nd:data-[state=open]:fade-in-0 nd:data-[state=closed]:zoom-out-95 nd:data-[state=open]:zoom-in-95 nd:data-[side=bottom]:slide-in-from-top-2 nd:data-[side=left]:slide-in-from-right-2 nd:data-[side=right]:slide-in-from-left-2 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n inset && \"nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"nd:h-4 nd: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 \"nd:relative nd:flex nd:cursor-default nd:select-none nd:items-center nd:rounded-sm nd:px-2 nd:py-1.5 nd:text-sm nd:outline-none nd:focus:bg-accent nd:focus:text-accent-foreground nd:data-[disabled]:pointer-events-none nd:data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"nd:absolute nd:left-2 nd:flex nd:h-3.5 nd:w-3.5 nd:items-center nd:justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"nd:h-2 nd:w-2 nd: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 \"nd:px-2 nd:py-1.5 nd:text-sm nd:font-semibold nd:text-foreground\",\n inset && \"nd: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(\"-nd:mx-1 nd:my-1 nd:h-px nd: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 \"nd:ml-auto nd:text-xs nd:tracking-widest nd:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const CreateFolderDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n onConfirm: (name: string) => Promise<void>;\n}>) => {\n const { open, onClose, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<CreateFolderFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens\n useEffect(() => {\n if (open) {\n reset();\n // Focus input after a short delay to ensure dialog is rendered\n setTimeout(() => setFocus('name'), 100);\n }\n }, [open, reset, setFocus]);\n\n const handleFormSubmit = async (data: CreateFolderFormData) => {\n try {\n await onConfirm(data.name);\n reset();\n onClose();\n } catch (error) {\n // Error will be handled by parent component\n console.error('Failed to create folder:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Create New Folder</DialogTitle>\n <DialogDescription>\n Enter a name for the new folder\n </DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"folder-name\">Folder name</Label>\n <Input\n id=\"folder-name\"\n {...register('name', {\n required: 'Folder name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Folder name cannot be empty';\n if (trimmed.length > 255)\n return 'Folder name is too long';\n return true;\n },\n })}\n placeholder=\"Enter folder name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","'use client';\n\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '@/client/components/ui/alert';\nimport { Button } from '@/client/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/client/components/ui/dialog';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\nimport type { TDatabaseDrive } from '@/types/server';\n\ntype RenameFormData = {\n name: string;\n};\n\nexport const RenameDialog = (props: Readonly<{\n open: boolean;\n onClose: () => void;\n item: TDatabaseDrive | null;\n onConfirm: (id: string, newName: string) => Promise<void>;\n}>) => {\n const { open, onClose, item, onConfirm } = props;\n\n const {\n register,\n handleSubmit,\n reset,\n setFocus,\n formState: { errors, isSubmitting },\n } = useForm<RenameFormData>({\n defaultValues: {\n name: '',\n },\n });\n\n // Reset form when dialog opens or item changes\n useEffect(() => {\n if (open && item) {\n reset({ name: item.name });\n // Focus input and select text after a short delay\n setTimeout(() => {\n setFocus('name');\n // Select all text for easy replacement\n const input = document.getElementById('rename-input') as HTMLInputElement;\n if (input) {\n input.select();\n }\n }, 100);\n }\n }, [open, item, reset, setFocus]);\n\n const handleFormSubmit = async (data: RenameFormData) => {\n if (!item) return;\n\n try {\n await onConfirm(item.id, data.name);\n reset();\n onClose();\n } catch (error) {\n console.error('Failed to rename item:', error);\n }\n };\n\n const handleClose = () => {\n if (isSubmitting) return;\n reset();\n onClose();\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n handleClose();\n }\n };\n\n const itemType = item?.information.type === 'FOLDER' ? 'Folder' : 'File';\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n showCloseButton={false}\n onInteractOutside={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={(e) => {\n if (isSubmitting) {\n e.preventDefault();\n }\n }}\n >\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogHeader>\n <DialogTitle>Rename {itemType}</DialogTitle>\n <DialogDescription>Enter a new name for this {itemType.toLowerCase()}</DialogDescription>\n </DialogHeader>\n\n {errors.name && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"nd:h-4 nd:w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{errors.name.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"nd:grid nd:gap-4 nd:py-4\">\n <div className=\"nd:grid nd:gap-2\">\n <Label htmlFor=\"rename-input\">Name</Label>\n <Input\n id=\"rename-input\"\n {...register('name', {\n required: 'Name is required',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return 'Name cannot be empty';\n if (trimmed.length > 255) return 'Name is too long';\n return true;\n },\n })}\n placeholder=\"Enter name\"\n disabled={isSubmitting}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleClose}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Renaming...' : 'Rename'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n};\n","// ** DriveFileGrid Component - Pure file display (no chrome)\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useDriveDnd } from '@/client/components/drive/dnd-provider';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight, Pencil, Trash2 } from 'lucide-react';\nimport { Progress } from '@/client/components/ui/progress';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator\n} from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled });\n\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\n// ** File Item Component\nconst FileItem = (props: Readonly<{\n item: TDatabaseDrive;\n isSelected: boolean;\n isDragOver: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onDoubleClick: (e: React.MouseEvent) => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, onSelect, onDoubleClick, onRename, onDelete, onRestore } = props;\n\n const { apiEndpoint, viewMode, currentView } = useDrive();\n const isFolder = item.information.type === 'FOLDER';\n const tokenParam = item.token ? `&token=${item.token}` : '';\n const thumbnailUrl = `${apiEndpoint}?action=thumbnail&id=${item.id}&size=small${tokenParam}`;\n const isThumbnailable = !isFolder && item.information.type === 'FILE' && (\n item.information.mime.startsWith('image/') || item.information.mime.startsWith('video/')\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n className={cn(\n \"group nd:relative nd:cursor-pointer nd:transition-all nd:select-none\",\n \"nd:focus:outline-none nd:focus-visible:ring-2 nd:focus-visible:ring-primary\",\n viewMode === 'GRID'\n ? \"nd:flex nd:flex-col nd:rounded-lg nd:sm:rounded-xl nd:border nd:bg-card nd:dark:bg-card/50 nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:overflow-hidden\"\n : \"nd:flex nd:items-center nd:gap-2 nd:sm:gap-3 nd:p-1.5 nd:sm:p-2 nd:rounded-lg nd:border nd:border-transparent nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:hover:border-border\",\n isSelected && \"nd:ring-2 nd:ring-primary nd:border-primary/50 nd:bg-primary/5 nd:dark:bg-primary/10\",\n isDragOver && \"nd:ring-2 nd:ring-primary nd:border-primary nd:scale-[1.02] nd:bg-primary/10 nd:shadow-lg\"\n )}\n onClick={onSelect}\n onDoubleClick={onDoubleClick}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"nd:aspect-square nd:w-full nd:bg-muted/30 nd:dark:bg-muted/20 nd:flex nd:items-center nd:justify-center nd:overflow-hidden nd:relative\">\n {isThumbnailable ? (\n <img\n src={thumbnailUrl}\n alt={item.name}\n className=\"nd:size-full nd:object-cover nd:transition-transform group-nd:hover:scale-105 nd:duration-300\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"nd:transition-transform group-nd:hover:scale-110 nd:duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-8 nd:sm:size-10 nd:md:size-12 nd:text-muted-foreground/60\")}\n </div>\n )}\n {isSelected && (\n <div className=\"nd:absolute nd:top-1.5 nd:right-1.5 nd:sm:top-2 nd:sm:right-2 nd:size-5 nd:bg-primary nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md nd:animate-in nd:zoom-in-50\">\n <div className=\"nd:size-2 nd:bg-primary-foreground nd:rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"nd:absolute nd:bottom-1.5 nd:right-1.5 nd:sm:bottom-2 nd:sm:right-2 nd:lg:hidden nd:size-5 nd:sm:size-6 nd:bg-primary/90 nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md\">\n <ChevronRight className=\"nd:size-3 nd:sm:size-3.5 nd:text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"nd:p-1.5 nd:sm:p-2\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate nd:leading-tight\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"nd:size-10 nd:shrink-0 nd:rounded-lg nd:overflow-hidden nd:bg-muted/50 nd:dark:bg-muted/30 nd:flex nd:items-center nd:justify-center\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-cover\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-5 nd:text-muted-foreground\")\n )}\n </div>\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"nd:size-4 nd:text-muted-foreground nd:lg:hidden nd:shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={onRestore}>\n <RotateCcw className=\"nd:mr-2 nd:size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={onRename}>\n <Pencil className=\"nd:mr-2 nd:size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete\n </ContextMenuItem>\n </>\n )}\n </ContextMenuContent>\n </ContextMenu>\n );\n};\n\n// ** Main FileGrid Component\nexport const DriveFileGrid = (props: Readonly<{\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, selectableFolders = false, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state from shared context\n const { dragOverFolderId } = useDriveDnd();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({ newFolder: false, rename: false, delete: false });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n\n\n // ** Process Items\n const processedItems = useMemo(() => {\n let filtered = items;\n if (mimeFilter) {\n filtered = filtered.filter(item =>\n matchesMimeFilter(\n item.information.type === 'FILE' ? item.information.mime : '',\n item.information.type === 'FOLDER',\n mimeFilter\n )\n );\n }\n\n return [...filtered].sort((a, b) => {\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n if (sortBy.field === 'order') return 0;\n\n let valA: string | number;\n let valB: string | number;\n if (sortBy.field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (sortBy.field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else {\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n if (valA < valB) return -1 * sortBy.order;\n if (valA > valB) return 1 * sortBy.order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [], 'Yesterday': [], 'Earlier this Week': [], 'Last Week': [], 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n // Single tap/click on folder opens it, on file selects it\n // Double click also works for folders (desktop)\n const handleItemSelect = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n return;\n }\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n toggleSelection(item);\n onItemClick?.(item);\n };\n\n const toggleSelection = (item: TDatabaseDrive) => {\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n // ** Loading State (initial load - no items yet)\n if (isLoading && items.length === 0) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:flex-col\", className)}>\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:justify-center\">\n <Loader2 className=\"nd:size-8 nd:animate-spin nd:text-muted-foreground\" />\n </div>\n </div>\n );\n }\n\n // ** Error State\n if (error) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:items-center nd:justify-center nd:p-8\", className)}>\n <p className=\"nd:text-destructive nd:font-medium nd:text-center\">{error}</p>\n </div>\n );\n }\n\n // ** Empty State\n if (processedItems.length === 0) {\n return (\n <div className={cn(\"nd:flex-1 nd:flex nd:flex-col nd:items-center nd:justify-center nd:p-8 nd:text-center\", className)}>\n <div className=\"nd:size-16 nd:rounded-2xl nd:bg-muted/50 nd:dark:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:mb-4\">\n <Folder className=\"nd:size-8 nd:text-muted-foreground/60\" />\n </div>\n <p className=\"nd:text-sm nd:font-medium nd:text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'This folder is empty'}\n </p>\n </div>\n );\n }\n\n // ** Main Grid\n return (\n <>\n {/* Loading Progress Bar - shows when navigating/searching with existing items */}\n {isLoading && (\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n )}\n\n <div className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}>\n <div className=\"nd:space-y-4 nd:sm:space-y-6\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName}>\n {groupBy !== 'NONE' && (\n <h3 className=\"nd:text-xs nd:font-semibold nd:text-muted-foreground nd:uppercase nd:tracking-wide nd:mb-2 nd:sm:mb-3 nd:px-1\">\n {groupName} <span className=\"nd: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 ? \"nd:grid nd:grid-cols-3 nd:sm:grid-cols-4 nd:md:grid-cols-5 nd:lg:grid-cols-6 nd:xl:grid-cols-7 nd:gap-2 nd:sm:gap-3\"\n : \"nd:flex nd:flex-col nd:gap-1\"\n )}>\n {groupItems.map(item => (\n <SortableItem\n key={item.id}\n id={item.id}\n disabled={!enableDrag}\n isDragOverTarget={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n >\n <FileItem\n item={item}\n isSelected={selectedFileIds.includes(item.id)}\n isDragOver={item.information.type === 'FOLDER' && dragOverFolderId === item.id}\n onSelect={(e) => handleItemSelect(e, item)}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n onRename={() => { setItemToRename(item); setDialogs(prev => ({ ...prev, rename: true })); }}\n onDelete={() => { setItemToDelete(item); setDialogs(prev => ({ ...prev, delete: true })); }}\n onRestore={() => restoreItem(item.id)}\n />\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div ref={observerTarget} className=\"nd:flex nd:justify-center nd:py-6\">\n {isLoadingMore && <Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" />}\n </div>\n )}\n </div>\n\n {/* Dialogs */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => { setDialogs(prev => ({ ...prev, rename: false })); setItemToRename(null); }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => { setDialogs(prev => ({ ...prev, delete: false })); setItemToDelete(null); }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`}\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </>\n );\n};\n","// ** Drive Header\n'use client';\n\nimport React, { useState } from 'react';\nimport {\n Trash2, ArrowUpDown, LayoutGrid, List, Group, Calendar,\n ArrowDownAZ, ArrowUpAZ, ArrowDown01, ArrowUp01, Check, RotateCcw, Menu, FolderPlus,\n Search, X\n} from 'lucide-react';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger\n} from '@/client/components/ui/dropdown-menu';\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\n\nexport const DriveHeader = ({ className }: { className?: string }) => {\n const {\n viewMode, setViewMode, groupBy, setGroupBy, sortBy, setSortBy,\n selectedFileIds, setItems, setSelectedFileIds,\n currentView, setCurrentView, searchQuery, setSearchQuery,\n searchScope, setSearchScope, deleteItem, restoreItem, callAPI, createFolder\n } = useDrive();\n\n const [dialogs, setDialogs] = useState({ delete: false, emptyTrash: false, newFolder: false });\n\n return (\n <div className={cn(\"nd:flex nd:flex-wrap nd:items-center nd:gap-2 nd:bg-muted/30 nd:dark:bg-muted/20 nd:p-2\", className)}>\n {/* New Folder Button - Only in BROWSE view */}\n {currentView === 'BROWSE' && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"nd:gap-1.5\"\n onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}\n >\n <FolderPlus className=\"nd:size-4\" />\n <span className=\"nd:hidden nd:sm:inline\">New Folder</span>\n </Button>\n )}\n\n {/* Actions Dropdown - Only show if there are actions available */}\n {(selectedFileIds.length > 0 || currentView === 'TRASH') && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"nd:gap-1.5\"\n >\n <Menu className=\"nd:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {/* Restore (Contextual) */}\n {selectedFileIds.length > 0 && currentView === 'TRASH' && (\n <DropdownMenuItem\n onClick={async () => {\n for (const id of selectedFileIds) {\n await restoreItem(id);\n }\n setSelectedFileIds([]);\n }}\n >\n <RotateCcw className=\"nd:size-3.5 nd: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=\"nd:text-destructive nd:focus:text-destructive\"\n >\n <Trash2 className=\"nd:size-3.5 nd: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=\"nd:text-destructive nd:focus:text-destructive\"\n >\n <Trash2 className=\"nd:size-3.5 nd: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=\"nd:gap-1.5\"\n >\n <Group className=\"nd:size-3.5\" />\n <span className=\"nd:hidden nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(groupBy !== \"NONE\" && \"nd:pl-5.5\")}>\n No Grouping\n </span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setGroupBy(\"CREATED_AT\")}>\n {groupBy === \"CREATED_AT\" && <Check className=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(groupBy !== \"CREATED_AT\" && \"nd:pl-5.5\")}>\n Created Date\n </span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Search */}\n <div className=\"nd:flex-1 nd:min-w-0 nd:sm:min-w-50 nd:relative\">\n <Input\n type=\"text\"\n placeholder=\"Search files...\"\n className=\"nd:w-full nd:pl-8 nd:pr-7 nd: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=\"nd:absolute nd:left-2.5 nd:top-1/2 nd:-translate-y-1/2 nd:text-muted-foreground nd:pointer-events-none\">\n <Search className=\"nd:size-3.5\" />\n </div>\n {searchQuery && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"nd:absolute nd:right-0.5 nd:top-1/2 nd:-translate-y-1/2 nd:h-7 nd:w-7 nd:text-muted-foreground\"\n onClick={() => {\n setSearchQuery('');\n setCurrentView(searchScope === 'TRASH' ? 'TRASH' : 'BROWSE');\n }}\n >\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n\n {/* Sort Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:gap-1.5\">\n <ArrowUpDown className=\"nd:size-3.5\" />\n <span className=\"nd:hidden nd:sm:inline nd:max-w-24 nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(sortBy.field !== \"order\" && \"nd:pl-5.5\")}>Custom Order</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortBy({ field: \"id\", order: 1 })}>\n {sortBy.field === \"id\" && <Check className=\"nd:size-3.5 nd:mr-2\" />}\n <span className={cn(sortBy.field !== \"id\" && \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <Calendar className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"createdAt\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <Calendar className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"createdAt\" && sortBy.order === 1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowDownAZ className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"name\" && sortBy.order === 1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowUpAZ className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"name\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowDown01 className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"size\" && sortBy.order === -1 ? \"\" : \"nd: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=\"nd:size-3.5 nd:mr-2\" />}\n <ArrowUp01 className={cn(\"nd:size-3.5 nd:mr-2\", sortBy.field === \"size\" && sortBy.order === 1 ? \"\" : \"nd:ml-5.5\")} />\n Size: Small\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"nd:w-px nd:h-5 nd:bg-border\" />\n\n {/* View Toggles */}\n <div className=\"nd:flex nd:bg-muted/50 nd:dark:bg-muted/30 nd:rounded-md nd:p-0.5 nd:gap-0.5\">\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"nd:h-8 nd:w-8\",\n viewMode === \"GRID\" && \"nd:bg-background nd:shadow-sm nd:hover:bg-background nd:dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"GRID\")}\n aria-label=\"Grid View\"\n aria-pressed={viewMode === \"GRID\"}\n >\n <LayoutGrid className=\"nd:size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size=\"icon\"\n className={cn(\n \"nd:h-8 nd:w-8\",\n viewMode === \"LIST\" && \"nd:bg-background nd:shadow-sm nd:hover:bg-background nd:dark:bg-background/80\"\n )}\n onClick={() => setViewMode(\"LIST\")}\n aria-label=\"List View\"\n aria-pressed={viewMode === \"LIST\"}\n >\n <List className=\"nd:size-4\" />\n </Button>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => setDialogs(prev => ({ ...prev, delete: false }))}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete ${selectedFileIds.length} item(s). You cannot undo this action.`\n : `Are you sure you want to move ${selectedFileIds.length} item(s) to trash?`\n }\n onConfirm={async () => {\n if (selectedFileIds.length === 0) return [false, 'No files selected'];\n for (const id of selectedFileIds) {\n await deleteItem(id);\n }\n return [true];\n }}\n />\n\n {/* Empty Trash Confirmation Dialog */}\n <DialogConfirmation\n open={dialogs.emptyTrash}\n onClose={() => setDialogs(prev => ({ ...prev, emptyTrash: false }))}\n title=\"Empty Trash?\"\n description=\"All items in the trash will be permanently deleted. This action cannot be undone.\"\n onConfirm={async () => {\n await callAPI('emptyTrash', { method: 'POST' });\n setItems([]);\n return [true];\n }}\n />\n\n {/* New Folder Dialog */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n </div>\n );\n};\n\n// ** Content Progress Bar - Shows loading state at top of content area\nimport { Progress } from '@/client/components/ui/progress';\n\nexport const DriveContentProgress = () => {\n const { isLoading } = useDrive();\n\n if (!isLoading) return null;\n\n return (\n <div className=\"nd:h-1 nd:w-full nd:shrink-0\">\n <Progress\n indeterminate\n className=\"nd:h-full nd:rounded-none nd:bg-primary/10\"\n indicatorClassName=\"nd:bg-primary\"\n />\n </div>\n );\n};\n","// ** PathBar Component\n'use client';\n\nimport React from 'react';\nimport { useDrive } from '@/client/context';\nimport { useDroppable } from '@dnd-kit/core';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\n\n// ** Droppable Path Item\nconst DroppablePathItem = (props: Readonly<{\n id: string | null;\n name: string;\n isLast: boolean;\n onClick: () => void;\n}>) => {\n // ** Deconstruct Props\n const { id, name, isLast, onClick } = props;\n const { currentFolderId } = useDrive();\n const droppableId = `path-${id ?? 'root'}`;\n\n const { isOver, setNodeRef } = useDroppable({\n id: droppableId,\n data: { type: 'pathItem', folderId: id }\n });\n\n // Don't allow drop on current folder\n const isCurrentFolder = id === currentFolderId;\n\n if (isLast) {\n return (\n <span\n ref={setNodeRef}\n className={cn(\n \"nd:font-medium nd:text-foreground nd:px-1 nd:text-xs nd:sm:text-sm nd:truncate nd:max-w-30 nd:sm:max-w-none\",\n isOver && !isCurrentFolder && \"nd:bg-primary/20 nd: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 \"nd:h-6 nd:font-normal nd:text-xs nd:sm:text-sm nd:px-1.5 nd:sm:px-2 nd:truncate nd:max-w-25 nd:sm:max-w-37.5\",\n isOver && !isCurrentFolder && \"nd:ring-2 nd:ring-primary nd:bg-primary/10 nd:scale-105\"\n )}\n onClick={onClick}\n type=\"button\"\n title={name}\n >\n {name}\n </Button>\n );\n};\n\nexport const DrivePathBar = ({ className }: { className?: string }) => {\n const { path, navigateToFolder } = useDrive();\n\n return (\n <ol className={cn(\"nd:flex nd:items-center nd:gap-1 nd:sm:gap-1.5 nd:text-sm nd:text-muted-foreground nd:overflow-x-auto nd:flex-nowrap nd:min-w-0\", className)} aria-label=\"Breadcrumb\" role=\"navigation\">\n {path.map((item, index) => {\n const isLast = index === path.length - 1;\n return (\n <li key={item.id ?? 'root'} className=\"nd:flex nd:items-center nd:gap-1 nd:sm:gap-1.5 nd:shrink-0\">\n {index > 0 && <span className=\"nd:text-muted-foreground/50 nd:text-xs\" aria-hidden=\"true\">/</span>}\n <DroppablePathItem\n id={item.id}\n name={item.name}\n isLast={isLast}\n onClick={() => navigateToFolder(item)}\n />\n </li>\n );\n })}\n </ol>\n );\n};\n","// ** Upload Component\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/useUpload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock, RefreshCw, FileText } from 'lucide-react';\nimport { cn, matchesMimeFilter } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/client/components/ui/dialog';\nimport type { TDriveUploadState } from '@/types/client';\n\nconst UploadStatusIcon = (props: Readonly<{ status: TDriveUploadState['status'] }>) => {\n const { status } = props;\n\n switch (status) {\n case 'complete':\n return <CheckCircle2 className=\"nd:size-4 nd:text-emerald-500\" />;\n case 'error':\n return <AlertCircle className=\"nd:size-4 nd:text-destructive\" />;\n case 'cancelled':\n return <X className=\"nd:size-4 nd:text-muted-foreground\" />;\n case 'uploading':\n return <Loader2 className=\"nd:size-4 nd:text-primary nd:animate-spin\" />;\n default:\n return <Clock className=\"nd:size-4 nd:text-muted-foreground\" />;\n }\n};\n\nconst LogViewerDialog = (props: Readonly<{ upload: TDriveUploadState; open: boolean; onOpenChange: (open: boolean) => void }>) => {\n const { upload, open, onOpenChange } = props;\n const logs = upload.logs || [];\n\n const handleCopy = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n navigator.clipboard.writeText(logText);\n };\n\n const handleDownload = () => {\n const logText = logs.map(log => `[${new Date(log.timestamp).toLocaleTimeString()}] ${log.type.toUpperCase()}: ${log.message}`).join('\\n');\n const blob = new Blob([logText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${upload.name}-logs.txt`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"nd:sm:max-w-lg nd:p-0 nd:gap-0 nd:max-h-[85vh] nd:flex nd:flex-col\">\n <DialogHeader className=\"nd:px-4 nd:py-3 nd:border-b\">\n <DialogTitle className=\"nd:text-base nd:truncate\">{upload.name}</DialogTitle>\n </DialogHeader>\n <div className=\"nd:sticky nd:top-0 nd:z-10 nd:bg-background nd:px-4 nd:py-2 nd:border-b nd:flex nd:items-center nd:gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCopy}\n disabled={logs.length === 0}\n >\n Copy\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDownload}\n disabled={logs.length === 0}\n >\n Download\n </Button>\n </div>\n <div className=\"nd:flex-1 nd:overflow-y-auto nd:p-4 nd:space-y-2\">\n {logs.length === 0 && (\n <p className=\"nd:text-sm nd:text-muted-foreground nd:text-center nd:py-8\">No logs available</p>\n )}\n {logs.map((log, index) => (\n <div\n key={index}\n className={cn(\n \"nd:flex nd:items-start nd:gap-2 nd:p-2 nd:rounded-md nd:border nd:text-sm\",\n log.type === 'error' && \"nd:bg-destructive/5 nd:border-destructive/20\",\n log.type === 'warning' && \"nd:bg-yellow-500/5 nd:border-yellow-500/20\",\n log.type === 'success' && \"nd:bg-emerald-500/5 nd:border-emerald-500/20\",\n log.type === 'info' && \"nd:bg-muted/50 nd:border-border\"\n )}\n >\n <div className={cn(\n \"nd:shrink-0 nd:size-1.5 nd:rounded-full nd:mt-1.5\",\n log.type === 'error' && \"nd:bg-destructive\",\n log.type === 'warning' && \"nd:bg-yellow-500\",\n log.type === 'success' && \"nd:bg-emerald-500\",\n log.type === 'info' && \"nd:bg-muted-foreground\"\n )} />\n <div className=\"nd:flex-1 nd:min-w-0 nd:space-y-1\">\n <p className=\"nd:break-words nd:whitespace-pre-wrap\">{log.message}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </p>\n </div>\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const DriveUpload = (props: Readonly<{\n compact?: boolean;\n onComplete?: (item: unknown) => void;\n accept?: string;\n}>) => {\n // ** Deconstruct Props\n const { compact = false, onComplete, accept } = props;\n\n const [isDragging, setIsDragging] = useState(false);\n const [showUploadsDialog, setShowUploadsDialog] = useState(false);\n const [logViewerUpload, setLogViewerUpload] = useState<TDriveUploadState | null>(null);\n const [manuallyOpened, setManuallyOpened] = useState(false);\n const hasAutoClosedRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { currentFolderId, setItems, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {\n // Optimistically add the uploaded item to the items list\n if (uploadedItem) {\n setItems(prev => [uploadedItem as TDatabaseDrive, ...prev]);\n }\n onComplete?.(uploadedItem);\n });\n\n // Auto-hide dialog when all uploads are finished (only once, and not if manually opened)\n React.useEffect(() => {\n if (!showUploadsDialog || uploads.length === 0 || manuallyOpened || hasAutoClosedRef.current) return;\n\n const allFinished = uploads.every(u =>\n ['complete', 'error', 'cancelled'].includes(u.status)\n );\n\n if (allFinished) {\n const timer = setTimeout(() => {\n setShowUploadsDialog(false);\n hasAutoClosedRef.current = true;\n }, 2000);\n return () => clearTimeout(timer);\n }\n }, [uploads, showUploadsDialog, manuallyOpened]);\n\n // Filter files based on accept prop\n const filterFiles = useCallback((files: File[]): File[] => {\n if (!accept) return files;\n return files.filter(file => matchesMimeFilter(file.type, false, accept));\n }, [accept]);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files || files.length === 0) return;\n const filteredFiles = filterFiles(Array.from(files));\n if (filteredFiles.length === 0) return;\n uploadFiles(filteredFiles, currentFolderId);\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, filterFiles]);\n\n const handleDrag = useCallback((e: React.DragEvent, dragging: boolean) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(dragging);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(false); handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const hasUploadsInProgress = uploads.some(u => ['uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['uploading', 'queued', 'pending'].includes(u.status));\n\n const renderDialog = () => (\n <Dialog open={showUploadsDialog} onOpenChange={setShowUploadsDialog}>\n <DialogContent className=\"nd:sm:max-w-md nd:p-0 nd:gap-0\" showCloseButton={false}>\n <DialogHeader className=\"nd:px-4 nd:py-3 nd:border-b nd:flex-row nd:items-center nd:justify-between nd:space-y-0\">\n <DialogTitle className=\"nd:text-base\">Upload Status</DialogTitle>\n {hasUploadsInProgress && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"nd:text-destructive nd:hover:text-destructive\"\n onClick={cancelAllUploads}\n >\n Cancel All\n </Button>\n )}\n </DialogHeader>\n\n <div className=\"nd:divide-y nd:max-h-80 nd:overflow-y-auto\">\n {uploads.length === 0 && (\n <div className=\"nd:p-4 nd:text-center nd:text-sm nd: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=\"nd:px-4 nd:py-2.5\">\n <div className=\"nd:flex nd:items-start nd:gap-2 nd:mb-1.5\">\n <UploadStatusIcon status={upload.status} />\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\">{upload.name}</p>\n <p className={cn(\n \"nd:text-xs nd:break-words\",\n upload.status === 'error' ? \"nd:text-destructive\" : \"nd:text-muted-foreground\"\n )}>\n {upload.status === 'uploading' && 'Uploading...'}\n {upload.status === 'queued' && 'Waiting in queue'}\n {upload.status === 'pending' && 'Preparing...'}\n {upload.status === 'complete' && 'Upload complete'}\n {upload.status === 'error' && (upload.error || 'Upload failed')}\n {upload.status === 'cancelled' && 'Upload cancelled'}\n </p>\n </div>\n <div className=\"nd:flex nd:items-center nd:gap-1 nd:shrink-0\">\n {(upload.logs && upload.logs.length > 0) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"nd:text-muted-foreground nd:hover:text-foreground\"\n onClick={() => setLogViewerUpload(upload)}\n title=\"View logs\"\n >\n <FileText className=\"nd:size-3.5\" />\n </Button>\n )}\n {['uploading', 'queued', 'pending'].includes(upload.status) && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"nd:text-muted-foreground nd:hover:text-destructive\"\n onClick={() => cancelUpload(upload.id)}\n title=\"Cancel\"\n >\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n {upload.status === 'uploading' && (\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:pl-6\">\n <Progress value={percent} className=\"nd:flex-1\" />\n <span className=\"nd:text-xs nd:tabular-nums nd:text-muted-foreground nd:w-8\">\n {percent}%\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </DialogContent>\n </Dialog>\n );\n\n if (compact) {\n return (\n <>\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n <div className=\"nd:flex nd:items-center nd:gap-2\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"nd:hidden\"\n aria-hidden=\"true\"\n />\n {activeAccountId && (\n <Button\n onClick={() => fetchItems()}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLoading}\n title=\"Refresh\"\n >\n <RefreshCw className={cn(\"nd:size-4 nd:shrink-0\", isLoading && \"nd:animate-spin\")} />\n </Button>\n )}\n <Button\n onClick={() => inputRef.current?.click()}\n type=\"button\"\n size=\"sm\"\n disabled={hasUploadsInProgress}\n >\n <UploadIcon className=\"nd:size-4 nd:shrink-0\" />\n <span>Upload</span>\n </Button>\n\n {uploads.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}\n >\n {activeUploads.length > 0 ? (\n <Loader2 className=\"nd:size-4 nd:shrink-0 nd:animate-spin\" />\n ) : (\n <CheckCircle2 className=\"nd:size-4 nd:shrink-0\" />\n )}\n <span>\n {activeUploads.length > 0\n ? `(${activeUploads.length})`\n : 'Status'\n }\n </span>\n </Button>\n )}\n </div>\n {renderDialog()}\n </>\n );\n }\n\n return (\n <div className=\"nd:w-full\">\n <div\n className={cn(\n \"nd:flex nd:flex-col nd:items-center nd:justify-center nd:p-8 nd:border-2 nd:border-dashed nd:rounded-lg nd:cursor-pointer nd:transition-colors\",\n isDragging ? \"nd:border-primary nd:bg-primary/5\" : \"nd:border-muted-foreground/25 nd:hover:border-primary/50 nd:hover:bg-muted/50\"\n )}\n onDragEnter={(e) => handleDrag(e, true)} onDragLeave={(e) => handleDrag(e, false)} onDragOver={(e) => handleDrag(e, true)} onDrop={handleDrop}\n onClick={() => inputRef.current?.click()} role=\"button\" tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n className=\"nd:hidden\"\n aria-hidden=\"true\"\n />\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-2 nd:text-center\">\n <div className=\"nd:p-3 nd:rounded-full nd:bg-background nd:border nd:shadow-sm\">\n <UploadIcon className=\"nd:size-6 nd:text-muted-foreground\" />\n </div>\n <div className=\"nd:text-sm nd:font-medium nd: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=\"nd:mt-4 nd:text-center\">\n <Button variant=\"link\" onClick={() => { setManuallyOpened(true); setShowUploadsDialog(true); }}>View Upload Progress</Button>\n </div>\n )}\n {renderDialog()}\n {logViewerUpload && (\n <LogViewerDialog\n upload={logViewerUpload}\n open={!!logViewerUpload}\n onOpenChange={(open) => !open && setLogViewerUpload(null)}\n />\n )}\n </div>\n );\n};\n","// ** DriveStorageIndicator Component\n'use client';\n\nimport React, { useEffect } from 'react';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, cn } from '@/client/utils';\nimport { Progress } from '@/client/components/ui/progress';\nimport { Cloud, AlertCircle } from 'lucide-react';\n\nexport const DriveStorageIndicator = (props: Readonly<{ compact?: boolean; className?: string }>) => {\n // ** Deconstruct Props\n const { compact = false, className } = props;\n\n const { quota, refreshQuota } = useDrive();\n\n useEffect(() => { refreshQuota(); }, []);\n\n if (!quota) return null;\n const { usedInBytes, totalInBytes, percentage } = quota;\n\n const isNearFull = percentage >= 90;\n const isFull = percentage >= 100;\n\n const stateColor = isFull ? \"nd:text-destructive\" : isNearFull ? \"nd:text-yellow-600 nd:dark:text-yellow-500\" : \"nd:text-primary\";\n const solidColor = isFull ? \"nd:bg-destructive\" : isNearFull ? \"nd:bg-yellow-500\" : \"nd:bg-primary\";\n\n if (compact) {\n return (\n <div className={cn(\"nd:flex nd:items-center nd:gap-3 nd:text-xs nd:font-medium nd:text-muted-foreground\", className)}>\n <span className=\"nd:shrink-0 nd:flex nd:items-center nd:gap-1.5\">\n <Cloud className=\"nd:size-3.5\" />\n Storage\n </span>\n <Progress value={percentage} indicatorClassName={cn(\"nd:bg-gradient-to-r nd:from-blue-500 nd:to-cyan-500\", isNearFull && \"nd:from-yellow-500 nd:to-orange-500\", isFull && \"nd:bg-destructive\")} className=\"nd:w-24 nd:sm:w-32\" />\n <span className=\"nd:shrink-0 nd:whitespace-nowrap\">{formatBytes(usedInBytes)} / {formatBytes(totalInBytes)}</span>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"nd:flex nd:items-center nd:justify-between nd:gap-2 nd:mb-2\">\n <div className=\"nd:flex nd:items-center nd:gap-2\">\n <Cloud className={cn(\"nd:size-4\", stateColor)} />\n <span className=\"nd:text-xs nd:font-medium nd:text-muted-foreground\">Storage</span>\n </div>\n <span className=\"nd:text-xs nd:font-semibold nd:tabular-nums\">\n {percentage}%\n </span>\n </div>\n\n <Progress\n value={percentage}\n className=\"nd:h-1.5\"\n indicatorClassName={cn(\n \"nd:transition-all nd:duration-500\",\n isFull ? \"nd:bg-destructive\" : isNearFull ? \"nd:bg-yellow-500\" : \"nd:bg-gradient-to-r nd:from-blue-500 nd:to-purple-500\"\n )}\n />\n\n <div className=\"nd:flex nd:justify-between nd:items-center nd:mt-1.5\">\n <span className=\"nd:text-[10px] nd:text-muted-foreground nd:tabular-nums\">\n {formatBytes(usedInBytes)}\n </span>\n <span className=\"nd:text-[10px] nd:text-muted-foreground nd:tabular-nums\">\n {formatBytes(totalInBytes)}\n </span>\n </div>\n\n {isNearFull && (\n <div className={cn(\n \"nd:flex nd:items-center nd:gap-1.5 nd:text-[10px] nd:font-medium nd:px-2 nd:py-1 nd:rounded-md nd:mt-2\",\n isFull ? \"nd:bg-destructive/10 nd:text-destructive\" : \"nd:bg-yellow-500/10 nd:text-yellow-600 nd:dark:text-yellow-500\"\n )}>\n <AlertCircle className=\"nd:size-3 nd:shrink-0\" />\n <span>{isFull ? \"Storage full\" : \"Almost full\"}</span>\n </div>\n )}\n </>\n );\n};\n","// ** Drive File Chooser Component - Completely Redesigned\n'use client';\n\nimport React, { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { cn, getFileIcon } from '@/client/utils';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/dialog-fullscreen';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd-provider';\nimport { DriveHeader } from '@/client/components/drive/header';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Icons\nimport {\n Upload as UploadIcon, X, Menu, FolderOpen, Trash2,\n Database, HardDrive, ChevronsUpDown, Check, Plus, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\n\n// ============================================================================\n// INLINE SIDEBAR - Simplified for the chooser context\n// ============================================================================\nconst ChooserSidebar = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({ open: false, account: null });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', { method: 'PATCH', query: { id: account.id }, body: JSON.stringify({ name: newName.trim() }) });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', ml);\n window.removeEventListener('storage', sl);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const ml = (e: MessageEvent) => { if (e.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n const sl = (e: StorageEvent) => { if (e.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); } };\n window.addEventListener('message', ml);\n window.addEventListener('storage', sl);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"nd:flex nd:flex-col nd:h-full nd:w-full nd:bg-muted/5 nd:dark:bg-muted/10\">\n {/* Account Switcher */}\n <div className=\"nd:p-2 nd:border-b nd:border-border/50\">\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:gap-2 nd:px-2 nd:h-11 nd:min-w-0\">\n <div className=\"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0 nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\">\n <HardDrive className=\"nd:size-3.5\" />\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">Local Storage</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"nd:flex-1 nd:min-w-0 nd:justify-between nd:px-2 nd:h-11 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:text-left nd:min-w-0 nd:flex-1\">\n <div className={cn(\n \"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n activeAccountId ? \"nd:bg-blue-500/10 nd:text-blue-600 nd:dark:bg-blue-500/20 nd:dark:text-blue-400\" : \"nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"nd:size-3.5\" /> : <HardDrive className=\"nd:size-3.5\" />}\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">{currentAccountName}</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"nd:size-3.5 nd:text-muted-foreground/60 nd:shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"nd:w-56\" align=\"start\">\n <DropdownMenuLabel className=\"nd:text-[11px] nd:font-medium nd:text-muted-foreground nd:uppercase nd:tracking-wide\">Storage</DropdownMenuLabel>\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"nd:gap-2 nd:py-2\">\n <span className=\"nd:flex-1 nd:text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n {accounts.length > 0 && <DropdownMenuSeparator />}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"nd:gap-2 nd:py-2\"\n >\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{account.name}</p>\n <p className=\"nd:text-[10px] nd:text-muted-foreground nd:truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n ))}\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"nd:gap-2\"><Plus className=\"nd:size-3.5\" /><span className=\"nd:text-sm\">Add Account</span></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>Google Drive</DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9 nd:shrink-0 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <Settings2 className=\"nd:size-4 nd:text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"nd:w-40\">\n <DropdownMenuLabel className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => { setRenameDialog({ open: true, account: currentAccount }); }}>\n <Pencil className=\"nd:size-3.5 nd:mr-2\" /> Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"nd:size-3.5 nd:mr-2\" /> Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => setDeleteDialog({ open: true, account: currentAccount })}>\n <Trash className=\"nd:size-3.5 nd:mr-2\" /> Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"nd:flex-1 nd:p-2 nd:space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\", currentView !== 'TRASH' ? \"nd:bg-primary/10 nd:text-primary nd:hover:bg-primary/15\" : \"nd:hover:bg-muted/50\")}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"nd:size-4\" /> My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\", currentView === 'TRASH' ? \"nd:bg-destructive/10 nd:text-destructive nd:hover:bg-destructive/15\" : \"nd:hover:bg-muted/50\")}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"nd:size-4\" /> Trash\n </Button>\n </nav>\n\n {/* Storage */}\n <div className=\"nd:p-2.5 nd:border-t nd:border-border/50 nd:bg-background/50 nd:dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Dialogs */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"nd:sm:max-w-xs\" showCloseButton={false}>\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-4 nd:py-4\">\n <Loader2 className=\"nd:size-8 nd:text-primary nd:animate-spin\" />\n <div className=\"nd:text-center\">\n <DialogTitle className=\"nd:text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"nd:text-sm nd:mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ============================================================================\n// MOBILE SIDEBAR SHEET\n// ============================================================================\nconst MobileSidebarSheet = () => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9 nd:md:hidden nd:shrink-0\">\n <Menu className=\"nd:size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"nd:w-72 nd:p-0\" hideCloseButton>\n <SheetTitle className=\"nd:sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"nd:sr-only\">Storage and navigation</SheetDescription>\n <ChooserSidebar onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n );\n};\n\n// ============================================================================\n// MAIN FILE CHOOSER COMPONENT\n// ============================================================================\nexport const DriveFileChooser = (props: Readonly<{\n value: TDriveFile | TDriveFile[] | null;\n onChange: (files: TDriveFile | TDriveFile[] | null) => void;\n multiple?: boolean;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n}>) => {\n // ** Deconstruct Props\n const {\n value, onChange, multiple = false, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText\n } = props;\n\n const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();\n const [isOpen, setIsOpen] = useState(false);\n\n // Sync selection on open and trigger fetch\n useEffect(() => {\n if (isOpen) {\n // Trigger API fetch when dialog opens (for lazy mode)\n triggerFetch();\n\n if (!value) setSelectedFileIds([]);\n else if (Array.isArray(value)) setSelectedFileIds(value.map(f => f.id));\n else setSelectedFileIds([value.id]);\n }\n }, [isOpen, value, setSelectedFileIds, triggerFetch]);\n\n const handleConfirm = useCallback(() => {\n const selectedItems = items.filter(item => selectedFileIds.includes(item.id));\n const files: TDriveFile[] = selectedItems.map(item => ({\n id: item.id,\n file: {\n name: item.name,\n mime: item.information.type === 'FILE' ? item.information.mime : '',\n size: item.information.type === 'FILE' ? item.information.sizeInBytes : 0\n }\n }));\n onChange(multiple ? files : files[0] || null);\n setIsOpen(false);\n }, [items, selectedFileIds, multiple, onChange]);\n\n const handleRemove = useCallback((idToRemove: string) => {\n if (multiple && Array.isArray(value)) onChange(value.filter(f => f.id !== idToRemove));\n else onChange(null);\n }, [multiple, value, onChange]);\n\n const hasSelection = value && (Array.isArray(value) ? value.length > 0 : true);\n const displayFiles = useMemo(() => !value ? [] : Array.isArray(value) ? value : [value], [value]);\n\n return (\n <div className={cn(\"nd:w-full\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n className={cn(\n \"nd:w-full nd:h-auto nd:justify-start nd:gap-3 nd:px-3 nd:py-2.5 nd:border-dashed\",\n error && \"nd:border-destructive\"\n )}\n >\n <div className={cn(\n \"nd:size-9 nd:rounded-lg nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n error ? \"nd:bg-destructive/10 nd:text-destructive\" : \"nd:bg-muted/50 nd:text-muted-foreground\"\n )}>\n <UploadIcon className=\"nd:size-4\" />\n </div>\n <div className=\"nd:flex-1 nd:min-w-0 nd:text-left\">\n <p className={cn(\"nd:text-sm nd:font-medium\", error && \"nd:text-destructive\")}>\n {multiple ? \"Select files\" : \"Select a file\"}\n </p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:font-normal nd:truncate\">{placeholder}</p>\n </div>\n </Button>\n ) : (\n /* Selected Files Display */\n <div className={cn(\"nd:rounded-lg nd:border\", error ? \"nd:border-destructive\" : \"nd:border-border\", disabled && \"nd:opacity-50\")}>\n {!multiple && displayFiles[0] && (\n <div className=\"nd:flex nd:items-center nd:gap-3 nd:p-2.5\">\n <div className=\"nd:size-12 nd:rounded-lg nd:overflow-hidden nd:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:shrink-0\">\n {displayFiles[0].file.mime.startsWith('image/') ? (\n <img src={createUrl(displayFiles[0])} alt={displayFiles[0].file.name} className=\"nd:size-full nd:object-cover\" />\n ) : (\n getFileIcon(displayFiles[0].file.mime, false, \"nd:size-6 nd:text-muted-foreground\")\n )}\n </div>\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\">{displayFiles[0].file.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground\">{displayFiles[0].file.mime || 'File'}</p>\n </div>\n <div className=\"nd:flex nd:items-center nd:gap-1 nd:shrink-0\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsOpen(true)} disabled={disabled}>Change</Button>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-8\" onClick={() => handleRemove(displayFiles[0].id)}>\n <X className=\"nd:size-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {multiple && (\n <>\n <div className=\"nd:flex nd:items-center nd:justify-between nd:px-3 nd:py-2 nd:border-b nd:bg-muted/20\">\n <span className=\"nd:text-xs nd:text-muted-foreground nd:font-medium\">{displayFiles.length} file{displayFiles.length !== 1 ? 's' : ''} selected</span>\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:h-7 nd:text-xs\" onClick={() => setIsOpen(true)} disabled={disabled}>Add more</Button>\n {!disabled && <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"nd:h-7 nd:text-xs nd:text-muted-foreground\" onClick={() => onChange([])}>Clear</Button>}\n </div>\n </div>\n <div className=\"nd:max-h-40 nd:overflow-y-auto nd:divide-y nd:divide-border/50\">\n {displayFiles.map((file) => (\n <div key={file.id} className=\"nd:flex nd:items-center nd:gap-2.5 nd:px-3 nd:py-2 nd:hover:bg-muted/20\">\n <div className=\"nd:size-8 nd:rounded nd:overflow-hidden nd:bg-muted/30 nd:flex nd:items-center nd:justify-center nd:shrink-0\">\n {file.file.mime.startsWith('image/') ? (\n <img src={createUrl(file)} alt={file.file.name} className=\"nd:size-full nd:object-cover\" />\n ) : (\n getFileIcon(file.file.mime, false, \"nd:size-4 nd:text-muted-foreground\")\n )}\n </div>\n <span className=\"nd:flex-1 nd:text-sm nd:truncate\">{file.file.name}</span>\n {!disabled && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-7 nd:shrink-0\" onClick={() => handleRemove(file.id)}>\n <X className=\"nd:size-3.5\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {error && helperText && <p className=\"nd:text-xs nd:text-destructive nd:mt-1.5\">{helperText}</p>}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content showCloseButton={false} className=\"nd-drive-root\">\n {/* Header */}\n <Dialog2Header className=\"nd:gap-2\">\n <MobileSidebarSheet />\n <Dialog2Title className=\"nd:flex-1\">Select {multiple ? 'Files' : 'File'}</Dialog2Title>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"nd:size-8\" onClick={() => setIsOpen(false)}>\n <X className=\"nd:size-4\" />\n </Button>\n </Dialog2Header>\n\n {/* Body */}\n <Dialog2Body className=\"nd:flex nd:flex-col nd:md:flex-row\">\n {/* Sidebar - Desktop */}\n <div className=\"nd:hidden nd:md:flex nd:w-52 nd:lg:w-56 nd:border-r nd:shrink-0\">\n <ChooserSidebar />\n </div>\n\n {/* Main Content */}\n <DriveDndProvider>\n <div className=\"nd:flex-1 nd:flex nd:flex-col nd:min-w-0 nd:min-h-0\">\n <DriveHeader className=\"nd:border-b\" />\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:px-3 nd:py-2 nd:border-b nd:bg-muted/20 nd:dark:bg-muted/10\">\n <DrivePathBar className=\"nd:flex-1\" />\n <DriveUpload compact accept={accept} />\n </div>\n <DriveFileGrid mimeFilter={accept} className=\"nd:flex-1\" />\n </div>\n </DriveDndProvider>\n </Dialog2Body>\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectedFileIds.length === 0}>\n Select{selectedFileIds.length > 0 ? ` (${selectedFileIds.length})` : ''}\n </Button>\n </Dialog2Footer>\n </Dialog2Content>\n </Dialog2>\n </div>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useDrive } from '@/client/context';\nimport { cn } from '@/client/utils';\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport {\n Database, HardDrive, Plus, Check,\n ChevronsUpDown, FolderOpen, Trash2, Menu, Settings2, Pencil, Trash, Loader2, RefreshCw\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"@/client/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetDescription,\n} from \"@/client/components/ui/sheet\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/client/components/ui/dialog\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { RenameAccountDialog } from '@/client/components/drive/RenameAccountDialog';\nimport { DriveStorageIndicator } from '@/client/components/drive/storage/indicator';\n\n// ** Sidebar Content Component (reusable for both desktop and mobile)\nconst SidebarContent = (props: Readonly<{ onNavigate?: () => void }>) => {\n // ** Deconstruct Props\n const { onNavigate } = props;\n\n const {\n accounts, activeAccountId, setActiveAccountId,\n callAPI, refreshAccounts, currentView, setCurrentView, availableProviders\n } = useDrive();\n\n // Dialog states for account management\n const [renameDialog, setRenameDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [deleteDialog, setDeleteDialog] = useState<{ open: boolean; account: typeof accounts[0] | null }>({\n open: false, account: null\n });\n const [oauthLoading, setOauthLoading] = useState(false);\n const [oauthAbort, setOauthAbort] = useState<AbortController | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n const currentAccount = activeAccountId ? accounts.find(a => a.id === activeAccountId) : null;\n const currentAccountName = currentAccount?.name || 'Local Storage';\n const currentAccountEmail = currentAccount?.email || 'On this device';\n\n // Check if any provider is available\n const hasAnyProvider = availableProviders.google;\n // Disable dropdown if no accounts and no providers available\n const isDropdownDisabled = accounts.length === 0 && !hasAnyProvider;\n\n const handleRename = async (account: typeof accounts[0], newName: string) => {\n if (!account || !newName.trim()) return;\n await callAPI('renameAccount', {\n method: 'PATCH',\n query: { id: account.id },\n body: JSON.stringify({ name: newName.trim() })\n });\n await refreshAccounts();\n setRenameDialog({ open: false, account: null });\n };\n\n const handleDelete = async (): Promise<[true] | [false, string]> => {\n if (!deleteDialog.account) return [false, 'No account selected'];\n await callAPI('removeAccount', { query: { id: deleteDialog.account.id } });\n await refreshAccounts();\n if (activeAccountId === deleteDialog.account.id) setActiveAccountId(null);\n setDeleteDialog({ open: false, account: null });\n return [true];\n };\n\n const openOAuthPopup = () => {\n // Open popup immediately (synchronously) to avoid popup blocker\n const width = 600, height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n const popup = window.open('about:blank', 'Connect to Google Drive', `width=${width},height=${height},top=${top},left=${left}`);\n\n if (!popup) {\n alert('Popup blocked. Please allow popups for this site.');\n return;\n }\n\n // Show loading dialog\n const controller = new AbortController();\n setOauthAbort(controller);\n setOauthLoading(true);\n\n // Fetch auth URL and redirect popup\n (async () => {\n try {\n const res = await callAPI<{ url: string }>('getAuthUrl', { query: { provider: 'GOOGLE' } });\n\n if (controller.signal.aborted) {\n popup.close();\n return;\n }\n\n if (res.status !== 200 || !res.data?.url) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert(res.message || 'Failed to initialize account connection');\n return;\n }\n\n // Redirect popup to auth URL\n popup.location.href = res.data.url;\n\n // Listen for OAuth success\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n window.removeEventListener('storage', storageListener);\n setOauthLoading(false);\n setOauthAbort(null);\n };\n const messageListener = (event: MessageEvent) => {\n if (event.data === 'oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n const storageListener = (event: StorageEvent) => {\n if (event.key === 'next-drive-oauth-success') { cleanup(); refreshAccounts(); setDropdownOpen(true); }\n };\n window.addEventListener('message', messageListener);\n window.addEventListener('storage', storageListener);\n\n // Also close loading if popup is closed manually\n const checkPopupClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkPopupClosed);\n cleanup();\n }\n }, 500);\n } catch (err) {\n popup.close();\n setOauthLoading(false);\n setOauthAbort(null);\n alert('Failed to connect. Please try again.');\n }\n })();\n };\n\n const cancelOAuth = () => {\n oauthAbort?.abort();\n setOauthLoading(false);\n setOauthAbort(null);\n };\n\n return (\n <div className=\"nd:w-full nd:h-full nd:flex nd:flex-col nd:bg-muted/5 nd:dark:bg-muted/10\">\n {/* Account Switcher - Compact */}\n <div className=\"nd:p-2 nd:border-b nd:border-border/50\">\n <div className=\"nd:flex nd:items-center nd:gap-1\">\n {isDropdownDisabled ? (\n /* Static display when no accounts and no providers */\n <div className=\"nd:flex-1 nd:flex nd:items-center nd:gap-2.5 nd:px-2 nd:h-11 nd:min-w-0\">\n <div className=\"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0 nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\">\n <HardDrive className=\"nd:size-3.5\" />\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">Local Storage</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">On this device</span>\n </div>\n </div>\n ) : (\n <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"nd:flex-1 nd:min-w-0 nd:justify-between nd:px-2 nd:h-11 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\">\n <div className=\"nd:flex nd:items-center nd:gap-2.5 nd:text-left nd:min-w-0 nd:flex-1\">\n <div className={cn(\n \"nd:size-7 nd:rounded-md nd:flex nd:items-center nd:justify-center nd:shrink-0\",\n activeAccountId\n ? \"nd:bg-blue-500/10 nd:text-blue-600 nd:dark:bg-blue-500/20 nd:dark:text-blue-400\"\n : \"nd:bg-emerald-500/10 nd:text-emerald-600 nd:dark:bg-emerald-500/20 nd:dark:text-emerald-400\"\n )}>\n {activeAccountId ? <Database className=\"nd:size-3.5\" /> : <HardDrive className=\"nd:size-3.5\" />}\n </div>\n <div className=\"nd:flex nd:flex-col nd:min-w-0\">\n <span className=\"nd:text-sm nd:font-medium nd:truncate\">{currentAccountName}</span>\n <span className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">{currentAccountEmail}</span>\n </div>\n </div>\n <ChevronsUpDown className=\"nd:size-3.5 nd:text-muted-foreground/60 nd:shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"nd:w-56\" align=\"start\">\n <DropdownMenuLabel className=\"nd:text-[11px] nd:font-medium nd:text-muted-foreground nd:uppercase nd:tracking-wide\">\n Storage\n </DropdownMenuLabel>\n\n {/* Local Storage */}\n <DropdownMenuItem onClick={() => { setActiveAccountId(null); setCurrentView('BROWSE'); onNavigate?.(); }} className=\"nd:gap-2 nd:py-2\">\n <span className=\"nd:flex-1 nd:text-sm\">Local Storage</span>\n {activeAccountId === null && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n\n {accounts.length > 0 && <DropdownMenuSeparator />}\n\n {/* Connected Accounts */}\n {accounts.map(account => (\n <DropdownMenuItem\n key={account.id}\n onClick={() => { setActiveAccountId(account.id); setCurrentView('BROWSE'); onNavigate?.(); }}\n className=\"nd:gap-2 nd:py-2\"\n >\n <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{account.name}</p>\n <p className=\"nd:text-[10px] nd:text-muted-foreground nd:truncate\">{account.email}</p>\n </div>\n {activeAccountId === account.id && <Check className=\"nd:size-3.5 nd:text-primary\" />}\n </DropdownMenuItem>\n ))}\n\n {/* Add Account - only show if any provider is available */}\n {hasAnyProvider && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"nd:gap-2\">\n <Plus className=\"nd:size-3.5\" />\n <span className=\"nd:text-sm\">Add Account</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {availableProviders.google && (\n <DropdownMenuItem onClick={openOAuthPopup}>\n Google Drive\n </DropdownMenuItem>\n )}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings button - only for connected accounts */}\n {currentAccount && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"nd:size-9 nd:shrink-0 nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n >\n <Settings2 className=\"nd:size-4 nd:text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"nd:w-40\">\n <DropdownMenuLabel className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {currentAccount.name}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => {\n setRenameDialog({ open: true, account: currentAccount });\n }}>\n <Pencil className=\"nd:size-3.5 nd:mr-2\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openOAuthPopup}>\n <RefreshCw className=\"nd:size-3.5 nd:mr-2\" />\n Reconnect\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"nd:text-destructive nd:focus:text-destructive\"\n onClick={() => setDeleteDialog({ open: true, account: currentAccount })}\n >\n <Trash className=\"nd:size-3.5 nd:mr-2\" />\n Disconnect\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"nd:flex-1 nd:p-2 nd:space-y-0.5\">\n <Button\n variant=\"ghost\"\n className={cn(\n \"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\",\n currentView !== 'TRASH'\n ? \"nd:bg-primary/10 nd:text-primary nd:hover:bg-primary/15 nd:dark:bg-primary/15 nd:dark:hover:bg-primary/20\"\n : \"nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('BROWSE'); onNavigate?.(); }}\n >\n <FolderOpen className=\"nd:size-4\" />\n My Files\n </Button>\n <Button\n variant=\"ghost\"\n className={cn(\n \"nd:w-full nd:justify-start nd:gap-2.5 nd:h-9 nd:px-2.5 nd:font-medium\",\n currentView === 'TRASH'\n ? \"nd:bg-destructive/10 nd:text-destructive nd:hover:bg-destructive/15 nd:dark:bg-destructive/15\"\n : \"nd:hover:bg-muted/50 nd:dark:hover:bg-muted/30\"\n )}\n onClick={() => { setCurrentView('TRASH'); onNavigate?.(); }}\n >\n <Trash2 className=\"nd:size-4\" />\n Trash\n </Button>\n </nav>\n\n {/* Storage Indicator */}\n <div className=\"nd:p-2.5 nd:border-t nd:border-border/50 nd:bg-background/50 nd:dark:bg-background/30\">\n <DriveStorageIndicator />\n </div>\n\n {/* Rename Dialog */}\n <RenameAccountDialog\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DialogConfirmation\n open={deleteDialog.open}\n onClose={() => setDeleteDialog({ open: false, account: null })}\n title=\"Disconnect Account\"\n description={`Are you sure you want to disconnect \"${deleteDialog.account?.name}\"? Access will be revoked and synced files will be removed from local cache.`}\n onConfirm={handleDelete}\n />\n\n {/* OAuth Loading Dialog */}\n <Dialog open={oauthLoading} onOpenChange={(open) => !open && cancelOAuth()}>\n <DialogContent className=\"nd:sm:max-w-xs\" showCloseButton={false}>\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-4 nd:py-4\">\n <Loader2 className=\"nd:size-8 nd:text-primary nd:animate-spin\" />\n <div className=\"nd:text-center\">\n <DialogTitle className=\"nd:text-base\">Connecting...</DialogTitle>\n <DialogDescription className=\"nd:text-sm nd:mt-1\">\n Preparing Google authentication\n </DialogDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={cancelOAuth}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\n// ** Desktop Sidebar (always visible on larger screens)\nexport const DriveSidebar = ({ className }: { className?: string }) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n return (\n <div className={className}>\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"nd:size-9\" aria-label=\"Open menu\">\n <Menu className=\"nd:size-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"nd:w-70 nd:sm:w-80 nd:p-0\" hideCloseButton>\n <SheetTitle className=\"nd:sr-only\">Navigation Menu</SheetTitle>\n <SheetDescription className=\"nd:sr-only\">Storage accounts and navigation</SheetDescription>\n <SidebarContent onNavigate={() => setSheetOpen(false)} />\n </SheetContent>\n </Sheet>\n </div>\n );\n};\n","// ** DriveExplorer Component\n'use client';\n\nimport React, { useMemo, useEffect, useRef } from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { useDrive } from '@/client/context';\nimport { formatBytes, getFileIcon, matchesMimeFilter, cn } from '@/client/utils';\nimport { Folder, Loader2, RotateCcw, ChevronRight } from 'lucide-react';\nimport { isToday, isYesterday, startOfWeek, subWeeks, isAfter } from 'date-fns';\nimport { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from \"@/client/components/ui/context-menu\";\nimport { DialogConfirmation } from '@/client/components/dialog';\nimport { CreateFolderDialog } from '@/client/components/drive/CreateFolderDialog';\nimport { RenameDialog } from '@/client/components/drive/RenameDialog';\nimport { Pencil, Trash2, FolderPlus } from \"lucide-react\";\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { DriveContentProgress } from '@/client/components/drive/header';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\n// ** Sortable Item Wrapper\nconst SortableItem = (props: Readonly<{\n id: string;\n children: React.ReactNode;\n disabled?: boolean;\n isDragOverTarget?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { id, children, disabled, isDragOverTarget } = props;\n\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id, disabled });\n\n // Don't apply transform when this is a folder being hovered (prevents sliding)\n const style = {\n transform: isDragOverTarget ? undefined : CSS.Transform.toString(transform),\n transition: isDragOverTarget ? 'transform 0.15s ease' : transition,\n opacity: isDragging ? 0.5 : 1,\n zIndex: isDragging ? 50 : 'auto',\n position: 'relative' as const,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n};\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n selectableFolders?: boolean;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className, selectableFolders = false } = props;\n const {\n items, isLoading, error, apiEndpoint, currentFolderId,\n setItems,\n viewMode, groupBy, sortBy, setSortBy,\n selectedFileIds, setSelectedFileIds, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n callAPI, currentView, moveItem, deleteItem, restoreItem, createFolder, renameItem: renameItemAction\n } = useDrive();\n\n // ** Dialog State\n const [dialogs, setDialogs] = React.useState({\n newFolder: false,\n rename: false,\n delete: false\n });\n const [itemToDelete, setItemToDelete] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Item State\n const [itemToRename, setItemToRename] = React.useState<TDatabaseDrive | null>(null);\n\n // ** Drag & Drop State\n const [dragOverFolderId, setDragOverFolderId] = React.useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = React.useState<string | null>(null);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), // Prevent drag on simple click\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // ** Handle Drag Start\n const handleDragStart = (event: DragStartEvent) => {\n setDraggingItemId(event.active.id as string);\n };\n\n // ** Handle Drag Over (track folder hover)\n const handleDragOver = (event: DragOverEvent) => {\n const { over } = event;\n if (!over) {\n setDragOverFolderId(null);\n return;\n }\n const overItem = items.find(i => i.id === over.id);\n if (overItem?.information.type === 'FOLDER' && over.id !== draggingItemId) {\n setDragOverFolderId(over.id as string);\n } else {\n setDragOverFolderId(null);\n }\n };\n\n // ** Handle Drag End\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event;\n setDragOverFolderId(null);\n setDraggingItemId(null);\n\n if (!over || active.id === over.id) {\n return;\n }\n\n // Check if dropping on a path bar item\n const overId = over.id as string;\n if (overId.startsWith('path-')) {\n const targetFolderId = overId.replace('path-', '');\n // Move to target folder (root = 'root')\n await moveItem(active.id as string, targetFolderId === 'root' ? 'root' : targetFolderId);\n return;\n }\n\n const overItem = items.find(i => i.id === over.id);\n const activeItem = items.find(i => i.id === active.id);\n\n // If dropping on a folder (and not the item itself), MOVE into folder\n if (overItem?.information.type === 'FOLDER' && activeItem) {\n await moveItem(active.id as string, over.id as string);\n return;\n }\n\n // Otherwise, reorder\n // Optimistic Update\n setItems((prevItems) => {\n const oldIndex = prevItems.findIndex((i) => i.id === active.id);\n const newIndex = prevItems.findIndex((i) => i.id === over.id);\n return arrayMove(prevItems, oldIndex, newIndex);\n });\n\n // Switch to custom order if not already\n if (sortBy.field !== 'order') {\n setSortBy({ field: 'order', order: 1 });\n }\n\n // Sync with Server\n const oldIndex = items.findIndex((i) => i.id === active.id);\n const newIndex = items.findIndex((i) => i.id === over.id);\n const newOrderIds = arrayMove(items, oldIndex, newIndex).map(i => i.id);\n\n await callAPI('reorder', {\n method: 'POST',\n body: JSON.stringify({ ids: newOrderIds })\n });\n };\n\n // ** Filter & Sort Items (Memoized)\n // Note: If we drag, we update 'items'. The Memo needs to respect 'items' order if sortBy.field === 'order'.\n const processedItems = useMemo(() => {\n let filtered = items;\n\n if (mimeFilter) {\n filtered = filtered.filter(item => matchesMimeFilter(item.information.type === 'FILE' ? item.information.mime : '', item.information.type === 'FOLDER', mimeFilter));\n }\n\n return [...filtered].sort((a, b) => {\n // Always folders first\n if (a.information.type === 'FOLDER' && b.information.type !== 'FOLDER') return -1;\n if (a.information.type !== 'FOLDER' && b.information.type === 'FOLDER') return 1;\n\n const field = sortBy.field;\n const order = sortBy.order;\n\n if (field === 'order') {\n // If we are sorting by order, we trust the array index implicity or use explicit order field if stable.\n // However, dnd:kit arrayMove changes array index.\n // But DB store `order` number.\n // Since we update `items` state array order on drag, we should just return 0 (maintain array order)\n // OR sort by `a.order - b.order`.\n // If we optimistically update `items` array, we prefer the Array Order if field is 'order'.\n // But backend `reorder` updates `order` field.\n // Let's rely on Array Order if 'order', assuming `items` is loaded sorted by order initially?\n // `refreshItems` calls `list`. API `list` usually sorts by default.\n // If `sortBy.field` is 'order', we want to respect the current array order (which dnd manipulates).\n return 0; // Maintain array index order\n }\n\n let valA: string | number;\n let valB: string | number;\n\n if (field === 'name') {\n valA = a.name.toLowerCase();\n valB = b.name.toLowerCase();\n } else if (field === 'size') {\n valA = a.information.type === 'FILE' ? a.information.sizeInBytes : 0;\n valB = b.information.type === 'FILE' ? b.information.sizeInBytes : 0;\n } else { // createdAt / default\n valA = new Date(a.createdAt).getTime();\n valB = new Date(b.createdAt).getTime();\n }\n\n if (valA < valB) return -1 * order;\n if (valA > valB) return 1 * order;\n return 0;\n });\n }, [items, mimeFilter, sortBy]);\n\n // ** Group Items\n const groupedItems = useMemo(() => {\n if (groupBy === 'NONE') return { 'All': processedItems };\n // ... grouping logic same as before ...\n const groups: Record<string, TDatabaseDrive[]> = {\n 'Today': [],\n 'Yesterday': [],\n 'Earlier this Week': [],\n 'Last Week': [],\n 'Older': []\n };\n const now = new Date();\n const startOfCurrentWeek = startOfWeek(now);\n const startOfLastWeek = startOfWeek(subWeeks(now, 1));\n processedItems.forEach(item => {\n const date = new Date(item.createdAt);\n if (isToday(date)) groups['Today'].push(item);\n else if (isYesterday(date)) groups['Yesterday'].push(item);\n else if (isAfter(date, startOfCurrentWeek)) groups['Earlier this Week'].push(item);\n else if (isAfter(date, startOfLastWeek)) groups['Last Week'].push(item);\n else groups['Older'].push(item);\n });\n return Object.fromEntries(Object.entries(groups).filter(([_, items]) => items.length > 0));\n }, [processedItems, groupBy]);\n\n // ** Infinite Scroll Observer\n const observerTarget = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n if (entries[0].isIntersecting && hasMore && !isLoadingMore) loadMore();\n }, { threshold: 0.1 });\n if (observerTarget.current) observer.observe(observerTarget.current);\n return () => { if (observerTarget.current) observer.unobserve(observerTarget.current); };\n }, [hasMore, isLoadingMore, loadMore]);\n\n // ** Handlers\n const handleItemClick = (e: React.MouseEvent | React.TouchEvent, item: TDatabaseDrive) => {\n // Don't navigate to temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n\n // For folders in BROWSE mode - navigate into folder\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE' && !selectableFolders) {\n navigateToFolder(item);\n onItemClick?.(item);\n return;\n }\n\n // For files or when in TRASH/SEARCH or folders are selectable, toggle selection\n onItemClick?.(item);\n if (selectionMode.type === 'MULTIPLE') {\n if (selectedFileIds.includes(item.id)) {\n setSelectedFileIds(prev => prev.filter(id => id !== item.id));\n } else {\n if (selectionMode.maxFile && selectedFileIds.length >= selectionMode.maxFile) return;\n setSelectedFileIds(prev => [...prev, item.id]);\n }\n } else {\n setSelectedFileIds([item.id]);\n }\n };\n\n const handleItemDoubleClick = (e: React.MouseEvent, item: TDatabaseDrive) => {\n // This is for mouse double-click on desktop\n if (item.information.type === 'FOLDER') {\n if (currentView === 'BROWSE') navigateToFolder(item);\n }\n else onItemDoubleClick?.(item);\n };\n\n const enableDrag = currentView === 'BROWSE';\n\n const stateContent = (() => {\n // Loading State (empty)\n if (isLoading && items.length === 0) {\n return <div className=\"nd:flex nd:items-center nd:justify-center nd:py-12 nd:flex-1\"><Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" /></div>;\n }\n // Error State\n if (error) {\n return <div className=\"nd:flex nd:items-center nd:justify-center nd:p-12 nd:text-destructive nd:bg-destructive/10 nd:rounded-lg nd:flex-1\">{error}</div>;\n }\n // Empty State\n if (processedItems.length === 0) {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"nd:flex nd:flex-col nd:items-center nd:justify-center nd:py-12 nd:text-center nd:flex-1\", className)}>\n <div className=\"nd:size-12 nd:rounded-full nd:bg-muted nd:flex nd:items-center nd:justify-center nd:mb-3\"><Folder className=\"nd:size-6 nd:text-muted-foreground\" /></div>\n <p className=\"nd:text-sm nd:text-muted-foreground\">\n {currentView === 'SEARCH' ? 'No files match your search' :\n currentView === 'TRASH' ? 'Trash is empty' : 'No files found'}\n </p>\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"nd:mr-2 nd:size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"nd:px-2 nd:py-6 nd:text-center\">\n <p className=\"nd:text-xs nd: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=\"nd-drive-root nd:flex nd:flex-col nd:h-full nd:w-full nd:overflow-hidden nd:bg-background/50 nd:dark:bg-background/30 nd:relative\">\n {/* Top Progress Bar */}\n <DriveContentProgress />\n\n {/* Header Row */}\n <div className=\"nd:h-12 nd:px-3 nd:sm:px-4 nd:border-b nd:bg-background/95 nd:dark:bg-background/80 nd:backdrop-blur-sm nd:flex nd:items-center nd:gap-3\">\n <DriveSidebar className=\"nd:lg:hidden\" />\n <DrivePathBar className=\"nd:hidden nd:lg:flex nd:flex-1\" />\n <DriveUpload compact accept={mimeFilter} />\n </div>\n\n {/* Path Bar - Mobile */}\n <div className=\"nd:lg:hidden nd:px-3 nd:py-2 nd:border-b nd:bg-background/95 nd:dark:bg-background/80 nd:backdrop-blur-sm\">\n <DrivePathBar />\n </div>\n\n {stateContent || (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:container nd:mx-auto nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}>\n <div className=\"nd:space-y-4 nd:sm:space-y-6 nd:pb-8 nd:sm:pb-12\">\n {Object.entries(groupedItems).map(([groupName, groupItems]) => (\n <div key={groupName} className=\"nd:space-y-3\">\n {groupBy !== 'NONE' && (\n <h3 className=\"nd:text-sm nd:font-medium nd:text-muted-foreground nd:flex nd:items-center nd:gap-2\">\n {groupName} <span className=\"nd:text-xs nd: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 ? \"nd:grid nd:grid-cols-2 nd:sm:grid-cols-3 nd:md:grid-cols-4 nd:lg:grid-cols-5 nd:xl:grid-cols-6 2nd:xl:grid-cols-7 nd:gap-2 nd:sm:gap-3 nd:md:gap-4\"\n : \"nd:flex nd:flex-col nd: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 nd:relative nd:cursor-pointer nd:transition-all nd:focus:outline-none nd:focus:ring-2 nd:focus:ring-primary nd:focus:ring-offset-2\",\n viewMode === 'GRID'\n ? \"nd:flex nd:flex-col nd:rounded-xl nd:border nd:bg-card nd:dark:bg-card/50 nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:hover:shadow-sm nd:overflow-hidden\"\n : \"nd:flex nd:items-center nd:p-2 nd:rounded-lg nd:hover:bg-accent/50 nd:dark:hover:bg-accent/30 nd:gap-3 nd:border nd:border-transparent nd:hover:border-border\",\n isSelected && \"nd:ring-2 nd:ring-primary nd:border-primary/50 nd:bg-accent/30 nd:dark:bg-accent/20\",\n isDragOver && \"nd:ring-2 nd:ring-primary nd:border-primary nd:scale-[1.02] nd:bg-primary/10 nd:shadow-lg nd:transition-transform\"\n )}\n onClick={(e) => handleItemClick(e, item)}\n onTouchEnd={(e) => {\n e.preventDefault();\n handleItemClick(e, item);\n }}\n onDoubleClick={(e) => handleItemDoubleClick(e, item)}\n role=\"button\"\n tabIndex={0}\n >\n {viewMode === 'GRID' ? (\n <>\n <div className=\"nd:aspect-square nd:w-full nd:bg-muted/20 nd:dark:bg-muted/10 nd:flex nd:items-center nd:justify-center nd:overflow-hidden nd:relative\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-contain nd:transition-transform group-nd:hover:scale-105 nd:duration-300\" loading=\"lazy\" />\n ) : (\n <div className=\"nd:transition-transform group-nd:hover:scale-110 nd:duration-200\">\n {getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-10 nd:text-muted-foreground/70\")}\n </div>\n )}\n {isSelected && (\n <div className=\"nd:absolute nd:top-2 nd:right-2 nd:size-5 nd:bg-primary nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-sm nd:animate-in nd:zoom-in-50\">\n <div className=\"nd:size-2 nd:bg-primary-foreground nd:rounded-full\" />\n </div>\n )}\n {isFolder && currentView === 'BROWSE' && (\n <div className=\"nd:absolute nd:bottom-2 nd:right-2 nd:lg:hidden nd:size-6 nd:bg-primary/90 nd:rounded-full nd:flex nd:items-center nd:justify-center nd:shadow-md\">\n <ChevronRight className=\"nd:size-3.5 nd:text-primary-foreground\" />\n </div>\n )}\n </div>\n <div className=\"nd:p-2.5\">\n <p className=\"nd:text-sm nd:font-medium nd:truncate\" title={item.name}>{item.name}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:mt-0.5\">\n {isFolder ? 'Folder' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </p>\n </div>\n </>\n ) : (\n <>\n <div className=\"nd:size-9 nd:shrink-0 nd:rounded-md nd:overflow-hidden nd:bg-muted/40 nd:dark:bg-muted/20 nd:flex nd:items-center nd:justify-center nd:border\">\n {isThumbnailable ? (\n <img src={thumbnailUrl} alt={item.name} className=\"nd:size-full nd:object-contain\" loading=\"lazy\" />\n ) : (\n getFileIcon(item.information.type === 'FILE' ? item.information.mime : '', isFolder, \"nd:size-4 nd:text-muted-foreground\")\n )}\n </div>\n <span className=\"nd:text-sm nd:font-medium nd:truncate nd:flex-1\" title={item.name}>{item.name}</span>\n <span className=\"nd:text-xs nd:text-muted-foreground nd:w-20 nd:text-right nd:shrink-0\">\n {isFolder ? '-' : formatBytes(item.information.type === 'FILE' ? item.information.sizeInBytes : 0)}\n </span>\n {isFolder && currentView === 'BROWSE' && (\n <ChevronRight className=\"nd:size-4 nd:text-muted-foreground nd:lg:hidden nd:shrink-0\" />\n )}\n </>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'TRASH' ? (\n <>\n <ContextMenuItem onClick={() => restoreItem(item.id)}>\n <RotateCcw className=\"nd:mr-2 nd:size-4\" /> Restore\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"nd:mr-2 nd:size-4\" /> Delete Forever\n </ContextMenuItem>\n </>\n ) : (\n <>\n <ContextMenuItem onClick={() => {\n setItemToRename(item);\n setDialogs(prev => ({ ...prev, rename: true }));\n }}>\n <Pencil className=\"nd:mr-2 nd:size-4\" /> Rename\n </ContextMenuItem>\n <ContextMenuSeparator />\n <ContextMenuItem className=\"nd:text-destructive nd:focus:text-destructive\" onClick={() => {\n setItemToDelete(item);\n setDialogs(prev => ({ ...prev, delete: true }));\n }}>\n <Trash2 className=\"nd:mr-2 nd: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=\"nd:flex nd:justify-center nd:py-4\">\n {isLoadingMore && <Loader2 className=\"nd:size-6 nd:animate-spin nd:text-muted-foreground\" />}\n {!isLoadingMore && <div className=\"nd:h-4 nd:w-full\" />}\n </div>\n )}\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent>\n {currentView === 'BROWSE' ? (\n <ContextMenuItem onClick={() => setDialogs(prev => ({ ...prev, newFolder: true }))}>\n <FolderPlus className=\"nd:mr-2 nd:size-4\" /> New Folder\n </ContextMenuItem>\n ) : (\n <div className=\"nd:px-2 nd:py-6 nd:text-center\">\n <p className=\"nd:text-xs nd:text-muted-foreground\">No actions available</p>\n </div>\n )}\n </ContextMenuContent>\n </ContextMenu>\n )}\n\n {/* Dialogs - Outside of ContextMenu to prevent z-index/portal issues */}\n <CreateFolderDialog\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <RenameDialog\n open={dialogs.rename}\n onClose={() => {\n setDialogs(prev => ({ ...prev, rename: false }));\n setItemToRename(null);\n }}\n item={itemToRename}\n onConfirm={async (id, newName) => {\n await renameItemAction(id, newName);\n setItemToRename(null);\n }}\n />\n\n <DialogConfirmation\n open={dialogs.delete}\n onClose={() => {\n setDialogs(prev => ({ ...prev, delete: false }));\n setItemToDelete(null);\n }}\n title={currentView === 'TRASH' ? 'Delete Permanently?' : 'Move to Trash?'}\n description={\n currentView === 'TRASH'\n ? `This will permanently delete \"${itemToDelete?.name}\". You cannot undo this action.`\n : `Are you sure you want to move \"${itemToDelete?.name}\" to trash?`\n }\n onConfirm={async () => {\n if (!itemToDelete) return [false, 'No item selected'];\n await deleteItem(itemToDelete.id);\n setItemToDelete(null);\n return [true];\n }}\n />\n </div>\n </DndContext>\n );\n};\n"]}
|