import { api } from "@fileone/convex/_generated/api" import { baseName, splitPath } from "@fileone/path" import { useMutation } from "@tanstack/react-query" import { Link } from "@tanstack/react-router" import { useMutation as useConvexMutation } from "convex/react" import { useSetAtom } from "jotai" import { ChevronDownIcon, Loader2Icon, PlusIcon, UploadCloudIcon, } from "lucide-react" import { type ChangeEvent, Fragment, useRef } from "react" import { toast } from "sonner" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { DirectoryIcon } from "../components/icons/directory-icon" import { TextFileIcon } from "../components/icons/text-file-icon" import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "../components/ui/breadcrumb" import { Button } from "../components/ui/button" import { FileTable } from "./file-table" import { RenameFileDialog } from "./rename-file-dialog" import { newItemKindAtom } from "./state" export function FilesPage({ path }: { path: string }) { return ( <>
) } function FilePathBreadcrumb({ path }: { path: string }) { const pathComponents = splitPath(path) const base = baseName(path) return ( All Files {pathComponents.map((p) => ( {p === base ? ( {p} ) : ( {p} )} ))} ) } // tags: upload, uploadfile, uploadfilebutton, fileupload, fileuploadbutton function UploadFileButton() { const generateUploadUrl = useConvexMutation(api.files.generateUploadUrl) const saveFile = useConvexMutation(api.files.saveFile) const { mutate: uploadFile, isPending: isUploading } = useMutation({ mutationFn: async (file: File) => { const uploadUrl = await generateUploadUrl() const uploadResult = await fetch(uploadUrl, { method: "POST", body: file, headers: { "Content-Type": file.type, }, }) const { storageId } = await uploadResult.json() await saveFile({ storageId, name: file.name, size: file.size, mimeType: file.type, }) }, onSuccess: () => { toast.success("File uploaded successfully.") }, }) const fileInputRef = useRef(null) const handleClick = () => { fileInputRef.current?.click() } const onFileUpload = async (e: ChangeEvent) => { const file = e.target.files?.[0] if (file) { uploadFile(file) } } return ( <> ) } function NewDirectoryItemDropdown() { const setNewItemKind = useSetAtom(newItemKindAtom) const addNewDirectory = () => { setNewItemKind("directory") } return ( Text file Directory ) }