import React from "react" import clsx from "clsx" import MoreHorizontalIcon from "../../fundamentals/icons/more-horizontal-icon" import MinusIcon from "../../fundamentals/icons/minus-icon" import PlusIcon from "../../fundamentals/icons/plus-icon" import Button from "../../fundamentals/button" import Actionables, { ActionType } from "../actionables" /* ---------------------------- CollapsibleTree ------------------------------------ */ type CollapsibleTreeType = React.FC & { Parent: React.FC Leaf: React.FC Content: React.FC } type TCollapsibleTreeContext = { open: boolean handleOpen: () => void handleClose: () => void toggle: () => void } const CollapsibleTreeContext = React.createContext(null) export const CollapsibleTree: CollapsibleTreeType = ({ children }) => { const [open, setOpen] = React.useState(false) return ( setOpen(true), handleClose: () => setOpen(false), toggle: () => setOpen((open) => !open), }} > {children} ) } CollapsibleTreeContext.displayName = "CollapsibleTreeContext" const useCollapsibleTree = () => { const context = React.useContext(CollapsibleTreeContext) if (!context) { throw new Error("useCollapsibleTree must be a child of CollapsibleTree") } return context } /* ---------------------------- CollapsibleTreeContent ------------------------------------ */ type CollapsibleTreeContentProps = React.HTMLAttributes const CollapsibleTreeContent: React.FC = ({ children, className, ...props }) => { const { open } = useCollapsibleTree() return (
{children}
) } CollapsibleTree.Content = CollapsibleTreeContent /* ---------------------------- CollapsibleTreeParent ------------------------------------ */ type CollapsibleTreeParentProps = { actions?: ActionType[] className?: string } const CollapsibleTreeParent: React.FC = ({ actions, className, children, }) => { const { open, toggle } = useCollapsibleTree() return (
{children}
{actions && ( )}
) } CollapsibleTree.Parent = CollapsibleTreeParent /* ---------------------------- CollapsibleTreeLeaf ------------------------------------ */ type CollapsibleTreeLeafProps = { actions?: ActionType[] className?: string } const CollapsibleTreeLeaf: React.FC = ({ className, children, actions, }) => { return (
{children} {actions && ( )}
) } CollapsibleTree.Leaf = CollapsibleTreeLeaf const Container: React.FC<{ className?: string }> = ({ children, className, }) => { return (
{children}
) } const Trigger = () => { return ( ) }