fix: directory content table context menu

fix radix throwing event.preventDefault is not a function error on right
click in DirectoryContentTable

Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
2025-10-04 14:56:53 +00:00
parent 875aae74e8
commit 9282e75bef
2 changed files with 31 additions and 26 deletions

View File

@@ -39,12 +39,14 @@ import { TextFileIcon } from "../../components/icons/text-file-icon"
import { type FileDragInfo, useFileDrop } from "../../files/use-file-drop" import { type FileDragInfo, useFileDrop } from "../../files/use-file-drop"
import { cn } from "../../lib/utils" import { cn } from "../../lib/utils"
import { DirectoryPageContext } from "./context" import { DirectoryPageContext } from "./context"
import { contextMenuTargeItemsAtom } from "./state"
type DirectoryContentTableProps = { type DirectoryContentTableProps = {
filterFn: (item: FileSystemItem) => boolean filterFn: (item: FileSystemItem) => boolean
fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null> fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null>
onContextMenu: (items: FileSystemItem[]) => void onContextMenu: (
row: Row<FileSystemItem>,
table: TableType<FileSystemItem>,
) => void
onOpenFile: (file: Doc<"files">) => void onOpenFile: (file: Doc<"files">) => void
} }
@@ -144,15 +146,7 @@ function useTableColumns(
) )
} }
export function DirectoryContentTable(props: DirectoryContentTableProps) { export function DirectoryContentTable({
return (
<div className="w-full">
<DirectoryContentTableContent {...props} />
</div>
)
}
export function DirectoryContentTableContent({
filterFn, filterFn,
onContextMenu, onContextMenu,
fileDragInfoAtom, fileDragInfoAtom,
@@ -190,17 +184,10 @@ export function DirectoryContentTableContent({
row: Row<FileSystemItem>, row: Row<FileSystemItem>,
_event: React.MouseEvent, _event: React.MouseEvent,
) => { ) => {
const target = store.get(contextMenuTargeItemsAtom) if (!row.getIsSelected()) {
if (target.length > 0) {
onContextMenu(target)
} else if (row.getIsSelected()) {
onContextMenu(
table.getSelectedRowModel().rows.map((row) => row.original),
)
} else {
selectRow(row) selectRow(row)
onContextMenu([row.original])
} }
onContextMenu(row, table)
} }
const selectRow = (row: Row<FileSystemItem>) => { const selectRow = (row: Row<FileSystemItem>) => {

View File

@@ -7,6 +7,7 @@ import {
} from "@fileone/convex/model/filesystem" } from "@fileone/convex/model/filesystem"
import { useMutation } from "@tanstack/react-query" import { useMutation } from "@tanstack/react-query"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import type { Row, Table } from "@tanstack/react-table"
import { import {
useMutation as useContextMutation, useMutation as useContextMutation,
useMutation as useConvexMutation, useMutation as useConvexMutation,
@@ -98,6 +99,19 @@ function RouteComponent() {
[setOpenedFile], [setOpenedFile],
) )
const handleContextMenuRequest = (
row: Row<FileSystemItem>,
table: Table<FileSystemItem>,
) => {
if (row.getIsSelected()) {
setContextMenuTargetItems(
table.getSelectedRowModel().rows.map((row) => row.original),
)
} else {
setContextMenuTargetItems([row.original])
}
}
if (!directory || !directoryContent || !rootDirectory) { if (!directory || !directoryContent || !rootDirectory) {
return <DirectoryPageSkeleton /> return <DirectoryPageSkeleton />
} }
@@ -114,16 +128,17 @@ function RouteComponent() {
</div> </div>
</header> </header>
<div className="w-full"> {/* DirectoryContentContextMenu must wrap div instead of DirectoryContentTable, otherwise radix will throw "event.preventDefault is not a function" error, idk why */}
<DirectoryContentContextMenu> <DirectoryContentContextMenu>
<div className="w-full">
<DirectoryContentTable <DirectoryContentTable
filterFn={tableFilter} filterFn={tableFilter}
fileDragInfoAtom={fileDragInfoAtom} fileDragInfoAtom={fileDragInfoAtom}
onContextMenu={setContextMenuTargetItems} onContextMenu={handleContextMenuRequest}
onOpenFile={openFile} onOpenFile={openFile}
/> />
</DirectoryContentContextMenu>
</div> </div>
</DirectoryContentContextMenu>
<WithAtom atom={newFileTypeAtom}> <WithAtom atom={newFileTypeAtom}>
{(newFileType, setNewFileType) => ( {(newFileType, setNewFileType) => (
@@ -168,6 +183,7 @@ function DirectoryContentContextMenu({
const [target, setTarget] = useAtom(contextMenuTargetItemsAtom) const [target, setTarget] = useAtom(contextMenuTargetItemsAtom)
const setOptimisticDeletedItems = useSetAtom(optimisticDeletedItemsAtom) const setOptimisticDeletedItems = useSetAtom(optimisticDeletedItemsAtom)
const moveToTrashMutation = useContextMutation(api.filesystem.moveToTrash) const moveToTrashMutation = useContextMutation(api.filesystem.moveToTrash)
const { mutate: moveToTrash } = useMutation({ const { mutate: moveToTrash } = useMutation({
mutationFn: moveToTrashMutation, mutationFn: moveToTrashMutation,
onMutate: ({ handles }) => { onMutate: ({ handles }) => {
@@ -205,6 +221,8 @@ function DirectoryContentContextMenu({
} }
} }
console.log("target", target)
return ( return (
<ContextMenu <ContextMenu
onOpenChange={(open) => { onOpenChange={(open) => {
@@ -214,7 +232,7 @@ function DirectoryContentContextMenu({
}} }}
> >
<ContextMenuTrigger asChild>{children}</ContextMenuTrigger> <ContextMenuTrigger asChild>{children}</ContextMenuTrigger>
{target && ( {target.length > 0 && (
<ContextMenuContent> <ContextMenuContent>
<RenameMenuItem /> <RenameMenuItem />
<ContextMenuItem onClick={handleDelete}> <ContextMenuItem onClick={handleDelete}>