feat: make dir path breadcrumb generic

This commit is contained in:
2025-10-18 19:55:14 +00:00
parent cd9dee9371
commit 1ae649850a
4 changed files with 32 additions and 30 deletions

View File

@@ -3,8 +3,10 @@ import type {
DirectoryHandle, DirectoryHandle,
DirectoryPathComponent, DirectoryPathComponent,
} from "@fileone/convex/filesystem" } from "@fileone/convex/filesystem"
import type { DirectoryInfo } from "@fileone/convex/types"
import { Link } from "@tanstack/react-router" import { Link } from "@tanstack/react-router"
import { Fragment, useContext } from "react" import type { PrimitiveAtom } from "jotai"
import { Fragment } from "react"
import { import {
Breadcrumb, Breadcrumb,
BreadcrumbItem, BreadcrumbItem,
@@ -12,27 +14,36 @@ import {
BreadcrumbList, BreadcrumbList,
BreadcrumbPage, BreadcrumbPage,
BreadcrumbSeparator, BreadcrumbSeparator,
} from "../../components/ui/breadcrumb" } from "@/components/ui/breadcrumb"
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipTrigger, TooltipTrigger,
} from "../../components/ui/tooltip" } from "@/components/ui/tooltip"
import { useFileDrop } from "../../files/use-file-drop" import type { FileDragInfo } from "@/files/use-file-drop"
import { cn } from "../../lib/utils" import { useFileDrop } from "@/files/use-file-drop"
import { DirectoryPageContext } from "./context" import { cn } from "@/lib/utils"
import { dragInfoAtom } from "./state"
export function FilePathBreadcrumb({ export function DirectoryPathBreadcrumb({
directory,
rootLabel, rootLabel,
directoryUrlFn, directoryUrlFn,
fileDragInfoAtom,
}: { }: {
directory: DirectoryInfo
rootLabel: string rootLabel: string
directoryUrlFn: (directory: Id<"directories">) => string directoryUrlFn: (directory: Id<"directories">) => string
fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null>
}) { }) {
const { rootDirectory, directory } = useContext(DirectoryPageContext) const breadcrumbItems: React.ReactNode[] = [
<FilePathBreadcrumbItem
const breadcrumbItems: React.ReactNode[] = [] key={directory.path[0].handle.id}
component={directory.path[0]}
rootLabel={rootLabel}
directoryUrlFn={directoryUrlFn}
fileDragInfoAtom={fileDragInfoAtom}
/>,
]
for (let i = 1; i < directory.path.length - 1; i++) { for (let i = 1; i < directory.path.length - 1; i++) {
breadcrumbItems.push( breadcrumbItems.push(
<Fragment key={directory.path[i]?.handle.id}> <Fragment key={directory.path[i]?.handle.id}>
@@ -41,6 +52,7 @@ export function FilePathBreadcrumb({
component={directory.path[i]!} component={directory.path[i]!}
rootLabel={rootLabel} rootLabel={rootLabel}
directoryUrlFn={directoryUrlFn} directoryUrlFn={directoryUrlFn}
fileDragInfoAtom={fileDragInfoAtom}
/> />
</Fragment>, </Fragment>,
) )
@@ -49,17 +61,6 @@ export function FilePathBreadcrumb({
return ( return (
<Breadcrumb> <Breadcrumb>
<BreadcrumbList> <BreadcrumbList>
{rootDirectory._id === directory._id ? (
<BreadcrumbItem>
<BreadcrumbPage>{rootLabel}</BreadcrumbPage>
</BreadcrumbItem>
) : (
<FilePathBreadcrumbItem
component={directory.path[0]!}
rootLabel={rootLabel}
directoryUrlFn={directoryUrlFn}
/>
)}
{breadcrumbItems} {breadcrumbItems}
<BreadcrumbSeparator /> <BreadcrumbSeparator />
<BreadcrumbItem> <BreadcrumbItem>
@@ -74,20 +75,20 @@ function FilePathBreadcrumbItem({
component, component,
rootLabel, rootLabel,
directoryUrlFn, directoryUrlFn,
fileDragInfoAtom,
}: { }: {
component: DirectoryPathComponent component: DirectoryPathComponent
rootLabel: string rootLabel: string
directoryUrlFn: (directory: Id<"directories">) => string directoryUrlFn: (directory: Id<"directories">) => string
fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null>
}) { }) {
const { isDraggedOver, dropHandlers } = useFileDrop({ const { isDraggedOver, dropHandlers } = useFileDrop({
destItem: component.handle as DirectoryHandle, destItem: component.handle as DirectoryHandle,
dragInfoAtom, dragInfoAtom: fileDragInfoAtom,
}) })
const dirName = component.name || rootLabel const dirName = component.name || rootLabel
console.log({ dirName, isDraggedOver, dropHandlers })
return ( return (
<Tooltip open={isDraggedOver}> <Tooltip open={isDraggedOver}>
<TooltipTrigger asChild> <TooltipTrigger asChild>

View File

@@ -88,7 +88,6 @@ export function useFileDrop({
const handleDragOver = (e: React.DragEvent) => { const handleDragOver = (e: React.DragEvent) => {
const dragInfo = store.get(dragInfoAtom) const dragInfo = store.get(dragInfoAtom)
console.log({ dragInfo, destItem })
if (dragInfo && destItem) { if (dragInfo && destItem) {
e.preventDefault() e.preventDefault()
e.dataTransfer.dropEffect = "move" e.dataTransfer.dropEffect = "move"

View File

@@ -40,9 +40,9 @@ import { WithAtom } from "@/components/with-atom"
import { DirectoryPageContext } from "@/directories/directory-page/context" import { DirectoryPageContext } from "@/directories/directory-page/context"
import { DirectoryContentTable } from "@/directories/directory-page/directory-content-table" import { DirectoryContentTable } from "@/directories/directory-page/directory-content-table"
import { DirectoryPageSkeleton } from "@/directories/directory-page/directory-page-skeleton" import { DirectoryPageSkeleton } from "@/directories/directory-page/directory-page-skeleton"
import { FilePathBreadcrumb } from "@/directories/directory-page/file-path-breadcrumb"
import { NewDirectoryDialog } from "@/directories/directory-page/new-directory-dialog" import { NewDirectoryDialog } from "@/directories/directory-page/new-directory-dialog"
import { RenameFileDialog } from "@/directories/directory-page/rename-file-dialog" import { RenameFileDialog } from "@/directories/directory-page/rename-file-dialog"
import { DirectoryPathBreadcrumb } from "@/directories/directory-path-breadcrumb"
import { FilePreviewDialog } from "@/files/file-preview-dialog" import { FilePreviewDialog } from "@/files/file-preview-dialog"
import { inProgressFileUploadCountAtom } from "@/files/store" import { inProgressFileUploadCountAtom } from "@/files/store"
import { UploadFileDialog } from "@/files/upload-file-dialog" import { UploadFileDialog } from "@/files/upload-file-dialog"
@@ -146,9 +146,11 @@ function RouteComponent() {
value={{ rootDirectory, directory, directoryContent }} value={{ rootDirectory, directory, directoryContent }}
> >
<header className="flex py-2 shrink-0 items-center gap-2 border-b px-4 w-full"> <header className="flex py-2 shrink-0 items-center gap-2 border-b px-4 w-full">
<FilePathBreadcrumb <DirectoryPathBreadcrumb
directory={directory}
rootLabel="All Files" rootLabel="All Files"
directoryUrlFn={directoryUrlById} directoryUrlFn={directoryUrlById}
fileDragInfoAtom={fileDragInfoAtom}
/> />
<div className="ml-auto flex flex-row gap-2"> <div className="ml-auto flex flex-row gap-2">
<NewDirectoryItemDropdown /> <NewDirectoryItemDropdown />

View File

@@ -35,7 +35,7 @@ import { WithAtom } from "@/components/with-atom"
import { DirectoryPageContext } from "@/directories/directory-page/context" import { DirectoryPageContext } from "@/directories/directory-page/context"
import { DirectoryContentTable } from "@/directories/directory-page/directory-content-table" import { DirectoryContentTable } from "@/directories/directory-page/directory-content-table"
import { DirectoryPageSkeleton } from "@/directories/directory-page/directory-page-skeleton" import { DirectoryPageSkeleton } from "@/directories/directory-page/directory-page-skeleton"
import { FilePathBreadcrumb } from "@/directories/directory-page/file-path-breadcrumb" import { DirectoryPathBreadcrumb } from "@/directories/directory-path-breadcrumb"
import { FilePreviewDialog } from "@/files/file-preview-dialog" import { FilePreviewDialog } from "@/files/file-preview-dialog"
import type { FileDragInfo } from "@/files/use-file-drop" import type { FileDragInfo } from "@/files/use-file-drop"
import { backgroundTaskProgressAtom } from "../../../dashboard/state" import { backgroundTaskProgressAtom } from "../../../dashboard/state"
@@ -108,7 +108,7 @@ function RouteComponent() {
value={{ rootDirectory, directory, directoryContent }} value={{ rootDirectory, directory, directoryContent }}
> >
<header className="flex py-2 shrink-0 items-center gap-2 border-b px-4 w-full"> <header className="flex py-2 shrink-0 items-center gap-2 border-b px-4 w-full">
<FilePathBreadcrumb <DirectoryPathBreadcrumb
rootLabel="Trash" rootLabel="Trash"
directoryUrlFn={directoryUrlById} directoryUrlFn={directoryUrlById}
/> />