+
+
+
+
+
+
+ onNew("folder")}>
+
+ Folder
+
+
+ onNew("document")}>
+
+ Document
+
+ onNew("spreadsheet")}>
+
+ Spreadsheet
+
+ onNew("presentation")}>
+
+ Presentation
+
+
+
+
+ File upload
+
+
+
+
+
+
+
+
+
+
+ dispatch({ type: "SET_SEARCH", payload: e.target.value })
+ }
+ onFocus={() => setSearchFocused(true)}
+ onBlur={() => setSearchFocused(false)}
+ className="h-8 pl-8 text-sm"
+ />
+
+
+
+
+
+
+
+ {(Object.keys(sortLabels) as SortField[]).map((field) => (
+ handleSort(field)}>
+ {sortLabels[field]}
+ {state.sortBy === field && (
+
+ {state.sortDirection === "asc" ? "↑" : "↓"}
+
+ )}
+
+ ))}
+
+
+
+
{
+ if (v) dispatch({ type: "SET_VIEW_MODE", payload: v as ViewMode })
+ }}
+ size="sm"
+ >
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/files/file-upload-dialog.tsx b/src/components/files/file-upload-dialog.tsx
new file mode 100755
index 0000000..313802f
--- /dev/null
+++ b/src/components/files/file-upload-dialog.tsx
@@ -0,0 +1,76 @@
+"use client"
+
+import { useState, useEffect } from "react"
+import { IconUpload } from "@tabler/icons-react"
+
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog"
+import { Progress } from "@/components/ui/progress"
+import { toast } from "sonner"
+
+export function FileUploadDialog({
+ open,
+ onOpenChange,
+}: {
+ open: boolean
+ onOpenChange: (open: boolean) => void
+}) {
+ const [progress, setProgress] = useState(0)
+ const [uploading, setUploading] = useState(false)
+
+ useEffect(() => {
+ if (!open) {
+ setProgress(0)
+ setUploading(false)
+ return
+ }
+
+ setUploading(true)
+ const interval = setInterval(() => {
+ setProgress((prev) => {
+ if (prev >= 100) {
+ clearInterval(interval)
+ setTimeout(() => {
+ onOpenChange(false)
+ toast.success("File uploaded successfully")
+ }, 300)
+ return 100
+ }
+ return prev + Math.random() * 15
+ })
+ }, 200)
+
+ return () => clearInterval(interval)
+ }, [open, onOpenChange])
+
+ return (
+