feat: allow file drop on path breadcrumb

This commit is contained in:
2025-09-20 23:54:27 +00:00
parent 0f5b1f79ff
commit 7eefe2b96e
5 changed files with 98 additions and 35 deletions

View File

@@ -1,6 +1,10 @@
import { api } from "@fileone/convex/_generated/api"
import type { Doc, Id } from "@fileone/convex/_generated/dataModel"
import type { Doc } from "@fileone/convex/_generated/dataModel"
import type { DirectoryItem } from "@fileone/convex/model/directories"
import {
newDirectoryHandle,
newFileHandle,
} from "@fileone/convex/model/filesystem"
import { useMutation } from "@tanstack/react-query"
import { Link } from "@tanstack/react-router"
import {
@@ -13,7 +17,7 @@ import {
import { useMutation as useContextMutation } from "convex/react"
import { useAtom, useAtomValue, useSetAtom, useStore } from "jotai"
import { CheckIcon, TextCursorInputIcon, TrashIcon, XIcon } from "lucide-react"
import { useContext, useEffect, useId, useRef, useState } from "react"
import { useContext, useEffect, useId, useRef } from "react"
import { toast } from "sonner"
import { DirectoryIcon } from "@/components/icons/directory-icon"
import { Checkbox } from "@/components/ui/checkbox"
@@ -402,7 +406,10 @@ function FileItemRow({
const setDragInfo = useSetAtom(dragInfoAtom)
const { isDraggedOver, dropHandlers } = useFileDrop({
item: row.original,
item:
row.original.kind === "directory"
? newDirectoryHandle(row.original.doc._id)
: null,
dragInfoAtom,
})
@@ -412,9 +419,10 @@ function FileItemRow({
"application/x-internal",
JSON.stringify(row.original),
)
const fileHandle = newFileHandle(row.original.doc._id)
setDragInfo({
source: row.original,
items: [row.original.doc._id],
source: fileHandle,
items: [fileHandle],
})
}
}

View File

@@ -1,5 +1,8 @@
import { api } from "@fileone/convex/_generated/api"
import type { PathComponent } from "@fileone/convex/model/filesystem"
import type {
DirectoryHandle,
PathComponent,
} from "@fileone/convex/model/filesystem"
import { useMutation } from "@tanstack/react-query"
import { Link } from "@tanstack/react-router"
import { useMutation as useConvexMutation } from "convex/react"
@@ -30,10 +33,17 @@ import {
BreadcrumbSeparator,
} from "../../components/ui/breadcrumb"
import { Button } from "../../components/ui/button"
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "../../components/ui/tooltip"
import { useFileDrop } from "../../files/use-file-drop"
import { cn } from "../../lib/utils"
import { DirectoryPageContext } from "./context"
import { DirectoryContentTable } from "./directory-content-table"
import { RenameFileDialog } from "./rename-file-dialog"
import { newItemKindAtom, openedFileAtom } from "./state"
import { dragInfoAtom, newItemKindAtom, openedFileAtom } from "./state"
export function DirectoryPage() {
return (
@@ -57,12 +67,10 @@ export function DirectoryPage() {
function FilePathBreadcrumb() {
const { rootDirectory, directory } = useContext(DirectoryPageContext)
console.log(directory.path)
const breadcrumbItems: React.ReactNode[] = []
for (let i = 1; i < directory.path.length - 1; i++) {
breadcrumbItems.push(
<Fragment key={directory.path[i]!.id}>
<Fragment key={directory.path[i]!.handle.id}>
<BreadcrumbSeparator />
<FilePathBreadcrumbItem component={directory.path[i]!} />
</Fragment>,
@@ -90,14 +98,29 @@ function FilePathBreadcrumb() {
}
function FilePathBreadcrumbItem({ component }: { component: PathComponent }) {
const { isDraggedOver, dropHandlers } = useFileDrop({
item: component.handle as DirectoryHandle,
dragInfoAtom,
})
const dirName = component.name || "All Files"
return (
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link to={`/directories/${component.id}`}>
{component.name || "All Files"}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
<Tooltip open={isDraggedOver}>
<TooltipTrigger asChild>
<BreadcrumbItem
className={cn({ "bg-muted": isDraggedOver })}
{...dropHandlers}
>
<BreadcrumbLink asChild>
<Link to={`/directories/${component.handle.id}`}>
{dirName}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
</TooltipTrigger>
<TooltipContent>Move to {dirName}</TooltipContent>
</Tooltip>
)
}