@muhgholy/next-drive 4.23.29 → 4.23.30

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/context.tsx","../../src/client/upload.ts","../../src/client/hooks/use-upload.ts","../../src/client/style-injector.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/modal.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/shared/confirm.tsx","../../src/client/components/drive/account/rename.tsx","../../src/client/components/drive/dnd/context.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/folder/create.tsx","../../src/client/components/drive/item/rename.tsx","../../src/client/hooks/use-marquee.ts","../../src/client/hooks/use-item-touch.ts","../../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":["React","MAX_CONCURRENT_UPLOADS","useState","useCallback","uploadFiles","useEffect","jsx","DialogPrimitive","React2","cva","jsxs","X","DialogPrimitive2","Label","AlertCircle","createContext","useContext","React5","ChevronRight","Check","Circle","useForm","useRef","useMemo","items","RotateCcw","Trash2","Group","Loader2","Fragment","UploadIcon","Pencil","RefreshCw","Menu","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen"],"mappings":"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","file":"index.js","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, 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 setSelectionMode: React.Dispatch<React.SetStateAction<{ type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number }>>;\n selectedFiles: TDriveFile[];\n selectedFileIds: string[];\n setSelectedFiles: React.Dispatch<React.SetStateAction<TDriveFile[]>>;\n toggleSelected: (file: TDriveFile) => void;\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 = true\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, setSelectionMode] = useState(initialSelectionMode);\n const [selectedFiles, setSelectedFiles] = useState<TDriveFile[]>(\n () => defaultSelectedFileIds.map(id => ({ id, isFolder: false, file: { name: '', mime: '', size: 0 } }))\n );\n const selectedFileIds = useMemo(() => selectedFiles.map(f => f.id), [selectedFiles]);\n\n const toggleSelected = useCallback((file: TDriveFile) => {\n setSelectedFiles(prev => {\n const exists = prev.some(f => f.id === file.id);\n if (selectionMode.type === 'MULTIPLE') {\n if (exists) return prev.filter(f => f.id !== file.id);\n if (selectionMode.maxFile && prev.length >= selectionMode.maxFile) return prev;\n return [...prev, file];\n }\n return [file];\n });\n }, [selectionMode]);\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 try {\n return await res.json();\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : String(parseErr);\n return { status: res.status || 0, message: `Could not read the server response for \"${action}\" (${detail})` };\n }\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return { status: 0, message: `Network request failed for \"${action}\" (${detail})` };\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 || 'Could not load your files');\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 setSelectedFiles([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n if (selectionMode.type === 'SINGLE') setSelectedFiles([]);\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 }, [selectionMode]);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n if (selectionMode.type === 'SINGLE') setSelectedFiles([]);\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, selectionMode]);\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 setSelectedFiles(prev => prev.filter(f => f.id !== 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 setSelectedFiles(prev => prev.filter(f => f.id !== 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 setSelectionMode,\n selectedFiles,\n selectedFileIds,\n setSelectedFiles,\n toggleSelected,\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","// ** Native (headless) Upload Engine — powered by the tus resumable upload protocol\r\n'use client';\r\n\r\nimport * as tus from 'tus-js-client';\r\nimport type {\r\n TDriveFile,\r\n TDriveUploadOptions,\r\n TDriveUploadHandle,\r\n TDriveUploadResult,\r\n TDriveBatchOptions,\r\n TDriveBatchHandle,\r\n} from '@/types/client';\r\n\r\n// ** Constants\r\nconst MAX_CONCURRENT_UPLOADS = 2;\r\n\r\n// ** Dynamic chunk sizing based on file size (tus PATCH body size)\r\nconst getChunkSize = (fileSize: number) => {\r\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\r\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\r\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\r\n return 16 * 1024 * 1024;\r\n};\r\n\r\nconst generateId = () => `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n\r\n// ** Normalize a raw server item into the public TDriveFile shape\r\nconst toDriveFile = (item: any): TDriveFile => {\r\n const isFile = item?.information?.type === 'FILE';\r\n return {\r\n id: item?.id,\r\n isFolder: !isFile,\r\n file: {\r\n name: item?.name,\r\n mime: isFile ? item.information.mime : '',\r\n size: isFile ? item.information.sizeInBytes : 0,\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Upload a single file using the tus resumable protocol, with byte-level progress, logging and\r\n * cancellation.\r\n *\r\n * Returns a handle immediately; the upload starts right away. Use `handle.cancel()` to abort (which\r\n * also terminates the upload on the server) and `handle.promise` to await the final result. Omit\r\n * `accountId` to upload anonymously (the server resolves anonymous uploads automatically when\r\n * enabled).\r\n *\r\n * Because tus tracks progress by byte offset, an interrupted upload resumes exactly where it left\r\n * off instead of restarting or failing — even for multi-GB files on flaky connections.\r\n */\r\nexport const uploadFile = (options: TDriveUploadOptions): TDriveUploadHandle => {\r\n const {\r\n apiEndpoint,\r\n file,\r\n folderId = null,\r\n accountId = null,\r\n withCredentials = false,\r\n conflictAction,\r\n signal,\r\n onProgress,\r\n onLog,\r\n onComplete,\r\n } = options;\r\n\r\n const id = options.id ?? generateId();\r\n const endpoint = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\r\n const chunkSize = getChunkSize(file.size);\r\n const totalChunks = Math.max(1, Math.ceil(file.size / chunkSize));\r\n\r\n const log = (type: 'info' | 'warning' | 'error' | 'success', message: string) =>\r\n onLog?.({ id, type, message, timestamp: Date.now() });\r\n\r\n let settle: (result: TDriveUploadResult) => void = () => {};\r\n const promise = new Promise<TDriveUploadResult>(resolve => {\r\n settle = resolve;\r\n });\r\n\r\n let completedItem: any;\r\n let cancelled = false;\r\n\r\n const metadata: Record<string, string> = {\r\n filename: file.name,\r\n filetype: file.type || 'application/octet-stream',\r\n folderId: folderId || 'root',\r\n };\r\n if (conflictAction) metadata.conflictAction = conflictAction;\r\n\r\n const upload = new tus.Upload(file, {\r\n endpoint,\r\n chunkSize,\r\n // ** Retry with backoff. On a dropped connection tus first re-checks the server offset (HEAD)\r\n // ** and resumes from there — this is what prevents the \"session expired\" failures at ~100%.\r\n retryDelays: [0, 1000, 3000, 5000, 10000],\r\n removeFingerprintOnSuccess: true,\r\n metadata,\r\n headers: accountId ? { 'x-drive-account': accountId } : {},\r\n onBeforeRequest(req) {\r\n // ** Send cookies with cross-origin requests when requested (tus has no dedicated option).\r\n if (withCredentials) {\r\n const xhr = req.getUnderlyingObject();\r\n if (xhr && 'withCredentials' in xhr) xhr.withCredentials = true;\r\n }\r\n },\r\n onShouldRetry(err) {\r\n const status = (err as tus.DetailedError)?.originalResponse?.getStatus?.() ?? 0;\r\n // ** Validation/auth/quota errors are permanent — do not retry them.\r\n if ([400, 401, 403, 413].includes(status)) {\r\n log('error', `Non-retryable error (status ${status})`);\r\n return false;\r\n }\r\n log('warning', `Upload interrupted (status ${status}), retrying`);\r\n return true;\r\n },\r\n onProgress(bytesUploaded, bytesTotal) {\r\n const percent = bytesTotal === 0 ? 100 : Math.min(100, Math.round((bytesUploaded / bytesTotal) * 100));\r\n onProgress?.({\r\n id,\r\n percent,\r\n uploadedBytes: bytesUploaded,\r\n totalBytes: bytesTotal,\r\n currentChunk: Math.min(totalChunks, Math.floor(bytesUploaded / chunkSize)),\r\n totalChunks,\r\n });\r\n },\r\n onAfterResponse(_req, res) {\r\n // ** The server returns the created drive item as a header on the final response.\r\n const header = res.getHeader('X-Drive-Item');\r\n if (header) {\r\n try {\r\n completedItem = JSON.parse(decodeURIComponent(header));\r\n } catch {\r\n /* ignore malformed header */\r\n }\r\n }\r\n },\r\n onSuccess() {\r\n log('success', 'Upload completed successfully');\r\n if (completedItem !== undefined) onComplete?.(completedItem);\r\n settle({ id, status: 'complete', driveId: completedItem?.id ?? '', file: toDriveFile(completedItem), item: completedItem });\r\n },\r\n onError(error) {\r\n const message = error instanceof Error ? error.message : 'Upload failed';\r\n log('error', `Upload failed: ${message}`);\r\n settle({ id, status: 'error', driveId: null, error: message });\r\n },\r\n });\r\n\r\n const cancel = () => {\r\n if (cancelled) return;\r\n cancelled = true;\r\n // ** abort(true) also terminates the upload on the server (tus DELETE).\r\n upload.abort(true).catch(() => {});\r\n settle({ id, status: 'cancelled', driveId: null });\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) cancel();\r\n else signal.addEventListener('abort', cancel, { once: true });\r\n }\r\n\r\n log('info', `Starting upload: ${file.name} (${file.size} bytes)`);\r\n upload.start();\r\n\r\n return { id, promise, cancel };\r\n};\r\n\r\n/**\r\n * Upload multiple files with a bounded concurrency pool.\r\n *\r\n * Returns immediately with one handle per file (each exposes its own `cancel` and\r\n * `promise`), plus `cancelAll` and an aggregate `promise` that resolves once every\r\n * file has settled.\r\n */\r\nexport const uploadFiles = (files: File[], options: TDriveBatchOptions): TDriveBatchHandle => {\r\n const { concurrency = MAX_CONCURRENT_UPLOADS, onFileComplete, ...base } = options;\r\n const slots = Math.max(1, concurrency);\r\n\r\n type Entry = {\r\n id: string;\r\n file: File;\r\n cancelRequested: boolean;\r\n real: TDriveUploadHandle | null;\r\n settle: (result: TDriveUploadResult) => void;\r\n };\r\n\r\n const entries: Entry[] = [];\r\n const handles: TDriveUploadHandle[] = [];\r\n\r\n files.forEach(file => {\r\n const id = generateId();\r\n const entry: Entry = { id, file, cancelRequested: false, real: null, settle: () => { } };\r\n const promise = new Promise<TDriveUploadResult>(resolve => { entry.settle = resolve; });\r\n entries.push(entry);\r\n handles.push({\r\n id,\r\n promise,\r\n cancel: () => {\r\n entry.cancelRequested = true;\r\n entry.real?.cancel();\r\n },\r\n });\r\n });\r\n\r\n const results: TDriveUploadResult[] = [];\r\n let resolveAll: (results: TDriveUploadResult[]) => void = () => { };\r\n const allPromise = new Promise<TDriveUploadResult[]>(resolve => { resolveAll = resolve; });\r\n\r\n let nextIndex = 0;\r\n let active = 0;\r\n let settledCount = 0;\r\n let cancelledAll = false;\r\n\r\n const finalize = (entry: Entry, result: TDriveUploadResult) => {\r\n entry.settle(result);\r\n results.push(result);\r\n onFileComplete?.(result);\r\n settledCount++;\r\n if (settledCount === entries.length) resolveAll(results);\r\n };\r\n\r\n const startNext = () => {\r\n while (active < slots && nextIndex < entries.length) {\r\n const entry = entries[nextIndex++];\r\n\r\n if (entry.cancelRequested || cancelledAll) {\r\n finalize(entry, { id: entry.id, status: 'cancelled', driveId: null });\r\n continue;\r\n }\r\n\r\n active++;\r\n const handle = uploadFile({ ...base, file: entry.file, id: entry.id });\r\n entry.real = handle;\r\n if (entry.cancelRequested) handle.cancel();\r\n\r\n handle.promise.then(result => {\r\n active--;\r\n finalize(entry, result);\r\n startNext();\r\n });\r\n }\r\n };\r\n\r\n if (entries.length === 0) resolveAll(results);\r\n else startNext();\r\n\r\n return {\r\n uploads: handles,\r\n cancelAll: () => {\r\n cancelledAll = true;\r\n entries.forEach(entry => {\r\n entry.cancelRequested = true;\r\n entry.real?.cancel();\r\n });\r\n },\r\n promise: allPromise,\r\n };\r\n};\r\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { uploadFile } from '@/client/upload';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: unknown, replaced?: boolean) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n\n // ** Active upload handles + queued file data\n const handles = useRef<Map<string, { cancel: () => void }>>(new Map());\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null; conflictAction?: 'rename' | 'replace' }>>(new Map());\n const startedRef = useRef<Set<string>>(new Set());\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 startUpload = useCallback(\n (item: TDriveUploadState) => {\n const file = filesRef.current.get(item.id);\n const meta = metaRef.current.get(item.id);\n if (!file) return;\n\n updateUpload(item.id, { status: 'uploading' });\n\n const handle = uploadFile({\n apiEndpoint,\n file,\n folderId: meta?.folderId ?? null,\n accountId: activeAccountId,\n withCredentials,\n conflictAction: meta?.conflictAction,\n id: item.id,\n onLog: ({ type, message }) => addLog(item.id, type, message),\n onProgress: ({ percent, currentChunk, totalChunks }) =>\n updateUpload(item.id, { percent, currentChunk, totalChunks }),\n onComplete: uploaded => onUploadComplete?.(uploaded, meta?.conflictAction === 'replace'),\n });\n\n handles.current.set(item.id, { cancel: handle.cancel });\n\n handle.promise.then(result => {\n handles.current.delete(item.id);\n if (result.status === 'complete') {\n updateUpload(item.id, { status: 'complete', percent: 100, driveId: result.driveId });\n } else if (result.status === 'cancelled') {\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n updateUpload(item.id, { status: 'error', error: result.error });\n }\n });\n },\n [apiEndpoint, activeAccountId, withCredentials, onUploadComplete, addLog, updateUpload],\n );\n\n const uploadFiles = useCallback((files: File[], folderId: string | null, existingItems: TDatabaseDrive[]) => {\n // ** Names already taken in this folder, growing as we walk the batch so same-name picks also collide\n const takenNames = new Set(existingItems.filter(i => i.information.type === 'FILE' && i.parentId === folderId).map(i => i.name));\n\n const newUploads: TDriveUploadState[] = files.map(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n const conflicts = takenNames.has(file.name);\n takenNames.add(file.name);\n\n return {\n id,\n name: file.name,\n size: file.size,\n status: conflicts ? 'conflict' : 'queued',\n currentChunk: 0,\n totalChunks: 1,\n percent: 0,\n logs: [],\n };\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n const resolveConflict = useCallback((id: string, action: 'skip' | 'rename' | 'replace') => {\n if (action === 'skip') {\n updateUpload(id, { status: 'cancelled' });\n return;\n }\n const meta = metaRef.current.get(id);\n if (meta) metaRef.current.set(id, { ...meta, conflictAction: action });\n updateUpload(id, { status: 'queued' });\n }, [updateUpload]);\n\n const resolveAllConflicts = useCallback((action: 'skip' | 'rename' | 'replace') => {\n setUploads(prev => prev.map(u => {\n if (u.status !== 'conflict') return u;\n if (action === 'skip') return { ...u, status: 'cancelled' };\n const meta = metaRef.current.get(u.id);\n if (meta) metaRef.current.set(u.id, { ...meta, conflictAction: action });\n return { ...u, status: 'queued' };\n }));\n }, []);\n\n const cancelUpload = useCallback(\n (id: string) => {\n const handle = handles.current.get(id);\n if (handle) handle.cancel();\n else updateUpload(id, { status: 'cancelled' });\n },\n [updateUpload],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['conflict', '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 if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued' && !startedRef.current.has(u.id));\n if (queued) {\n startedRef.current.add(queued.id);\n startUpload(queued);\n }\n }, [uploads, startUpload]);\n\n return { uploads, uploadFiles, cancelUpload, cancelAllUploads, resolveConflict, resolveAllConflicts };\n};\n","'use client';\n\nimport { useEffect } from 'react';\n\n// This placeholder will be replaced by the build script with the actual CSS content\nconst cssContent = '__ND_STYLES_PLACEHOLDER__';\nconst styleId = 'nd-injected-styles';\n\nexport const useStyleInjector = () => {\n useEffect(() => {\n if (typeof document !== 'undefined' && !document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = cssContent;\n document.head.appendChild(style);\n }\n }, []);\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 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 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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/modal\";\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 DriveConfirm = <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\n type=\"button\"\n variant=\"outline\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void handleConfirm();\n }}\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/modal';\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 DriveAccountRename = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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 PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n cutIds: string[];\n cutSelection: (ids: string[]) => void;\n clearCut: () => void;\n pasteSelection: (targetFolderId: string) => Promise<void>;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null,\n cutIds: [],\n cutSelection: () => { },\n clearCut: () => { },\n pasteSelection: async () => { }\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, selectedFileIds, setSelectedFiles } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n const [cutIds, setCutIds] = useState<string[]>([]);\n\n // ** Move a specific set of ids into a target folder (shared by drag-drop and keyboard paste)\n const moveIds = useCallback(async (ids: string[], targetFolderId: string) => {\n if (ids.length === 1) return moveItem(ids[0], targetFolderId);\n setItems(prev => prev.filter(i => !ids.includes(i.id)));\n setSelectedFiles([]);\n await callAPI('move', { method: 'POST', body: JSON.stringify({ ids, targetFolderId }) });\n }, [moveItem, setItems, setSelectedFiles, callAPI]);\n\n // ** Move the dragged item, or the whole selection if the dragged item is part of it\n const moveSelection = useCallback(async (activeId: string, targetFolderId: string) => {\n const ids = selectedFileIds.includes(activeId) && selectedFileIds.length > 1 ? selectedFileIds : [activeId];\n return moveIds(ids, targetFolderId);\n }, [selectedFileIds, moveIds]);\n\n // ** Keyboard cut/paste - the accessible, native-feeling alternative to drag-drop for moving items\n const cutSelection = useCallback((ids: string[]) => setCutIds(ids), []);\n const clearCut = useCallback(() => setCutIds([]), []);\n const pasteSelection = useCallback(async (targetFolderId: string) => {\n if (!cutIds.length) return;\n await moveIds(cutIds, targetFolderId);\n setCutIds([]);\n }, [cutIds, moveIds]);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } })\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 moveSelection(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 moveSelection(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, moveSelection, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId, cutIds, cutSelection, clearCut, pasteSelection }}>\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 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-drive-root 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-drive-root 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/modal';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const DriveFolderCreate = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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/modal';\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 DriveItemRename = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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","// ** useMarquee - Mouse rubber-band selection over a grid/list container\r\n'use client';\r\n\r\nimport React, { useState } from 'react';\r\n\r\n// Attach the returned `onMouseDown` to a `position: relative` scroll container and render\r\n// `overlay` inside it. Items to hit-test must carry a `data-marquee-id=\"<id>\"` attribute.\r\n// Dragging on empty space reports intersecting ids; an empty click reports [].\r\nexport const useMarquee = (onSelectIds: (ids: string[]) => void) => {\r\n const [box, setBox] = useState<{ left: number; top: number; width: number; height: number } | null>(null);\r\n\r\n const onMouseDown = (e: React.MouseEvent) => {\r\n // Only left button, and only when starting on empty space (not on an item).\r\n if (e.button !== 0 || (e.target as HTMLElement).closest('[data-marquee-id]')) return;\r\n\r\n const container = e.currentTarget as HTMLElement;\r\n const start = { x: e.clientX, y: e.clientY };\r\n let moved = false;\r\n\r\n const handleMove = (ev: MouseEvent) => {\r\n if (!moved && Math.abs(ev.clientX - start.x) < 4 && Math.abs(ev.clientY - start.y) < 4) return;\r\n moved = true;\r\n\r\n const left = Math.min(start.x, ev.clientX);\r\n const top = Math.min(start.y, ev.clientY);\r\n const right = Math.max(start.x, ev.clientX);\r\n const bottom = Math.max(start.y, ev.clientY);\r\n\r\n const cRect = container.getBoundingClientRect();\r\n setBox({\r\n left: left - cRect.left + container.scrollLeft,\r\n top: top - cRect.top + container.scrollTop,\r\n width: right - left,\r\n height: bottom - top,\r\n });\r\n\r\n const ids: string[] = [];\r\n container.querySelectorAll<HTMLElement>('[data-marquee-id]').forEach(el => {\r\n const r = el.getBoundingClientRect();\r\n if (r.left < right && r.right > left && r.top < bottom && r.bottom > top) ids.push(el.dataset.marqueeId!);\r\n });\r\n onSelectIds(ids);\r\n };\r\n\r\n const handleUp = () => {\r\n window.removeEventListener('mousemove', handleMove);\r\n window.removeEventListener('mouseup', handleUp);\r\n if (!moved) onSelectIds([]); // empty-space click clears selection\r\n setBox(null);\r\n };\r\n\r\n window.addEventListener('mousemove', handleMove);\r\n window.addEventListener('mouseup', handleUp);\r\n };\r\n\r\n const overlay = box ? React.createElement('div', {\r\n className: 'nd:absolute nd:z-50 nd:rounded-sm nd:border nd:border-primary nd:bg-primary/10 nd:pointer-events-none',\r\n style: { left: box.left, top: box.top, width: box.width, height: box.height },\r\n }) : null;\r\n\r\n return { onMouseDown, overlay };\r\n};\r\n","// ** useItemTouch - Native tap vs. long-press detection for touch devices\r\n'use client';\r\n\r\nimport { useRef } from 'react';\r\n\r\n// Tap fires onTap; holding still for ~500ms fires onLongPress instead (and suppresses the tap).\r\n// Movement beyond a small threshold cancels the long-press (matches native touch behavior).\r\nexport const useItemTouch = (onTap: () => void, onLongPress: () => void) => {\r\n const start = useRef<{ x: number; y: number } | null>(null);\r\n const timer = useRef<ReturnType<typeof setTimeout>>();\r\n const fired = useRef(false);\r\n\r\n const onTouchStart = (e: React.TouchEvent) => {\r\n const t = e.touches[0];\r\n start.current = { x: t.clientX, y: t.clientY };\r\n fired.current = false;\r\n timer.current = setTimeout(() => { fired.current = true; onLongPress(); }, 500);\r\n };\r\n\r\n const onTouchMove = (e: React.TouchEvent) => {\r\n if (!start.current) return;\r\n const t = e.touches[0];\r\n if (Math.abs(t.clientX - start.current.x) > 10 || Math.abs(t.clientY - start.current.y) > 10) {\r\n clearTimeout(timer.current);\r\n start.current = null;\r\n }\r\n };\r\n\r\n const onTouchEnd = (e: React.TouchEvent) => {\r\n clearTimeout(timer.current);\r\n if (start.current && !fired.current) { e.preventDefault(); onTap(); }\r\n start.current = null;\r\n };\r\n\r\n return { onTouchStart, onTouchMove, onTouchEnd };\r\n};\r\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/context';\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveFolderCreate } from '@/client/components/drive/folder/create';\nimport { DriveItemRename } from '@/client/components/drive/item/rename';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useMarquee } from '@/client/hooks/use-marquee';\nimport { useItemTouch } from '@/client/hooks/use-item-touch';\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 // Cell itself is not a tab stop (role=gridcell, tabIndex=-1) - the focusable widget lives inside\n // (FileItem's div), per the ARIA APG grid pattern. Overrides dnd-kit's default role='button'/tabIndex=0.\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n disabled,\n attributes: { role: 'gridcell', tabIndex: -1 }\n });\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} data-marquee-id={id} 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 hasSelection: boolean;\n isFocused: boolean;\n isCut: boolean;\n innerRef: (el: HTMLDivElement | null) => void;\n onSelect: () => void;\n onOpen: () => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, hasSelection, isFocused, isCut, innerRef, onSelect, onOpen, 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 // Native touch model: tap opens a folder only when nothing is selected yet (like a fresh browse),\n // otherwise (or on files) tap toggles selection. Long-press always toggles and starts a selection.\n const { onTouchStart, onTouchMove, onTouchEnd } = useItemTouch(\n () => (isFolder && currentView === 'BROWSE' && !hasSelection ? onOpen() : onSelect()),\n onSelect\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n ref={innerRef}\n data-item-id={item.id}\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 isCut && \"nd:opacity-50\"\n )}\n onClick={onSelect}\n onDoubleClick={onOpen}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n role=\"button\"\n aria-selected={isSelected}\n tabIndex={isFocused ? 0 : -1}\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 onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, toggleSelected, setSelectedFiles, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state (and cut/paste actions) from shared context\n const { dragOverFolderId, cutIds, cutSelection, clearCut, pasteSelection } = useDriveDnd();\n\n // ** Marquee (rubber-band) selection\n const { onMouseDown: marqueeMouseDown, overlay: marqueeOverlay } = useMarquee((ids) => {\n let files = items.filter(i => ids.includes(i.id)).map(i => ({\n id: i.id,\n isFolder: i.information.type === 'FOLDER',\n file: {\n name: i.name,\n mime: i.information.type === 'FILE' ? i.information.mime : '',\n size: i.information.type === 'FILE' ? i.information.sizeInBytes : 0,\n },\n }));\n if (selectionMode.type === 'SINGLE') files = files.slice(0, 1);\n else if (selectionMode.maxFile) files = files.slice(0, selectionMode.maxFile);\n setSelectedFiles(files);\n });\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 // ** Keyboard navigation - roving tabindex (one focusable item at a time, per ARIA APG grid pattern)\n const [focusedId, setFocusedId] = React.useState<string | null>(null);\n const itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n const gridRef = useRef<HTMLDivElement>(null);\n const hadFocusRef = useRef(false);\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 // ** Flattened visual order (across groups) for arrow-key navigation - per the ARIA APG's reflowing\n // layout-grid pattern, the whole set is treated as one logical row regardless of column count.\n const flatItems = useMemo(() => Object.values(groupedItems).flat(), [groupedItems]);\n const effectiveFocusedId = flatItems.some(i => i.id === focusedId) ? focusedId : (flatItems[0]?.id ?? null);\n\n const focusItem = (id: string) => {\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n // Restore focus to the fallback item when the previously-focused one unmounts (e.g., navigating into\n // a folder replaces the whole item list) - otherwise focus silently falls back to <body> and all\n // further keyboard input is lost. Per ARIA APG's guidance on persistence of focus. Only acts when\n // focus has actually fallen back to <body> - if the user deliberately moved focus elsewhere (e.g., a\n // search box or dialog button), document.activeElement won't be <body> and this is a no-op.\n useEffect(() => {\n if (!hadFocusRef.current || !effectiveFocusedId) return;\n if (document.activeElement === document.body) focusItem(effectiveFocusedId);\n }, [flatItems]);\n\n // ** Handlers\n // Click/tap always toggles selection (files and folders alike); double-click/tap-to-open (touch, when\n // nothing is selected) opens folders instead - see FileItem's useItemTouch wiring for the touch side.\n const handleItemSelect = (item: TDatabaseDrive) => {\n // Don't select temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n toggleSelected({\n id: item.id,\n isFolder: item.information.type === 'FOLDER',\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 onItemClick?.(item);\n };\n\n const handleItemOpen = (item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n // ** Grid keyboard interaction (ARIA APG grid pattern + native cut/paste move convention)\n const handleGridKeyDown = (e: React.KeyboardEvent) => {\n const isMeta = e.ctrlKey || e.metaKey;\n\n if (isMeta && e.key.toLowerCase() === 'x') {\n if (selectedFileIds.length > 0) { e.preventDefault(); cutSelection(selectedFileIds); }\n return;\n }\n if (isMeta && e.key.toLowerCase() === 'v') {\n e.preventDefault();\n pasteSelection(currentFolderId ?? 'root');\n return;\n }\n\n const currentIndex = effectiveFocusedId ? flatItems.findIndex(i => i.id === effectiveFocusedId) : -1;\n if (currentIndex === -1 && !['Escape'].includes(e.key)) return;\n\n const moveFocusTo = (index: number) => {\n const target = flatItems[Math.max(0, Math.min(flatItems.length - 1, index))];\n if (!target) return;\n focusItem(target.id);\n // Single-select: selection follows focus, per ARIA APG listbox/grid convention for single-select composites\n if (selectionMode.type === 'SINGLE') handleItemSelect(target);\n };\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n moveFocusTo(currentIndex + 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n moveFocusTo(currentIndex - 1);\n break;\n case 'Home':\n e.preventDefault();\n moveFocusTo(0);\n break;\n case 'End':\n e.preventDefault();\n moveFocusTo(flatItems.length - 1);\n break;\n case ' ':\n case 'Spacebar':\n e.preventDefault();\n if (flatItems[currentIndex]) handleItemSelect(flatItems[currentIndex]);\n break;\n case 'Enter':\n e.preventDefault();\n if (flatItems[currentIndex]) handleItemOpen(flatItems[currentIndex]);\n break;\n case 'Escape':\n // Clears selection/cut for the standalone explorer. Note: when this grid is inside a\n // Radix Dialog (the file-chooser), stopPropagation here can't stop the dialog's own\n // document-level Escape listener - that case is handled separately via the dialog's\n // onEscapeKeyDown prop, which is the documented way to override it.\n if (selectedFileIds.length > 0 || cutIds.length > 0) {\n e.stopPropagation();\n if (selectedFileIds.length > 0) setSelectedFiles([]);\n else clearCut();\n }\n break;\n default:\n break;\n }\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\n ref={gridRef}\n className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:relative nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}\n onMouseDown={marqueeMouseDown}\n onFocus={() => { hadFocusRef.current = true; }}\n onKeyDown={handleGridKeyDown}\n role=\"grid\"\n aria-label=\"Files and folders\"\n aria-multiselectable={selectionMode.type === 'MULTIPLE'}\n >\n {marqueeOverlay}\n {/* Live region - announces selection changes to screen reader / keyboard users */}\n <div className=\"nd:sr-only\" aria-live=\"polite\">\n {selectedFileIds.length > 0 ? `${selectedFileIds.length} selected` : ''}\n </div>\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\n role=\"row\"\n 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 hasSelection={selectedFileIds.length > 0}\n isFocused={effectiveFocusedId === item.id}\n isCut={cutIds.includes(item.id)}\n innerRef={(el) => { if (el) itemRefs.current.set(item.id, el); else itemRefs.current.delete(item.id); }}\n onSelect={() => { setFocusedId(item.id); handleItemSelect(item); }}\n onOpen={() => { setFocusedId(item.id); handleItemOpen(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\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 <DriveFolderCreate\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <DriveItemRename\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 <DriveConfirm\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveFolderCreate } from '@/client/components/drive/folder/create';\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, setSelectedFiles,\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 {/* Selection Indicator - visible exit from a selection (esp. needed on mobile/long-press) */}\n {selectedFileIds.length > 0 && (\n <div className=\"nd:flex nd:items-center nd:gap-1.5 nd:text-xs nd:font-medium nd:bg-muted nd:rounded-full nd:pl-2.5 nd:pr-1.5 nd:py-1\">\n <span>{selectedFileIds.length} selected</span>\n <button\n type=\"button\"\n onClick={() => setSelectedFiles([])}\n className=\"nd:text-muted-foreground nd:hover:text-foreground nd:rounded-full nd:hover:bg-background/80 nd:p-0.5\"\n aria-label=\"Clear selection\"\n >\n <X className=\"nd:size-3.5\" />\n </button>\n </div>\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 setSelectedFiles([]);\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 <DriveConfirm\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 <DriveConfirm\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 <DriveFolderCreate\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/use-upload';\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/modal';\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 case 'conflict':\n return <AlertCircle className=\"nd:size-4 nd:text-amber-500\" />;\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, items, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, cancelUpload, cancelAllUploads, resolveConflict, resolveAllConflicts } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem, replaced) => {\n // Optimistically surface the uploaded item. On replace, drop the old same-name file; otherwise dedupe by id.\n if (uploadedItem) {\n const item = uploadedItem as TDatabaseDrive;\n setItems(prev => [item, ...prev.filter(i => replaced ? !(i.parentId === item.parentId && i.name === item.name) : i.id !== item.id)]);\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, items);\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }, [uploadFiles, currentFolderId, items, 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 => ['conflict', 'uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['conflict', 'uploading', 'queued', 'pending'].includes(u.status));\n const conflictCount = uploads.filter(u => u.status === 'conflict').length;\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 {conflictCount > 1 && (\n <div className=\"nd:px-4 nd:py-2 nd:border-b nd:bg-amber-500/5 nd:flex nd:items-center nd:gap-2\">\n <span className=\"nd:text-xs nd:text-muted-foreground nd:flex-1\">{conflictCount} files already exist. Apply to all:</span>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('skip')}>Skip</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('rename')}>Both</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('replace')}>Duplicate</Button>\n </div>\n )}\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' ? 0 : Math.round(upload.percent ?? 0);\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 === 'conflict' && 'Already exists in this folder'}\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 === 'conflict' && (\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:pl-6\">\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'skip')}>Skip</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'rename')}>Both</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'replace')}>Duplicate</Button>\n </div>\n )}\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, useRef } from 'react';\nimport type { TDriveFile } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/use-upload';\nimport { cn, getFileIcon, getFileFormat, formatBytes } from '@/client/utils';\nimport { useStyleInjector } from './style-injector';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport { Progress } from '@/client/components/ui/progress';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/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/modal\";\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveAccountRename } from '@/client/components/drive/account/rename';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd/context';\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 || 'Could not start Google Drive 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('Could not connect to Google Drive. 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 <DriveAccountRename\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DriveConfirm\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 maxFiles?: number;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n allowUnauthenticated?: boolean;\n}>) => {\n // ** Deconstruct Props\n const {\n value = null, onChange, multiple = false, maxFiles, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText, allowUnauthenticated = false\n } = props;\n\n const { selectedFiles, setSelectedFiles, setSelectionMode, createUrl, triggerFetch, apiEndpoint, activeAccountId, withCredentials, callAPI } = useDrive();\n useStyleInjector();\n const [isOpen, setIsOpen] = useState(false);\n\n // ** Auth-aware mode: when logged in show the drive explorer, otherwise fall back to a one-time anonymous upload.\n // null = probing, true = logged in (browse), false = anonymous (one-time upload)\n const fileInputRef = useRef<HTMLInputElement>(null);\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const [authed, setAuthed] = useState<boolean | null>(allowUnauthenticated ? null : true);\n useEffect(() => {\n if (!allowUnauthenticated) return;\n callAPI<{ authenticated: boolean }>('information').then(res => setAuthed(res.status === 200 ? !!res.data?.authenticated : false));\n }, [allowUnauthenticated, callAPI]);\n const unauthenticatedMode = allowUnauthenticated && authed === false;\n\n const handleUploaded = useCallback((item: any) => {\n const isFile = item?.information?.type === 'FILE';\n const uploaded: TDriveFile = {\n id: item.id,\n isFolder: !isFile,\n file: { name: item.name, mime: isFile ? item.information.mime : '', size: isFile ? item.information.sizeInBytes : 0 },\n };\n const current = valueRef.current;\n if (multiple) {\n const arr = Array.isArray(current) ? current : current ? [current] : [];\n onChange([...arr, uploaded]);\n } else {\n onChange(uploaded);\n }\n }, [multiple, onChange]);\n\n const { uploads, uploadFiles } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded);\n\n const openPicker = useCallback(() => {\n if (unauthenticatedMode) fileInputRef.current?.click();\n else setIsOpen(true);\n }, [unauthenticatedMode]);\n\n const handleFilePick = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(e.target.files ?? []);\n if (picked.length) uploadFiles(multiple ? picked : [picked[0]], null, []);\n e.target.value = '';\n }, [uploadFiles, multiple]);\n\n const activeUploads = unauthenticatedMode ? uploads.filter(u => ['queued', 'uploading', 'error'].includes(u.status)) : [];\n\n // Keep selection mode in sync with the multiple/maxFiles props\n useEffect(() => {\n setSelectionMode(multiple ? { type: 'MULTIPLE', ...(maxFiles ? { maxFile: maxFiles } : {}) } : { type: 'SINGLE' });\n }, [multiple, maxFiles, setSelectionMode]);\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) setSelectedFiles([]);\n else if (Array.isArray(value)) setSelectedFiles(value);\n else setSelectedFiles([value]);\n }\n }, [isOpen, value, setSelectedFiles, triggerFetch]);\n\n const selectableFiles = useMemo(() => selectedFiles.filter(f => !f.isFolder), [selectedFiles]);\n\n const handleConfirm = useCallback(() => {\n onChange(multiple ? selectableFiles : selectableFiles[0] || null);\n setIsOpen(false);\n }, [selectableFiles, 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 nd:min-w-0\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={openPicker}\n disabled={disabled || (allowUnauthenticated && authed === null)}\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] && displayFiles[0].file && (\n <div className=\"nd:flex nd:items-center nd:gap-3 nd:p-2.5 nd:min-w-0\">\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 || 'Unknown'}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {getFileFormat(displayFiles[0].file.mime)}\n {displayFiles[0].file.size ? ` · ${formatBytes(displayFiles[0].file.size)}` : ''}\n </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={openPicker} 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={openPicker} 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.filter(file => file?.file).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 nd:min-w-0\">\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 <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{file.file.name || 'Unknown'}</p>\n <p className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">\n {getFileFormat(file.file.mime)}\n {file.file.size ? ` · ${formatBytes(file.file.size)}` : ''}\n </p>\n </div>\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 {/* Unauthenticated one-time upload */}\n {unauthenticatedMode && (\n <input ref={fileInputRef} type=\"file\" accept={accept} multiple={multiple} className=\"nd:hidden\" onChange={handleFilePick} />\n )}\n {activeUploads.length > 0 && (\n <div className=\"nd:mt-2 nd:space-y-2\">\n {activeUploads.map(u => (\n <div key={u.id} className=\"nd:rounded-lg nd:border nd:px-3 nd:py-2\">\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:min-w-0\">\n {u.status === 'error'\n ? <X className=\"nd:size-4 nd:text-destructive nd:shrink-0\" />\n : <Loader2 className=\"nd:size-4 nd:animate-spin nd:text-muted-foreground nd:shrink-0\" />}\n <span className=\"nd:text-sm nd:truncate nd:flex-1 nd:min-w-0\">{u.name}</span>\n <span className=\"nd:text-xs nd:text-muted-foreground nd:shrink-0\">\n {u.status === 'error' ? 'Failed' : `${Math.round(u.percent ?? 0)}%`}\n </span>\n </div>\n {u.status !== 'error' && (\n <Progress value={Math.round(u.percent ?? 0)} className=\"nd:mt-1.5\" />\n )}\n {u.status === 'error' && u.error && (\n <p className=\"nd:text-xs nd:text-destructive nd:mt-1\">{u.error}</p>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content\n showCloseButton={false}\n className=\"nd-drive-root\"\n onEscapeKeyDown={(e) => {\n // Let Escape clear an in-progress keyboard selection first; only close the\n // dialog on a second Escape once nothing is selected (grid's own handler\n // can't stop Radix's dismissal since it listens on the document).\n if (selectedFiles.length > 0) {\n e.preventDefault();\n setSelectedFiles([]);\n }\n }}\n >\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 {/* Selected files tray - persists across folder navigation (folders can't be picked, so they're excluded) */}\n {multiple && selectableFiles.length > 0 && (\n <div className=\"nd:border-t nd:px-3 nd:py-2 nd:bg-muted/20 nd:dark:bg-muted/10\">\n <div className=\"nd:flex nd:items-center nd:justify-between nd:mb-1.5\">\n <span className=\"nd:text-xs nd:font-medium nd:text-muted-foreground\">\n {selectableFiles.length}{maxFiles ? ` / ${maxFiles}` : ''} selected\n </span>\n {maxFiles && selectableFiles.length >= maxFiles && (\n <span className=\"nd:text-[11px] nd:font-medium nd:text-amber-600 nd:dark:text-amber-500\">Max {maxFiles} files</span>\n )}\n </div>\n <div className=\"nd:flex nd:gap-2 nd:overflow-x-auto nd:pt-2 nd:pr-2 nd:pb-1\">\n {selectableFiles.filter(file => file?.file).map(file => (\n <div key={file.id} className=\"nd:relative nd:shrink-0 group\">\n <div className=\"nd:size-16 nd:rounded-lg nd:overflow-hidden nd:bg-muted/30 nd:border nd:flex nd:items-center nd:justify-center\">\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-7 nd:text-muted-foreground\")\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setSelectedFiles(prev => prev.filter(f => f.id !== file.id))}\n className=\"nd:absolute nd:-top-1.5 nd:-right-1.5 nd:size-5 nd:rounded-full nd:bg-foreground nd:text-background nd:flex nd:items-center nd:justify-center nd:shadow nd:hover:scale-110 nd:transition-transform\"\n aria-label={`Remove ${file.file.name || 'file'}`}\n >\n <X className=\"nd:size-3\" />\n </button>\n <p className=\"nd:mt-1 nd:w-16 nd:text-[10px] nd:text-muted-foreground nd:truncate nd:text-center\" title={file.file.name}>{file.file.name}</p>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectableFiles.length === 0}>\n Select{selectableFiles.length > 0 ? ` (${selectableFiles.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/modal\";\nimport { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveAccountRename } from '@/client/components/drive/account/rename';\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 || 'Could not start Google Drive 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('Could not connect to Google Drive. 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 <DriveAccountRename\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DriveConfirm\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 - Standalone all-in-one explorer; composes DriveFileGrid (which already\n// owns selection, marquee, DnD, dialogs and context menus) with the surrounding chrome.\n'use client';\n\nimport React from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\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 { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd/context';\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className } = props;\n\n return (\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 <DriveDndProvider>\n <DriveFileGrid\n mimeFilter={mimeFilter}\n className={className}\n onItemClick={onItemClick}\n onItemDoubleClick={onItemDoubleClick}\n />\n </DriveDndProvider>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../../src/client/context.tsx","../../src/client/upload.ts","../../src/client/hooks/use-upload.ts","../../src/client/style-injector.ts","../../src/client/components/ui/button.tsx","../../src/client/components/ui/progress.tsx","../../src/client/components/ui/fullscreen.tsx","../../src/client/components/ui/sheet.tsx","../../src/client/components/ui/modal.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/shared/confirm.tsx","../../src/client/components/drive/account/rename.tsx","../../src/client/components/drive/dnd/context.tsx","../../src/client/components/ui/context-menu.tsx","../../src/client/components/drive/folder/create.tsx","../../src/client/components/drive/item/rename.tsx","../../src/client/hooks/use-marquee.ts","../../src/client/hooks/use-item-touch.ts","../../src/client/components/drive/file-grid.tsx","../../src/client/components/drive/dropzone.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":["React","MAX_CONCURRENT_UPLOADS","useState","useCallback","uploadFiles","useEffect","jsx","DialogPrimitive","React2","cva","jsxs","X","DialogPrimitive2","Label","AlertCircle","createContext","useContext","React5","ChevronRight","Check","Circle","useForm","useRef","useMemo","items","RotateCcw","Trash2","Group","Loader2","Fragment","UploadIcon","Pencil","RefreshCw","Menu","HardDrive","Database","ChevronsUpDown","Plus","Settings2","Trash","FolderOpen"],"mappings":"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","file":"index.js","sourcesContent":["// ** Client Context - Simplified & Optimistic\n'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport type { TDatabaseDrive, TDriveAPIResponse } from '@/types/server';\nimport type { TDrivePathItem, TDriveQuota, 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 setSelectionMode: React.Dispatch<React.SetStateAction<{ type: 'SINGLE' } | { type: 'MULTIPLE'; maxFile?: number }>>;\n selectedFiles: TDriveFile[];\n selectedFileIds: string[];\n setSelectedFiles: React.Dispatch<React.SetStateAction<TDriveFile[]>>;\n toggleSelected: (file: TDriveFile) => void;\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 = true\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, setSelectionMode] = useState(initialSelectionMode);\n const [selectedFiles, setSelectedFiles] = useState<TDriveFile[]>(\n () => defaultSelectedFileIds.map(id => ({ id, isFolder: false, file: { name: '', mime: '', size: 0 } }))\n );\n const selectedFileIds = useMemo(() => selectedFiles.map(f => f.id), [selectedFiles]);\n\n const toggleSelected = useCallback((file: TDriveFile) => {\n setSelectedFiles(prev => {\n const exists = prev.some(f => f.id === file.id);\n if (selectionMode.type === 'MULTIPLE') {\n if (exists) return prev.filter(f => f.id !== file.id);\n if (selectionMode.maxFile && prev.length >= selectionMode.maxFile) return prev;\n return [...prev, file];\n }\n return [file];\n });\n }, [selectionMode]);\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 try {\n return await res.json();\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : String(parseErr);\n return { status: res.status || 0, message: `Could not read the server response for \"${action}\" (${detail})` };\n }\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return { status: 0, message: `Network request failed for \"${action}\" (${detail})` };\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 || 'Could not load your files');\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 setSelectedFiles([]);\n }, []);\n\n const navigateToFolder = useCallback((item: { id: string | null; name: string } | null) => {\n setCurrentView('BROWSE');\n setSearchQuery('');\n if (selectionMode.type === 'SINGLE') setSelectedFiles([]);\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 }, [selectionMode]);\n\n const navigateUp = useCallback(() => {\n if (path.length <= 1) return;\n setCurrentView('BROWSE');\n setSearchQuery('');\n if (selectionMode.type === 'SINGLE') setSelectedFiles([]);\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, selectionMode]);\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 setSelectedFiles(prev => prev.filter(f => f.id !== 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 setSelectedFiles(prev => prev.filter(f => f.id !== 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 setSelectionMode,\n selectedFiles,\n selectedFileIds,\n setSelectedFiles,\n toggleSelected,\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","// ** Native (headless) Upload Engine — powered by the tus resumable upload protocol\r\n'use client';\r\n\r\nimport * as tus from 'tus-js-client';\r\nimport type {\r\n TDriveFile,\r\n TDriveUploadOptions,\r\n TDriveUploadHandle,\r\n TDriveUploadResult,\r\n TDriveBatchOptions,\r\n TDriveBatchHandle,\r\n} from '@/types/client';\r\n\r\n// ** Constants\r\nconst MAX_CONCURRENT_UPLOADS = 2;\r\n\r\n// ** Dynamic chunk sizing based on file size (tus PATCH body size)\r\nconst getChunkSize = (fileSize: number) => {\r\n if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;\r\n if (fileSize < 200 * 1024 * 1024) return 4 * 1024 * 1024;\r\n if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;\r\n return 16 * 1024 * 1024;\r\n};\r\n\r\nconst generateId = () => `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n\r\n// ** Normalize a raw server item into the public TDriveFile shape\r\nconst toDriveFile = (item: any): TDriveFile => {\r\n const isFile = item?.information?.type === 'FILE';\r\n return {\r\n id: item?.id,\r\n isFolder: !isFile,\r\n file: {\r\n name: item?.name,\r\n mime: isFile ? item.information.mime : '',\r\n size: isFile ? item.information.sizeInBytes : 0,\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Upload a single file using the tus resumable protocol, with byte-level progress, logging and\r\n * cancellation.\r\n *\r\n * Returns a handle immediately; the upload starts right away. Use `handle.cancel()` to abort (which\r\n * also terminates the upload on the server) and `handle.promise` to await the final result. Omit\r\n * `accountId` to upload anonymously (the server resolves anonymous uploads automatically when\r\n * enabled).\r\n *\r\n * Because tus tracks progress by byte offset, an interrupted upload resumes exactly where it left\r\n * off instead of restarting or failing — even for multi-GB files on flaky connections.\r\n */\r\nexport const uploadFile = (options: TDriveUploadOptions): TDriveUploadHandle => {\r\n const {\r\n apiEndpoint,\r\n file,\r\n folderId = null,\r\n accountId = null,\r\n withCredentials = false,\r\n conflictAction,\r\n signal,\r\n onProgress,\r\n onLog,\r\n onComplete,\r\n } = options;\r\n\r\n const id = options.id ?? generateId();\r\n const endpoint = `${apiEndpoint.replace(/\\/$/, '')}?action=upload`;\r\n const chunkSize = getChunkSize(file.size);\r\n const totalChunks = Math.max(1, Math.ceil(file.size / chunkSize));\r\n\r\n const log = (type: 'info' | 'warning' | 'error' | 'success', message: string) =>\r\n onLog?.({ id, type, message, timestamp: Date.now() });\r\n\r\n let settle: (result: TDriveUploadResult) => void = () => {};\r\n const promise = new Promise<TDriveUploadResult>(resolve => {\r\n settle = resolve;\r\n });\r\n\r\n let completedItem: any;\r\n let cancelled = false;\r\n\r\n const metadata: Record<string, string> = {\r\n filename: file.name,\r\n filetype: file.type || 'application/octet-stream',\r\n folderId: folderId || 'root',\r\n };\r\n if (conflictAction) metadata.conflictAction = conflictAction;\r\n\r\n const upload = new tus.Upload(file, {\r\n endpoint,\r\n chunkSize,\r\n // ** Retry with backoff. On a dropped connection tus first re-checks the server offset (HEAD)\r\n // ** and resumes from there — this is what prevents the \"session expired\" failures at ~100%.\r\n retryDelays: [0, 1000, 3000, 5000, 10000],\r\n removeFingerprintOnSuccess: true,\r\n metadata,\r\n headers: accountId ? { 'x-drive-account': accountId } : {},\r\n onBeforeRequest(req) {\r\n // ** Send cookies with cross-origin requests when requested (tus has no dedicated option).\r\n if (withCredentials) {\r\n const xhr = req.getUnderlyingObject();\r\n if (xhr && 'withCredentials' in xhr) xhr.withCredentials = true;\r\n }\r\n },\r\n onShouldRetry(err) {\r\n const status = (err as tus.DetailedError)?.originalResponse?.getStatus?.() ?? 0;\r\n // ** Validation/auth/quota errors are permanent — do not retry them.\r\n if ([400, 401, 403, 413].includes(status)) {\r\n log('error', `Non-retryable error (status ${status})`);\r\n return false;\r\n }\r\n log('warning', `Upload interrupted (status ${status}), retrying`);\r\n return true;\r\n },\r\n onProgress(bytesUploaded, bytesTotal) {\r\n const percent = bytesTotal === 0 ? 100 : Math.min(100, Math.round((bytesUploaded / bytesTotal) * 100));\r\n onProgress?.({\r\n id,\r\n percent,\r\n uploadedBytes: bytesUploaded,\r\n totalBytes: bytesTotal,\r\n currentChunk: Math.min(totalChunks, Math.floor(bytesUploaded / chunkSize)),\r\n totalChunks,\r\n });\r\n },\r\n onAfterResponse(_req, res) {\r\n // ** The server returns the created drive item as a header on the final response.\r\n const header = res.getHeader('X-Drive-Item');\r\n if (header) {\r\n try {\r\n completedItem = JSON.parse(decodeURIComponent(header));\r\n } catch {\r\n /* ignore malformed header */\r\n }\r\n }\r\n },\r\n onSuccess() {\r\n log('success', 'Upload completed successfully');\r\n if (completedItem !== undefined) onComplete?.(completedItem);\r\n settle({ id, status: 'complete', driveId: completedItem?.id ?? '', file: toDriveFile(completedItem), item: completedItem });\r\n },\r\n onError(error) {\r\n const message = error instanceof Error ? error.message : 'Upload failed';\r\n log('error', `Upload failed: ${message}`);\r\n settle({ id, status: 'error', driveId: null, error: message });\r\n },\r\n });\r\n\r\n const cancel = () => {\r\n if (cancelled) return;\r\n cancelled = true;\r\n // ** abort(true) also terminates the upload on the server (tus DELETE).\r\n upload.abort(true).catch(() => {});\r\n settle({ id, status: 'cancelled', driveId: null });\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) cancel();\r\n else signal.addEventListener('abort', cancel, { once: true });\r\n }\r\n\r\n log('info', `Starting upload: ${file.name} (${file.size} bytes)`);\r\n upload.start();\r\n\r\n return { id, promise, cancel };\r\n};\r\n\r\n/**\r\n * Upload multiple files with a bounded concurrency pool.\r\n *\r\n * Returns immediately with one handle per file (each exposes its own `cancel` and\r\n * `promise`), plus `cancelAll` and an aggregate `promise` that resolves once every\r\n * file has settled.\r\n */\r\nexport const uploadFiles = (files: File[], options: TDriveBatchOptions): TDriveBatchHandle => {\r\n const { concurrency = MAX_CONCURRENT_UPLOADS, onFileComplete, ...base } = options;\r\n const slots = Math.max(1, concurrency);\r\n\r\n type Entry = {\r\n id: string;\r\n file: File;\r\n cancelRequested: boolean;\r\n real: TDriveUploadHandle | null;\r\n settle: (result: TDriveUploadResult) => void;\r\n };\r\n\r\n const entries: Entry[] = [];\r\n const handles: TDriveUploadHandle[] = [];\r\n\r\n files.forEach(file => {\r\n const id = generateId();\r\n const entry: Entry = { id, file, cancelRequested: false, real: null, settle: () => { } };\r\n const promise = new Promise<TDriveUploadResult>(resolve => { entry.settle = resolve; });\r\n entries.push(entry);\r\n handles.push({\r\n id,\r\n promise,\r\n cancel: () => {\r\n entry.cancelRequested = true;\r\n entry.real?.cancel();\r\n },\r\n });\r\n });\r\n\r\n const results: TDriveUploadResult[] = [];\r\n let resolveAll: (results: TDriveUploadResult[]) => void = () => { };\r\n const allPromise = new Promise<TDriveUploadResult[]>(resolve => { resolveAll = resolve; });\r\n\r\n let nextIndex = 0;\r\n let active = 0;\r\n let settledCount = 0;\r\n let cancelledAll = false;\r\n\r\n const finalize = (entry: Entry, result: TDriveUploadResult) => {\r\n entry.settle(result);\r\n results.push(result);\r\n onFileComplete?.(result);\r\n settledCount++;\r\n if (settledCount === entries.length) resolveAll(results);\r\n };\r\n\r\n const startNext = () => {\r\n while (active < slots && nextIndex < entries.length) {\r\n const entry = entries[nextIndex++];\r\n\r\n if (entry.cancelRequested || cancelledAll) {\r\n finalize(entry, { id: entry.id, status: 'cancelled', driveId: null });\r\n continue;\r\n }\r\n\r\n active++;\r\n const handle = uploadFile({ ...base, file: entry.file, id: entry.id });\r\n entry.real = handle;\r\n if (entry.cancelRequested) handle.cancel();\r\n\r\n handle.promise.then(result => {\r\n active--;\r\n finalize(entry, result);\r\n startNext();\r\n });\r\n }\r\n };\r\n\r\n if (entries.length === 0) resolveAll(results);\r\n else startNext();\r\n\r\n return {\r\n uploads: handles,\r\n cancelAll: () => {\r\n cancelledAll = true;\r\n entries.forEach(entry => {\r\n entry.cancelRequested = true;\r\n entry.real?.cancel();\r\n });\r\n },\r\n promise: allPromise,\r\n };\r\n};\r\n","// ** Upload Hook\n'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { TDriveUploadState } from '@/types/client';\nimport type { TDatabaseDrive } from '@/types/server';\nimport { uploadFile } from '@/client/upload';\n\n// ** Constants\nconst MAX_CONCURRENT_UPLOADS = 2;\n\nexport const useUpload = (apiEndpoint: string, activeAccountId: string | null, withCredentials: boolean = false, onUploadComplete?: (item: unknown, replaced?: boolean) => void) => {\n const [uploads, setUploads] = useState<TDriveUploadState[]>([]);\n\n // ** Active upload handles + queued file data\n const handles = useRef<Map<string, { cancel: () => void }>>(new Map());\n const filesRef = useRef<Map<string, File>>(new Map());\n const metaRef = useRef<Map<string, { folderId: string | null; conflictAction?: 'rename' | 'replace' }>>(new Map());\n const startedRef = useRef<Set<string>>(new Set());\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 startUpload = useCallback(\n (item: TDriveUploadState) => {\n const file = filesRef.current.get(item.id);\n const meta = metaRef.current.get(item.id);\n if (!file) return;\n\n updateUpload(item.id, { status: 'uploading' });\n\n const handle = uploadFile({\n apiEndpoint,\n file,\n folderId: meta?.folderId ?? null,\n accountId: activeAccountId,\n withCredentials,\n conflictAction: meta?.conflictAction,\n id: item.id,\n onLog: ({ type, message }) => addLog(item.id, type, message),\n onProgress: ({ percent, currentChunk, totalChunks }) =>\n updateUpload(item.id, { percent, currentChunk, totalChunks }),\n onComplete: uploaded => onUploadComplete?.(uploaded, meta?.conflictAction === 'replace'),\n });\n\n handles.current.set(item.id, { cancel: handle.cancel });\n\n handle.promise.then(result => {\n handles.current.delete(item.id);\n if (result.status === 'complete') {\n updateUpload(item.id, { status: 'complete', percent: 100, driveId: result.driveId });\n } else if (result.status === 'cancelled') {\n updateUpload(item.id, { status: 'cancelled' });\n } else {\n updateUpload(item.id, { status: 'error', error: result.error });\n }\n });\n },\n [apiEndpoint, activeAccountId, withCredentials, onUploadComplete, addLog, updateUpload],\n );\n\n const uploadFiles = useCallback((files: File[], folderId: string | null, existingItems: TDatabaseDrive[]) => {\n // ** Names already taken in this folder, growing as we walk the batch so same-name picks also collide\n const takenNames = new Set(existingItems.filter(i => i.information.type === 'FILE' && i.parentId === folderId).map(i => i.name));\n\n const newUploads: TDriveUploadState[] = files.map(file => {\n const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n filesRef.current.set(id, file);\n metaRef.current.set(id, { folderId });\n\n const conflicts = takenNames.has(file.name);\n takenNames.add(file.name);\n\n return {\n id,\n name: file.name,\n size: file.size,\n status: conflicts ? 'conflict' : 'queued',\n currentChunk: 0,\n totalChunks: 1,\n percent: 0,\n logs: [],\n };\n });\n\n setUploads(prev => [...prev, ...newUploads]);\n }, []);\n\n // ** Surface files skipped by client-side validation (e.g. accept/mime filter) as error entries in\n // the same status list, instead of silently dropping them - keeps drag-drop and click-to-upload\n // feedback consistent and visible in the existing uploads dialog.\n const addRejectedFiles = useCallback((entries: Array<{ file: File; reason: string }>) => {\n if (entries.length === 0) return;\n const rejectedUploads: TDriveUploadState[] = entries.map(({ file, reason }) => ({\n id: `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n name: file.name,\n size: file.size,\n status: 'error',\n currentChunk: 0,\n totalChunks: 1,\n percent: 0,\n error: reason,\n logs: [],\n }));\n setUploads(prev => [...prev, ...rejectedUploads]);\n }, []);\n\n const resolveConflict = useCallback((id: string, action: 'skip' | 'rename' | 'replace') => {\n if (action === 'skip') {\n updateUpload(id, { status: 'cancelled' });\n return;\n }\n const meta = metaRef.current.get(id);\n if (meta) metaRef.current.set(id, { ...meta, conflictAction: action });\n updateUpload(id, { status: 'queued' });\n }, [updateUpload]);\n\n const resolveAllConflicts = useCallback((action: 'skip' | 'rename' | 'replace') => {\n setUploads(prev => prev.map(u => {\n if (u.status !== 'conflict') return u;\n if (action === 'skip') return { ...u, status: 'cancelled' };\n const meta = metaRef.current.get(u.id);\n if (meta) metaRef.current.set(u.id, { ...meta, conflictAction: action });\n return { ...u, status: 'queued' };\n }));\n }, []);\n\n const cancelUpload = useCallback(\n (id: string) => {\n const handle = handles.current.get(id);\n if (handle) handle.cancel();\n else updateUpload(id, { status: 'cancelled' });\n },\n [updateUpload],\n );\n\n const cancelAllUploads = useCallback(async () => {\n uploads.forEach(u => {\n if (['conflict', '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 if (activeCount >= MAX_CONCURRENT_UPLOADS) return;\n\n const queued = uploads.find(u => u.status === 'queued' && !startedRef.current.has(u.id));\n if (queued) {\n startedRef.current.add(queued.id);\n startUpload(queued);\n }\n }, [uploads, startUpload]);\n\n return { uploads, uploadFiles, addRejectedFiles, cancelUpload, cancelAllUploads, resolveConflict, resolveAllConflicts };\n};\n","'use client';\n\nimport { useEffect } from 'react';\n\n// This placeholder will be replaced by the build script with the actual CSS content\nconst cssContent = '__ND_STYLES_PLACEHOLDER__';\nconst styleId = 'nd-injected-styles';\n\nexport const useStyleInjector = () => {\n useEffect(() => {\n if (typeof document !== 'undefined' && !document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = cssContent;\n document.head.appendChild(style);\n }\n }, []);\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 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 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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-drive-root 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/modal\";\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 DriveConfirm = <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\n type=\"button\"\n variant=\"outline\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void handleConfirm();\n }}\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/modal';\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 DriveAccountRename = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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 PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent\n} from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\n\n// ** Context for sharing drag state\ntype DriveDndContextType = {\n dragOverFolderId: string | null;\n draggingItemId: string | null;\n cutIds: string[];\n cutSelection: (ids: string[]) => void;\n clearCut: () => void;\n pasteSelection: (targetFolderId: string) => Promise<void>;\n};\n\nconst DriveDndContext = createContext<DriveDndContextType>({\n dragOverFolderId: null,\n draggingItemId: null,\n cutIds: [],\n cutSelection: () => { },\n clearCut: () => { },\n pasteSelection: async () => { }\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, selectedFileIds, setSelectedFiles } = useDrive();\n\n const [dragOverFolderId, setDragOverFolderId] = useState<string | null>(null);\n const [draggingItemId, setDraggingItemId] = useState<string | null>(null);\n const [cutIds, setCutIds] = useState<string[]>([]);\n\n // ** Move a specific set of ids into a target folder (shared by drag-drop and keyboard paste)\n const moveIds = useCallback(async (ids: string[], targetFolderId: string) => {\n if (ids.length === 1) return moveItem(ids[0], targetFolderId);\n setItems(prev => prev.filter(i => !ids.includes(i.id)));\n setSelectedFiles([]);\n await callAPI('move', { method: 'POST', body: JSON.stringify({ ids, targetFolderId }) });\n }, [moveItem, setItems, setSelectedFiles, callAPI]);\n\n // ** Move the dragged item, or the whole selection if the dragged item is part of it\n const moveSelection = useCallback(async (activeId: string, targetFolderId: string) => {\n const ids = selectedFileIds.includes(activeId) && selectedFileIds.length > 1 ? selectedFileIds : [activeId];\n return moveIds(ids, targetFolderId);\n }, [selectedFileIds, moveIds]);\n\n // ** Keyboard cut/paste - the accessible, native-feeling alternative to drag-drop for moving items\n const cutSelection = useCallback((ids: string[]) => setCutIds(ids), []);\n const clearCut = useCallback(() => setCutIds([]), []);\n const pasteSelection = useCallback(async (targetFolderId: string) => {\n if (!cutIds.length) return;\n await moveIds(cutIds, targetFolderId);\n setCutIds([]);\n }, [cutIds, moveIds]);\n\n // ** Dnd Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } })\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 moveSelection(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 moveSelection(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, moveSelection, callAPI]);\n\n // Only enable DnD in browse mode\n const enableDnd = currentView === 'BROWSE';\n\n return (\n <DriveDndContext.Provider value={{ dragOverFolderId, draggingItemId, cutIds, cutSelection, clearCut, pasteSelection }}>\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 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-drive-root 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-drive-root 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/modal';\nimport { Input } from '@/client/components/ui/input';\nimport { Label } from '@/client/components/ui/label';\n\ntype CreateFolderFormData = {\n name: string;\n};\n\nexport const DriveFolderCreate = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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/modal';\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 DriveItemRename = (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\n onSubmit={(e) => {\n e.stopPropagation();\n void handleSubmit(handleFormSubmit)(e);\n }}\n >\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={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\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","// ** useMarquee - Mouse rubber-band selection over a grid/list container\r\n'use client';\r\n\r\nimport React, { useState } from 'react';\r\n\r\n// Attach the returned `onMouseDown` to a `position: relative` scroll container and render\r\n// `overlay` inside it. Items to hit-test must carry a `data-marquee-id=\"<id>\"` attribute.\r\n// Dragging on empty space reports intersecting ids; an empty click reports [].\r\nexport const useMarquee = (onSelectIds: (ids: string[]) => void) => {\r\n const [box, setBox] = useState<{ left: number; top: number; width: number; height: number } | null>(null);\r\n\r\n const onMouseDown = (e: React.MouseEvent) => {\r\n // Only left button, and only when starting on empty space (not on an item).\r\n if (e.button !== 0 || (e.target as HTMLElement).closest('[data-marquee-id]')) return;\r\n\r\n const container = e.currentTarget as HTMLElement;\r\n const start = { x: e.clientX, y: e.clientY };\r\n let moved = false;\r\n\r\n const handleMove = (ev: MouseEvent) => {\r\n if (!moved && Math.abs(ev.clientX - start.x) < 4 && Math.abs(ev.clientY - start.y) < 4) return;\r\n moved = true;\r\n\r\n const left = Math.min(start.x, ev.clientX);\r\n const top = Math.min(start.y, ev.clientY);\r\n const right = Math.max(start.x, ev.clientX);\r\n const bottom = Math.max(start.y, ev.clientY);\r\n\r\n const cRect = container.getBoundingClientRect();\r\n setBox({\r\n left: left - cRect.left + container.scrollLeft,\r\n top: top - cRect.top + container.scrollTop,\r\n width: right - left,\r\n height: bottom - top,\r\n });\r\n\r\n const ids: string[] = [];\r\n container.querySelectorAll<HTMLElement>('[data-marquee-id]').forEach(el => {\r\n const r = el.getBoundingClientRect();\r\n if (r.left < right && r.right > left && r.top < bottom && r.bottom > top) ids.push(el.dataset.marqueeId!);\r\n });\r\n onSelectIds(ids);\r\n };\r\n\r\n const handleUp = () => {\r\n window.removeEventListener('mousemove', handleMove);\r\n window.removeEventListener('mouseup', handleUp);\r\n if (!moved) onSelectIds([]); // empty-space click clears selection\r\n setBox(null);\r\n };\r\n\r\n window.addEventListener('mousemove', handleMove);\r\n window.addEventListener('mouseup', handleUp);\r\n };\r\n\r\n const overlay = box ? React.createElement('div', {\r\n className: 'nd:absolute nd:z-50 nd:rounded-sm nd:border nd:border-primary nd:bg-primary/10 nd:pointer-events-none',\r\n style: { left: box.left, top: box.top, width: box.width, height: box.height },\r\n }) : null;\r\n\r\n return { onMouseDown, overlay };\r\n};\r\n","// ** useItemTouch - Native tap vs. long-press detection for touch devices\r\n'use client';\r\n\r\nimport { useRef } from 'react';\r\n\r\n// Tap fires onTap; holding still for ~500ms fires onLongPress instead (and suppresses the tap).\r\n// Movement beyond a small threshold cancels the long-press (matches native touch behavior).\r\nexport const useItemTouch = (onTap: () => void, onLongPress: () => void) => {\r\n const start = useRef<{ x: number; y: number } | null>(null);\r\n const timer = useRef<ReturnType<typeof setTimeout>>();\r\n const fired = useRef(false);\r\n\r\n const onTouchStart = (e: React.TouchEvent) => {\r\n const t = e.touches[0];\r\n start.current = { x: t.clientX, y: t.clientY };\r\n fired.current = false;\r\n timer.current = setTimeout(() => { fired.current = true; onLongPress(); }, 500);\r\n };\r\n\r\n const onTouchMove = (e: React.TouchEvent) => {\r\n if (!start.current) return;\r\n const t = e.touches[0];\r\n if (Math.abs(t.clientX - start.current.x) > 10 || Math.abs(t.clientY - start.current.y) > 10) {\r\n clearTimeout(timer.current);\r\n start.current = null;\r\n }\r\n };\r\n\r\n const onTouchEnd = (e: React.TouchEvent) => {\r\n clearTimeout(timer.current);\r\n if (start.current && !fired.current) { e.preventDefault(); onTap(); }\r\n start.current = null;\r\n };\r\n\r\n return { onTouchStart, onTouchMove, onTouchEnd };\r\n};\r\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/context';\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveFolderCreate } from '@/client/components/drive/folder/create';\nimport { DriveItemRename } from '@/client/components/drive/item/rename';\nimport {\n SortableContext,\n rectSortingStrategy,\n useSortable\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useMarquee } from '@/client/hooks/use-marquee';\nimport { useItemTouch } from '@/client/hooks/use-item-touch';\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 // Cell itself is not a tab stop (role=gridcell, tabIndex=-1) - the focusable widget lives inside\n // (FileItem's div), per the ARIA APG grid pattern. Overrides dnd-kit's default role='button'/tabIndex=0.\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n disabled,\n attributes: { role: 'gridcell', tabIndex: -1 }\n });\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} data-marquee-id={id} 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 hasSelection: boolean;\n isFocused: boolean;\n isCut: boolean;\n innerRef: (el: HTMLDivElement | null) => void;\n onSelect: () => void;\n onOpen: () => void;\n onRename: () => void;\n onDelete: () => void;\n onRestore?: () => void;\n}>) => {\n // ** Deconstruct Props\n const { item, isSelected, isDragOver, hasSelection, isFocused, isCut, innerRef, onSelect, onOpen, 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 // Native touch model: tap opens a folder only when nothing is selected yet (like a fresh browse),\n // otherwise (or on files) tap toggles selection. Long-press always toggles and starts a selection.\n const { onTouchStart, onTouchMove, onTouchEnd } = useItemTouch(\n () => (isFolder && currentView === 'BROWSE' && !hasSelection ? onOpen() : onSelect()),\n onSelect\n );\n\n return (\n <ContextMenu>\n <ContextMenuTrigger onContextMenu={(e) => e.stopPropagation()}>\n <div\n ref={innerRef}\n data-item-id={item.id}\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 isCut && \"nd:opacity-50\"\n )}\n onClick={onSelect}\n onDoubleClick={onOpen}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n role=\"button\"\n aria-selected={isSelected}\n tabIndex={isFocused ? 0 : -1}\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 onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n}>) => {\n // ** Deconstruct Props\n const { mimeFilter, className, onItemClick, onItemDoubleClick } = props;\n\n const {\n items, isLoading, error, currentFolderId,\n viewMode, groupBy, sortBy,\n selectedFileIds, toggleSelected, setSelectedFiles, selectionMode,\n navigateToFolder, hasMore, loadMore, isLoadingMore,\n currentView, createFolder, renameItem: renameItemAction, deleteItem, restoreItem\n } = useDrive();\n\n // Get drag state (and cut/paste actions) from shared context\n const { dragOverFolderId, cutIds, cutSelection, clearCut, pasteSelection } = useDriveDnd();\n\n // ** Marquee (rubber-band) selection\n const { onMouseDown: marqueeMouseDown, overlay: marqueeOverlay } = useMarquee((ids) => {\n let files = items.filter(i => ids.includes(i.id)).map(i => ({\n id: i.id,\n isFolder: i.information.type === 'FOLDER',\n file: {\n name: i.name,\n mime: i.information.type === 'FILE' ? i.information.mime : '',\n size: i.information.type === 'FILE' ? i.information.sizeInBytes : 0,\n },\n }));\n if (selectionMode.type === 'SINGLE') files = files.slice(0, 1);\n else if (selectionMode.maxFile) files = files.slice(0, selectionMode.maxFile);\n setSelectedFiles(files);\n });\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 // ** Keyboard navigation - roving tabindex (one focusable item at a time, per ARIA APG grid pattern)\n const [focusedId, setFocusedId] = React.useState<string | null>(null);\n const itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n const gridRef = useRef<HTMLDivElement>(null);\n const hadFocusRef = useRef(false);\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 // ** Flattened visual order (across groups) for arrow-key navigation - per the ARIA APG's reflowing\n // layout-grid pattern, the whole set is treated as one logical row regardless of column count.\n const flatItems = useMemo(() => Object.values(groupedItems).flat(), [groupedItems]);\n const effectiveFocusedId = flatItems.some(i => i.id === focusedId) ? focusedId : (flatItems[0]?.id ?? null);\n\n const focusItem = (id: string) => {\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n // Restore focus to the fallback item when the previously-focused one unmounts (e.g., navigating into\n // a folder replaces the whole item list) - otherwise focus silently falls back to <body> and all\n // further keyboard input is lost. Per ARIA APG's guidance on persistence of focus. Only acts when\n // focus has actually fallen back to <body> - if the user deliberately moved focus elsewhere (e.g., a\n // search box or dialog button), document.activeElement won't be <body> and this is a no-op.\n useEffect(() => {\n if (!hadFocusRef.current || !effectiveFocusedId) return;\n if (document.activeElement === document.body) focusItem(effectiveFocusedId);\n }, [flatItems]);\n\n // ** Handlers\n // Click/tap always toggles selection (files and folders alike); double-click/tap-to-open (touch, when\n // nothing is selected) opens folders instead - see FileItem's useItemTouch wiring for the touch side.\n const handleItemSelect = (item: TDatabaseDrive) => {\n // Don't select temp folders (being created)\n if (item.id.startsWith('temp-')) return;\n toggleSelected({\n id: item.id,\n isFolder: item.information.type === 'FOLDER',\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 onItemClick?.(item);\n };\n\n const handleItemOpen = (item: TDatabaseDrive) => {\n if (item.information.type === 'FOLDER' && currentView === 'BROWSE') navigateToFolder(item);\n else onItemDoubleClick?.(item);\n };\n\n // ** Grid keyboard interaction (ARIA APG grid pattern + native cut/paste move convention)\n const handleGridKeyDown = (e: React.KeyboardEvent) => {\n const isMeta = e.ctrlKey || e.metaKey;\n\n if (isMeta && e.key.toLowerCase() === 'x') {\n if (selectedFileIds.length > 0) { e.preventDefault(); cutSelection(selectedFileIds); }\n return;\n }\n if (isMeta && e.key.toLowerCase() === 'v') {\n e.preventDefault();\n pasteSelection(currentFolderId ?? 'root');\n return;\n }\n\n const currentIndex = effectiveFocusedId ? flatItems.findIndex(i => i.id === effectiveFocusedId) : -1;\n if (currentIndex === -1 && !['Escape'].includes(e.key)) return;\n\n const moveFocusTo = (index: number) => {\n const target = flatItems[Math.max(0, Math.min(flatItems.length - 1, index))];\n if (!target) return;\n focusItem(target.id);\n // Single-select: selection follows focus, per ARIA APG listbox/grid convention for single-select composites\n if (selectionMode.type === 'SINGLE') handleItemSelect(target);\n };\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n moveFocusTo(currentIndex + 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n moveFocusTo(currentIndex - 1);\n break;\n case 'Home':\n e.preventDefault();\n moveFocusTo(0);\n break;\n case 'End':\n e.preventDefault();\n moveFocusTo(flatItems.length - 1);\n break;\n case ' ':\n case 'Spacebar':\n e.preventDefault();\n if (flatItems[currentIndex]) handleItemSelect(flatItems[currentIndex]);\n break;\n case 'Enter':\n e.preventDefault();\n if (flatItems[currentIndex]) handleItemOpen(flatItems[currentIndex]);\n break;\n case 'Escape':\n // Clears selection/cut for the standalone explorer. Note: when this grid is inside a\n // Radix Dialog (the file-chooser), stopPropagation here can't stop the dialog's own\n // document-level Escape listener - that case is handled separately via the dialog's\n // onEscapeKeyDown prop, which is the documented way to override it.\n if (selectedFileIds.length > 0 || cutIds.length > 0) {\n e.stopPropagation();\n if (selectedFileIds.length > 0) setSelectedFiles([]);\n else clearCut();\n }\n break;\n default:\n break;\n }\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\n ref={gridRef}\n className={cn(\"nd:flex-1 nd:overflow-y-auto nd:min-h-0 nd:relative nd:p-2 nd:sm:p-3 nd:md:p-4\", className)}\n onMouseDown={marqueeMouseDown}\n onFocus={() => { hadFocusRef.current = true; }}\n onKeyDown={handleGridKeyDown}\n role=\"grid\"\n aria-label=\"Files and folders\"\n aria-multiselectable={selectionMode.type === 'MULTIPLE'}\n >\n {marqueeOverlay}\n {/* Live region - announces selection changes to screen reader / keyboard users */}\n <div className=\"nd:sr-only\" aria-live=\"polite\">\n {selectedFileIds.length > 0 ? `${selectedFileIds.length} selected` : ''}\n </div>\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\n role=\"row\"\n 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 hasSelection={selectedFileIds.length > 0}\n isFocused={effectiveFocusedId === item.id}\n isCut={cutIds.includes(item.id)}\n innerRef={(el) => { if (el) itemRefs.current.set(item.id, el); else itemRefs.current.delete(item.id); }}\n onSelect={() => { setFocusedId(item.id); handleItemSelect(item); }}\n onOpen={() => { setFocusedId(item.id); handleItemOpen(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\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 <DriveFolderCreate\n open={dialogs.newFolder}\n onClose={() => setDialogs(prev => ({ ...prev, newFolder: false }))}\n onConfirm={async (name) => {\n await createFolder(name);\n }}\n />\n\n <DriveItemRename\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 <DriveConfirm\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","// ** DriveDropZone - Wraps content (typically the file grid) and accepts OS file drops for upload.\r\n// Native HTML5 drag events (dragenter/over/leave/drop) are completely separate from dnd-kit's\r\n// pointer-based sensors used for in-grid reordering, so the two never conflict.\r\n'use client';\r\n\r\nimport React, { useState, useRef, useCallback } from 'react';\r\nimport { UploadCloud } from 'lucide-react';\r\nimport { cn } from '@/client/utils';\r\n\r\n// ** A drag only carries files when the browser reports the \"Files\" kind - this excludes internal\r\n// text/plain drags and other non-file drag sources.\r\nconst isFileDrag = (e: React.DragEvent) => Array.from(e.dataTransfer.types || []).includes('Files');\r\n\r\nexport const DriveDropZone = (props: Readonly<{\r\n children: React.ReactNode;\r\n // `skippedFolders` carries the names of any dropped directories - browsers report folders as\r\n // items in the drop, but they aren't real uploadable files (see onDrop below).\r\n onFilesDropped: (files: File[], skippedFolders?: string[]) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n}>) => {\r\n // ** Deconstruct Props\r\n const { children, onFilesDropped, disabled, className } = props;\r\n\r\n const [isDragging, setIsDragging] = useState(false);\r\n // Nested children fire dragenter/dragleave as the pointer crosses their boundaries - a counter\r\n // (rather than a boolean) avoids the overlay flickering off while still hovering the zone.\r\n const dragCounter = useRef(0);\r\n\r\n const onDragEnter = useCallback((e: React.DragEvent) => {\r\n if (!isFileDrag(e)) return;\r\n e.preventDefault(); e.stopPropagation();\r\n if (disabled) return;\r\n dragCounter.current += 1;\r\n setIsDragging(true);\r\n }, [disabled]);\r\n\r\n const onDragOver = useCallback((e: React.DragEvent) => {\r\n if (!isFileDrag(e)) return;\r\n // preventDefault is required for onDrop to fire at all - always call it (even when disabled)\r\n // so an accidental drop doesn't fall through to the browser's default \"open file\" navigation.\r\n e.preventDefault(); e.stopPropagation();\r\n }, []);\r\n\r\n const onDragLeave = useCallback((e: React.DragEvent) => {\r\n if (!isFileDrag(e)) return;\r\n e.preventDefault(); e.stopPropagation();\r\n if (disabled) return;\r\n dragCounter.current = Math.max(0, dragCounter.current - 1);\r\n if (dragCounter.current === 0) setIsDragging(false);\r\n }, [disabled]);\r\n\r\n const onDrop = useCallback((e: React.DragEvent) => {\r\n if (!isFileDrag(e)) return;\r\n e.preventDefault(); e.stopPropagation();\r\n dragCounter.current = 0;\r\n setIsDragging(false);\r\n if (disabled) return;\r\n\r\n // Prefer `items` + `webkitGetAsEntry()` (widely supported, incl. Safari) so dropped folders\r\n // can be told apart from real files - `dataTransfer.files` alone reports directories as\r\n // bogus zero-byte entries that would otherwise silently fail (or \"succeed\" as an empty,\r\n // wrongly-named file) once uploaded.\r\n const items = e.dataTransfer.items;\r\n if (items && items.length > 0 && typeof items[0]?.webkitGetAsEntry === 'function') {\r\n const files: File[] = [];\r\n const skippedFolders: string[] = [];\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n const entry = item.webkitGetAsEntry?.();\r\n if (entry?.isDirectory) { skippedFolders.push(entry.name); continue; }\r\n const file = item.getAsFile();\r\n if (file) files.push(file);\r\n }\r\n if (files.length > 0 || skippedFolders.length > 0) onFilesDropped(files, skippedFolders);\r\n return;\r\n }\r\n\r\n if (e.dataTransfer.files.length > 0) onFilesDropped(Array.from(e.dataTransfer.files));\r\n }, [disabled, onFilesDropped]);\r\n\r\n return (\r\n <div\r\n className={cn(\"nd:relative nd:min-h-0\", className)}\r\n onDragEnter={onDragEnter}\r\n onDragOver={onDragOver}\r\n onDragLeave={onDragLeave}\r\n onDrop={onDrop}\r\n >\r\n {children}\r\n\r\n {isDragging && !disabled && (\r\n <div\r\n className=\"nd:absolute nd:inset-0 nd:z-40 nd:flex nd:items-center nd:justify-center nd:pointer-events-none nd:bg-background/85 nd:dark:bg-background/90 nd:backdrop-blur-sm nd:animate-in nd:fade-in nd:duration-150\"\r\n aria-hidden=\"true\"\r\n >\r\n <div className=\"nd:flex nd:flex-col nd:items-center nd:gap-2.5 nd:text-center nd:px-6 nd:py-8 nd:rounded-xl nd:border-2 nd:border-dashed nd:border-primary nd:bg-primary/5 nd:mx-4\">\r\n <div className=\"nd:p-3 nd:rounded-full nd:bg-primary/10 nd:border nd:border-primary/30\">\r\n <UploadCloud className=\"nd:size-7 nd:text-primary\" />\r\n </div>\r\n <p className=\"nd:text-sm nd:font-medium nd:text-foreground\">Drop files here to upload</p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveFolderCreate } from '@/client/components/drive/folder/create';\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, setSelectedFiles,\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 {/* Selection Indicator - visible exit from a selection (esp. needed on mobile/long-press) */}\n {selectedFileIds.length > 0 && (\n <div className=\"nd:flex nd:items-center nd:gap-1.5 nd:text-xs nd:font-medium nd:bg-muted nd:rounded-full nd:pl-2.5 nd:pr-1.5 nd:py-1\">\n <span>{selectedFileIds.length} selected</span>\n <button\n type=\"button\"\n onClick={() => setSelectedFiles([])}\n className=\"nd:text-muted-foreground nd:hover:text-foreground nd:rounded-full nd:hover:bg-background/80 nd:p-0.5\"\n aria-label=\"Clear selection\"\n >\n <X className=\"nd:size-3.5\" />\n </button>\n </div>\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 setSelectedFiles([]);\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 <DriveConfirm\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 <DriveConfirm\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 <DriveFolderCreate\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/use-upload';\nimport { Upload as UploadIcon, X, Loader2, CheckCircle2, AlertCircle, Clock, RefreshCw, FileText } from 'lucide-react';\nimport { cn, matchesMimeFilter, getFileFormat } 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/modal';\nimport type { TDriveUploadState, TDriveUploadRef } 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 case 'conflict':\n return <AlertCircle className=\"nd:size-4 nd:text-amber-500\" />;\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 = React.forwardRef<TDriveUploadRef, Readonly<{\n compact?: boolean;\n onComplete?: (item: unknown) => void;\n accept?: string;\n}>>((props, ref) => {\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, items, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();\n const { uploads, uploadFiles, addRejectedFiles, cancelUpload, cancelAllUploads, resolveConflict, resolveAllConflicts } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem, replaced) => {\n // Optimistically surface the uploaded item. On replace, drop the old same-name file; otherwise dedupe by id.\n if (uploadedItem) {\n const item = uploadedItem as TDatabaseDrive;\n setItems(prev => [item, ...prev.filter(i => replaced ? !(i.parentId === item.parentId && i.name === item.name) : i.id !== item.id)]);\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 // Split dropped/selected files against the accept filter (mirrors matchesMimeFilter used for grid display)\n const partitionFiles = useCallback((files: File[]): { accepted: File[]; rejected: File[] } => {\n if (!accept) return { accepted: files, rejected: [] };\n const accepted: File[] = [];\n const rejected: File[] = [];\n for (const file of files) {\n (matchesMimeFilter(file.type, false, accept) ? accepted : rejected).push(file);\n }\n return { accepted, rejected };\n }, [accept]);\n\n const handleFiles = useCallback((files: FileList | File[] | null, skippedFolders: string[] = []) => {\n const fileArray = files ? Array.from(files) : [];\n if (fileArray.length === 0 && skippedFolders.length === 0) return;\n const { accepted, rejected } = partitionFiles(fileArray);\n\n // Surface unsupported files/folders instead of silently dropping them, so drag-drop gives the\n // same feedback as picking files manually. Folders can't be uploaded as-is (no recursive\n // directory upload support), so they're called out with their own reason.\n const rejectedEntries = [\n ...rejected.map(file => ({ file, reason: `${getFileFormat(file.type)} isn't accepted here` })),\n ...skippedFolders.map(name => ({ file: new File([], name), reason: \"Folders can't be uploaded - drop individual files instead\" })),\n ];\n if (rejectedEntries.length > 0) addRejectedFiles(rejectedEntries);\n if (accepted.length > 0) uploadFiles(accepted, currentFolderId, items);\n if (accepted.length > 0 || rejectedEntries.length > 0) {\n setManuallyOpened(false);\n setShowUploadsDialog(true);\n }\n }, [uploadFiles, addRejectedFiles, currentFolderId, items, partitionFiles]);\n\n // Expose handleFiles so an external drop zone (e.g. <DriveDropZone> wrapping the file grid) can\n // forward OS file drops into this same upload pipeline/dialog without duplicating upload state.\n React.useImperativeHandle(ref, () => ({ handleFiles }), [handleFiles]);\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 => ['conflict', 'uploading', 'queued', 'pending'].includes(u.status));\n const activeUploads = uploads.filter(u => ['conflict', 'uploading', 'queued', 'pending'].includes(u.status));\n const conflictCount = uploads.filter(u => u.status === 'conflict').length;\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 {conflictCount > 1 && (\n <div className=\"nd:px-4 nd:py-2 nd:border-b nd:bg-amber-500/5 nd:flex nd:items-center nd:gap-2\">\n <span className=\"nd:text-xs nd:text-muted-foreground nd:flex-1\">{conflictCount} files already exist. Apply to all:</span>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('skip')}>Skip</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('rename')}>Both</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveAllConflicts('replace')}>Duplicate</Button>\n </div>\n )}\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' ? 0 : Math.round(upload.percent ?? 0);\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 === 'conflict' && 'Already exists in this folder'}\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 === 'conflict' && (\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:pl-6\">\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'skip')}>Skip</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'rename')}>Both</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => resolveConflict(upload.id, 'replace')}>Duplicate</Button>\n </div>\n )}\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\nDriveUpload.displayName = 'DriveUpload';\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, useRef } from 'react';\nimport type { TDriveFile, TDriveUploadRef } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { useUpload } from '@/client/hooks/use-upload';\nimport { cn, getFileIcon, getFileFormat, formatBytes } from '@/client/utils';\nimport { useStyleInjector } from './style-injector';\n\n// ** UI Components\nimport { Button } from '@/client/components/ui/button';\nimport { Input } from '@/client/components/ui/input';\nimport { Progress } from '@/client/components/ui/progress';\nimport {\n Dialog2,\n Dialog2Content,\n Dialog2Header,\n Dialog2Body,\n Dialog2Footer,\n Dialog2Title,\n} from '@/client/components/ui/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/modal\";\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 { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveAccountRename } from '@/client/components/drive/account/rename';\n\n// ** Drive Components\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDropZone } from '@/client/components/drive/dropzone';\nimport { DriveDndProvider } from '@/client/components/drive/dnd/context';\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 || 'Could not start Google Drive 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('Could not connect to Google Drive. 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 <DriveAccountRename\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n <DriveConfirm\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 maxFiles?: number;\n accept?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n allowUnauthenticated?: boolean;\n}>) => {\n // ** Deconstruct Props\n const {\n value = null, onChange, multiple = false, maxFiles, accept, placeholder = 'Choose files...',\n className, disabled = false, error, helperText, allowUnauthenticated = false\n } = props;\n\n const { selectedFiles, setSelectedFiles, setSelectionMode, createUrl, triggerFetch, apiEndpoint, activeAccountId, withCredentials, callAPI, currentView } = useDrive();\n useStyleInjector();\n const [isOpen, setIsOpen] = useState(false);\n\n // ** Auth-aware mode: when logged in show the drive explorer, otherwise fall back to a one-time anonymous upload.\n // null = probing, true = logged in (browse), false = anonymous (one-time upload)\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dialogUploadRef = useRef<TDriveUploadRef>(null);\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const [authed, setAuthed] = useState<boolean | null>(allowUnauthenticated ? null : true);\n useEffect(() => {\n if (!allowUnauthenticated) return;\n callAPI<{ authenticated: boolean }>('information').then(res => setAuthed(res.status === 200 ? !!res.data?.authenticated : false));\n }, [allowUnauthenticated, callAPI]);\n const unauthenticatedMode = allowUnauthenticated && authed === false;\n\n const handleUploaded = useCallback((item: any) => {\n const isFile = item?.information?.type === 'FILE';\n const uploaded: TDriveFile = {\n id: item.id,\n isFolder: !isFile,\n file: { name: item.name, mime: isFile ? item.information.mime : '', size: isFile ? item.information.sizeInBytes : 0 },\n };\n const current = valueRef.current;\n if (multiple) {\n const arr = Array.isArray(current) ? current : current ? [current] : [];\n onChange([...arr, uploaded]);\n } else {\n onChange(uploaded);\n }\n }, [multiple, onChange]);\n\n const { uploads, uploadFiles } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded);\n\n const openPicker = useCallback(() => {\n if (unauthenticatedMode) fileInputRef.current?.click();\n else setIsOpen(true);\n }, [unauthenticatedMode]);\n\n const handleFilePick = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(e.target.files ?? []);\n if (picked.length) uploadFiles(multiple ? picked : [picked[0]], null, []);\n e.target.value = '';\n }, [uploadFiles, multiple]);\n\n const activeUploads = unauthenticatedMode ? uploads.filter(u => ['queued', 'uploading', 'error'].includes(u.status)) : [];\n\n // Keep selection mode in sync with the multiple/maxFiles props\n useEffect(() => {\n setSelectionMode(multiple ? { type: 'MULTIPLE', ...(maxFiles ? { maxFile: maxFiles } : {}) } : { type: 'SINGLE' });\n }, [multiple, maxFiles, setSelectionMode]);\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) setSelectedFiles([]);\n else if (Array.isArray(value)) setSelectedFiles(value);\n else setSelectedFiles([value]);\n }\n }, [isOpen, value, setSelectedFiles, triggerFetch]);\n\n const selectableFiles = useMemo(() => selectedFiles.filter(f => !f.isFolder), [selectedFiles]);\n\n const handleConfirm = useCallback(() => {\n onChange(multiple ? selectableFiles : selectableFiles[0] || null);\n setIsOpen(false);\n }, [selectableFiles, 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 nd:min-w-0\", className)}>\n {/* Trigger Button */}\n {!hasSelection ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={openPicker}\n disabled={disabled || (allowUnauthenticated && authed === null)}\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] && displayFiles[0].file && (\n <div className=\"nd:flex nd:items-center nd:gap-3 nd:p-2.5 nd:min-w-0\">\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 || 'Unknown'}</p>\n <p className=\"nd:text-xs nd:text-muted-foreground nd:truncate\">\n {getFileFormat(displayFiles[0].file.mime)}\n {displayFiles[0].file.size ? ` · ${formatBytes(displayFiles[0].file.size)}` : ''}\n </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={openPicker} 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={openPicker} 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.filter(file => file?.file).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 nd:min-w-0\">\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 <div className=\"nd:flex-1 nd:min-w-0\">\n <p className=\"nd:text-sm nd:truncate\">{file.file.name || 'Unknown'}</p>\n <p className=\"nd:text-[11px] nd:text-muted-foreground nd:truncate\">\n {getFileFormat(file.file.mime)}\n {file.file.size ? ` · ${formatBytes(file.file.size)}` : ''}\n </p>\n </div>\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 {/* Unauthenticated one-time upload */}\n {unauthenticatedMode && (\n <input ref={fileInputRef} type=\"file\" accept={accept} multiple={multiple} className=\"nd:hidden\" onChange={handleFilePick} />\n )}\n {activeUploads.length > 0 && (\n <div className=\"nd:mt-2 nd:space-y-2\">\n {activeUploads.map(u => (\n <div key={u.id} className=\"nd:rounded-lg nd:border nd:px-3 nd:py-2\">\n <div className=\"nd:flex nd:items-center nd:gap-2 nd:min-w-0\">\n {u.status === 'error'\n ? <X className=\"nd:size-4 nd:text-destructive nd:shrink-0\" />\n : <Loader2 className=\"nd:size-4 nd:animate-spin nd:text-muted-foreground nd:shrink-0\" />}\n <span className=\"nd:text-sm nd:truncate nd:flex-1 nd:min-w-0\">{u.name}</span>\n <span className=\"nd:text-xs nd:text-muted-foreground nd:shrink-0\">\n {u.status === 'error' ? 'Failed' : `${Math.round(u.percent ?? 0)}%`}\n </span>\n </div>\n {u.status !== 'error' && (\n <Progress value={Math.round(u.percent ?? 0)} className=\"nd:mt-1.5\" />\n )}\n {u.status === 'error' && u.error && (\n <p className=\"nd:text-xs nd:text-destructive nd:mt-1\">{u.error}</p>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* File Picker Dialog */}\n <Dialog2 open={isOpen} onOpenChange={setIsOpen}>\n <Dialog2Content\n showCloseButton={false}\n className=\"nd-drive-root\"\n // Guard against the browser's default \"open dropped file\" navigation - only the\n // DriveDropZone wrapping the grid below actually accepts the drop.\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => {\n // Let Escape clear an in-progress keyboard selection first; only close the\n // dialog on a second Escape once nothing is selected (grid's own handler\n // can't stop Radix's dismissal since it listens on the document).\n if (selectedFiles.length > 0) {\n e.preventDefault();\n setSelectedFiles([]);\n }\n }}\n >\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 ref={dialogUploadRef} compact accept={accept} />\n </div>\n <DriveDropZone\n className=\"nd:flex nd:flex-col nd:flex-1 nd:min-h-0\"\n disabled={currentView !== 'BROWSE'}\n onFilesDropped={(files, skippedFolders) => dialogUploadRef.current?.handleFiles(files, skippedFolders)}\n >\n <DriveFileGrid mimeFilter={accept} className=\"nd:flex-1\" />\n </DriveDropZone>\n </div>\n </DriveDndProvider>\n </Dialog2Body>\n\n {/* Selected files tray - persists across folder navigation (folders can't be picked, so they're excluded) */}\n {multiple && selectableFiles.length > 0 && (\n <div className=\"nd:border-t nd:px-3 nd:py-2 nd:bg-muted/20 nd:dark:bg-muted/10\">\n <div className=\"nd:flex nd:items-center nd:justify-between nd:mb-1.5\">\n <span className=\"nd:text-xs nd:font-medium nd:text-muted-foreground\">\n {selectableFiles.length}{maxFiles ? ` / ${maxFiles}` : ''} selected\n </span>\n {maxFiles && selectableFiles.length >= maxFiles && (\n <span className=\"nd:text-[11px] nd:font-medium nd:text-amber-600 nd:dark:text-amber-500\">Max {maxFiles} files</span>\n )}\n </div>\n <div className=\"nd:flex nd:gap-2 nd:overflow-x-auto nd:pt-2 nd:pr-2 nd:pb-1\">\n {selectableFiles.filter(file => file?.file).map(file => (\n <div key={file.id} className=\"nd:relative nd:shrink-0 group\">\n <div className=\"nd:size-16 nd:rounded-lg nd:overflow-hidden nd:bg-muted/30 nd:border nd:flex nd:items-center nd:justify-center\">\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-7 nd:text-muted-foreground\")\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setSelectedFiles(prev => prev.filter(f => f.id !== file.id))}\n className=\"nd:absolute nd:-top-1.5 nd:-right-1.5 nd:size-5 nd:rounded-full nd:bg-foreground nd:text-background nd:flex nd:items-center nd:justify-center nd:shadow nd:hover:scale-110 nd:transition-transform\"\n aria-label={`Remove ${file.file.name || 'file'}`}\n >\n <X className=\"nd:size-3\" />\n </button>\n <p className=\"nd:mt-1 nd:w-16 nd:text-[10px] nd:text-muted-foreground nd:truncate nd:text-center\" title={file.file.name}>{file.file.name}</p>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Footer */}\n <Dialog2Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button type=\"button\" onClick={handleConfirm} disabled={selectableFiles.length === 0}>\n Select{selectableFiles.length > 0 ? ` (${selectableFiles.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/modal\";\nimport { DriveConfirm } from '@/client/components/shared/confirm';\nimport { DriveAccountRename } from '@/client/components/drive/account/rename';\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 || 'Could not start Google Drive 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('Could not connect to Google Drive. 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 <DriveAccountRename\n open={renameDialog.open}\n onClose={() => setRenameDialog({ open: false, account: null })}\n account={renameDialog.account}\n onConfirm={handleRename}\n />\n\n {/* Disconnect Confirmation */}\n <DriveConfirm\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 - Standalone all-in-one explorer; composes DriveFileGrid (which already\n// owns selection, marquee, DnD, dialogs and context menus) with the surrounding chrome.\n'use client';\n\nimport React from 'react';\nimport type { TDatabaseDrive } from '@/types/server';\nimport type { TDriveUploadRef } from '@/types/client';\nimport { useDrive } from '@/client/context';\nimport { DrivePathBar } from '@/client/components/drive/path-bar';\nimport { DriveUpload } from '@/client/components/drive/upload';\nimport { DriveDropZone } from '@/client/components/drive/dropzone';\nimport { DriveSidebar } from '@/client/components/drive/sidebar';\nimport { DriveContentProgress } from '@/client/components/drive/header';\nimport { DriveFileGrid } from '@/client/components/drive/file-grid';\nimport { DriveDndProvider } from '@/client/components/drive/dnd/context';\n\nexport const DriveExplorer = (props: Readonly<{\n onItemClick?: (item: TDatabaseDrive) => void;\n onItemDoubleClick?: (item: TDatabaseDrive) => void;\n mimeFilter?: string;\n className?: string;\n}>) => {\n // ** Deconstruct Props\n const { onItemClick, onItemDoubleClick, mimeFilter, className } = props;\n\n // Uploading only makes sense while browsing (mirrors DriveDndProvider's own BROWSE-only gate) - the\n // fallback here is that dropping a file into the Trash/Search views is simply ignored, no error.\n const { currentView } = useDrive();\n const uploadRef = React.useRef<TDriveUploadRef>(null);\n\n return (\n <div\n 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 // Guard the whole widget against the browser's default \"open dropped file\" navigation -\n // only the DriveDropZone below (wrapping the grid) actually accepts the drop.\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => e.preventDefault()}\n >\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 ref={uploadRef} 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 <DriveDndProvider>\n <DriveDropZone\n className=\"nd:flex nd:flex-col nd:flex-1 nd:min-h-0\"\n disabled={currentView !== 'BROWSE'}\n onFilesDropped={(files, skippedFolders) => uploadRef.current?.handleFiles(files, skippedFolders)}\n >\n <DriveFileGrid\n mimeFilter={mimeFilter}\n className={className}\n onItemClick={onItemClick}\n onItemDoubleClick={onItemDoubleClick}\n />\n </DriveDropZone>\n </DriveDndProvider>\n </div>\n );\n};\n\n"]}