feat: add sidebar folder rename and delete actions

This commit is contained in:
lucaronin
2026-04-22 17:16:56 +02:00
parent 33324a5c79
commit cda87ee6c0
27 changed files with 1915 additions and 240 deletions

View File

@@ -0,0 +1,66 @@
import { useCallback, useMemo, useState } from 'react'
import type { SidebarSelection } from '../../types'
import { expandedTreePaths, mergeExpandedPaths } from './folderTreeUtils'
interface UseFolderTreeDisclosureInput {
collapsed?: boolean
onToggle?: () => void
renamingFolderPath?: string | null
selection: SidebarSelection
}
export function useFolderTreeDisclosure({
collapsed: externalCollapsed,
onToggle,
renamingFolderPath,
selection,
}: UseFolderTreeDisclosureInput) {
const [internalCollapsed, setInternalCollapsed] = useState(false)
const [manualExpanded, setManualExpanded] = useState<Record<string, boolean>>({})
const [isCreating, setIsCreating] = useState(false)
const baseSectionCollapsed = externalCollapsed ?? internalCollapsed
const sectionCollapsed = !isCreating && !renamingFolderPath && baseSectionCollapsed
const requiredExpandedPaths = useMemo(() => {
const nextPaths: string[] = []
if (selection.kind === 'folder') nextPaths.push(...expandedTreePaths(selection.path))
if (renamingFolderPath) nextPaths.push(...expandedTreePaths(renamingFolderPath))
return [...new Set(nextPaths)]
}, [renamingFolderPath, selection])
const expanded = useMemo(
() => mergeExpandedPaths(manualExpanded, requiredExpandedPaths),
[manualExpanded, requiredExpandedPaths],
)
const handleToggleSection = useCallback(() => {
if (onToggle) {
onToggle()
return
}
setInternalCollapsed((current) => !current)
}, [onToggle])
const openCreateForm = useCallback(() => {
if (baseSectionCollapsed) {
if (onToggle) onToggle()
else setInternalCollapsed(false)
}
setIsCreating(true)
}, [baseSectionCollapsed, onToggle])
const closeCreateForm = useCallback(() => setIsCreating(false), [])
const toggleFolder = useCallback((path: string) => {
setManualExpanded((current) => ({ ...current, [path]: !current[path] }))
}, [])
return {
closeCreateForm,
expanded,
handleToggleSection,
isCreating,
openCreateForm,
sectionCollapsed,
toggleFolder,
}
}