import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible'; import { cn } from '@/lib/utils'; import { CollapsibleProps } from '@radix-ui/react-collapsible'; import { ChevronDown, ChevronUp } from 'lucide-react'; import * as React from 'react'; import { PropsWithChildren, ReactNode, useCallback, useEffect, useState, } from 'react'; import { IconFontFill } from './icon-font'; type CollapseProps = Omit & { title?: ReactNode; rightContent?: ReactNode; } & PropsWithChildren; export function Collapse({ title, children, rightContent, open = true, defaultOpen = false, onOpenChange, disabled, }: CollapseProps) { const [currentOpen, setCurrentOpen] = useState(open); useEffect(() => { setCurrentOpen(open); }, [open]); const handleOpenChange = useCallback( (open: boolean) => { setCurrentOpen(open); onOpenChange?.(open); }, [onOpenChange], ); return (
{title}
{rightContent}
{children}
); } export type NodeCollapsibleProps = { items?: T; children: (item: T[0], idx: number) => ReactNode; className?: string; }; export function NodeCollapsible({ items = [] as unknown as T, children, className, }: NodeCollapsibleProps) { const [isOpen, setIsOpen] = React.useState(false); const nextClassName = cn('space-y-2', className); const nextItems = items.every((x) => Array.isArray(x)) ? items.flat() : items; return ( {nextItems.slice(0, 3).map(children)} {nextItems.slice(3).map((x, idx) => children(x, idx + 3))} {nextItems.length > 3 && ( e.stopPropagation()} className="absolute left-1/2 -translate-x-1/2 bottom-0 translate-y-1/2 cursor-pointer" >
{isOpen ? ( ) : ( )}
)}
); }