"use client" import { useCallback, useMemo, useState } from "react" import { useRouter } from "next/navigation" import { MoreVertical } from "lucide-react" import { toast } from "sonner" import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Sheet, SheetContent, SheetDescription, SheetTitle } from "@/components/ui/sheet" import { DriveMoveDialog, type DriveFolderPickerMode } from "@/components/drive/drive-move-dialog" import { DriveNameDialog } from "@/components/drive/drive-name-dialog" import { DriveFileMenuActions } from "@/components/drive/drive-file-menu-actions" import { DRIVE_MENU_SURFACE_CLASS } from "@/components/drive/drive-file-context-menu" import { useDriveMutations } from "@/lib/api/hooks/use-drive-queries" import type { DriveFileInfo } from "@/lib/api/types" import type { DriveView } from "@/lib/drive/drive-url" import { buildDriveFolderHref } from "@/lib/drive/drive-url" import { displayFileName } from "@/lib/drive/display-file-name" import { resolveRenameName } from "@/lib/drive/drive-default-name" import { guardDriveMenuPointer, stopDriveMenuBubble } from "@/lib/drive/drive-menu-guard" import { useIsMobile } from "@/hooks/use-mobile" import { useDriveUIStore } from "@/lib/stores/drive-ui-store" import { DRIVE_MENU_BTN, DRIVE_MENU_BTN_ACTIVE } from "@/lib/drive/drive-chrome-classes" import { cn } from "@/lib/utils" function breadcrumbFolderTarget(folderPath: string, name: string): DriveFileInfo { return { path: folderPath, name, type: "directory", size: 0, mime_type: "httpd/unix-directory", last_modified: "", etag: "", is_favorite: false, } } export function BreadcrumbFolderMenu({ view, segments, folderPath, writable = true, allowShare = true, renameOpen, onRenameOpenChange, className, }: { view: Extract segments: string[] folderPath: string writable?: boolean allowShare?: boolean renameOpen?: boolean onRenameOpenChange?: (open: boolean) => void className?: string }) { const isMobile = useIsMobile() const router = useRouter() const [dropdownOpen, setDropdownOpen] = useState(false) const [sheetOpen, setSheetOpen] = useState(false) const [internalRenameOpen, setInternalRenameOpen] = useState(false) const [folderPickerMode, setFolderPickerMode] = useState(null) const setSharePath = useDriveUIStore((s) => s.setSharePath) const mutations = useDriveMutations() const folderName = segments[segments.length - 1] ?? "" const folder = useMemo( () => breadcrumbFolderTarget(folderPath, folderName), [folderPath, folderName] ) const targets = useMemo(() => [folder], [folder]) const label = displayFileName(folderName) const renameControlled = onRenameOpenChange != null const renameDialogOpen = renameControlled ? (renameOpen ?? false) : internalRenameOpen const setRenameDialogOpen = renameControlled ? onRenameOpenChange : setInternalRenameOpen const handleRename = async (input: string) => { const newName = resolveRenameName(folder, input) if (displayFileName(folder.name) === newName) return try { await mutations.rename.mutateAsync({ path: folder.path, new_name: newName }) toast.success("Dossier renommé") const parentSegments = segments.slice(0, -1) router.push(buildDriveFolderHref(view, [...parentSegments, newName])) } catch { toast.error("Impossible de renommer ce dossier") throw new Error("rename failed") } } const closeDropdown = useCallback(() => { setDropdownOpen(false) guardDriveMenuPointer() }, []) const openRenameDialog = useCallback(() => { guardDriveMenuPointer() window.setTimeout(() => setRenameDialogOpen(true), 0) }, [setRenameDialogOpen]) const openFolderPicker = (mode: DriveFolderPickerMode) => { setSheetOpen(false) closeDropdown() window.setTimeout(() => setFolderPickerMode(mode), 0) } const menuActionsProps = { targets, writable, allowShare, hideOpen: true, onOpen: () => {}, setSharePath, mutations, onRenameRequest: openRenameDialog, onMoveRequest: writable ? () => openFolderPicker("move") : undefined, onCopyRequest: writable ? () => openFolderPicker("copy") : undefined, } const dialogs = ( <> { if (!next) setFolderPickerMode(null) }} mode={folderPickerMode ?? "move"} sources={targets} /> Actions pour {label} Actions disponibles pour {label}.

{label}

setSheetOpen(false)} onRenameRequest={() => { setSheetOpen(false) openRenameDialog() }} />
) if (isMobile) { return ( <> {dialogs} ) } return ( <> { if (next) { setDropdownOpen(true) return } closeDropdown() }} > e.preventDefault()} onPointerDown={(e) => stopDriveMenuBubble(e)} onClick={(e) => e.stopPropagation()} > { closeDropdown() openRenameDialog() }} /> {dialogs} ) }