"use client"; import { Eye, MoreHorizontal, Move, Pencil, Trash2, } from "lucide-react"; import React, { useCallback, useRef } from "react"; import { useDrag } from "react-dnd"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger, } from "@/components/ui/context-menu"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { getDocumentTypeIcon } from "@/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentTypeIcon"; import type { DocumentTypeEnum } from "@/contracts/types/document.types"; import { cn } from "@/lib/utils"; import { DND_TYPES } from "./FolderNode"; export interface DocumentNodeDoc { id: number; title: string; document_type: string; folderId: number | null; status?: { state: string; reason?: string | null }; } interface DocumentNodeProps { doc: DocumentNodeDoc; depth: number; isMentioned: boolean; onToggleChatMention: (doc: DocumentNodeDoc, isMentioned: boolean) => void; onPreview: (doc: DocumentNodeDoc) => void; onEdit: (doc: DocumentNodeDoc) => void; onDelete: (doc: DocumentNodeDoc) => void; onMove: (doc: DocumentNodeDoc) => void; } export const DocumentNode = React.memo(function DocumentNode({ doc, depth, isMentioned, onToggleChatMention, onPreview, onEdit, onDelete, onMove, }: DocumentNodeProps) { const statusState = doc.status?.state ?? "ready"; const isSelectable = statusState !== "pending" && statusState !== "processing"; const isEditable = doc.document_type === "NOTE" && statusState !== "pending" && statusState !== "processing"; const handleCheckChange = useCallback(() => { if (isSelectable) { onToggleChatMention(doc, isMentioned); } }, [doc, isMentioned, isSelectable, onToggleChatMention]); const [{ isDragging }, drag] = useDrag( () => ({ type: DND_TYPES.DOCUMENT, item: { id: doc.id }, collect: (monitor) => ({ isDragging: monitor.isDragging() }), }), [doc.id], ); const isProcessing = statusState === "pending" || statusState === "processing"; return (
{isSelectable ? ( e.stopPropagation()} className="h-3.5 w-3.5 shrink-0" /> ) : ( )} {doc.title} {getDocumentTypeIcon(doc.document_type as DocumentTypeEnum, "h-3.5 w-3.5 text-muted-foreground")} onPreview(doc)}> Preview {isEditable && ( onEdit(doc)}> Edit )} onMove(doc)}> Move to... onDelete(doc)} > Delete
onPreview(doc)}> Preview {isEditable && ( onEdit(doc)}> Edit )} onMove(doc)}> Move to... onDelete(doc)} > Delete
); });