mirror of
https://github.com/get-drexa/drive.git
synced 2025-11-30 21:41:39 +00:00
feat: make dir path breadcrumb generic
This commit is contained in:
@@ -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>
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user