diff --git a/packages/ui/src/collapsible/collapsible.tsx b/packages/ui/src/collapsible/collapsible.tsx new file mode 100644 index 0000000000..6c08563f0a --- /dev/null +++ b/packages/ui/src/collapsible/collapsible.tsx @@ -0,0 +1,52 @@ +import React, { FC, useState, useEffect, useCallback } from "react"; +import { Disclosure, Transition } from "@headlessui/react"; + +export type TCollapsibleProps = { + title: string | React.ReactNode; + children: React.ReactNode; + buttonClassName?: string; + isOpen?: boolean; + onToggle?: () => void; + defaultOpen?: boolean; +}; + +export const Collapsible: FC = (props) => { + const { title, children, buttonClassName, isOpen, onToggle, defaultOpen } = props; + // state + const [localIsOpen, setLocalIsOpen] = useState(isOpen || defaultOpen ? true : false); + + useEffect(() => { + if (isOpen !== undefined) { + setLocalIsOpen(isOpen); + } + }, [isOpen]); + + // handlers + const handleOnClick = useCallback(() => { + if (isOpen !== undefined) { + if (onToggle) onToggle(); + } else { + setLocalIsOpen((prev) => !prev); + } + }, [isOpen, onToggle]); + + return ( + + + {title} + + + {children} + + + ); +}; diff --git a/packages/ui/src/collapsible/index.ts b/packages/ui/src/collapsible/index.ts new file mode 100644 index 0000000000..dbd9262372 --- /dev/null +++ b/packages/ui/src/collapsible/index.ts @@ -0,0 +1 @@ +export * from "./collapsible"; diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index e35a1ba5e0..59e7d609f4 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -20,3 +20,4 @@ export * from "./drag-handle"; export * from "./drop-indicator"; export * from "./favorite-star"; export * from "./loader"; +export * from "./collapsible";