/** @jsx h */ import { h } from 'preact'; import { useState, useEffect, useRef } from 'preact/hooks'; import { cx } from '@algolia/ui-components-shared'; import Template from '../Template/Template'; import type { PanelCSSClasses, PanelSharedOptions, PanelTemplates, } from '../../widgets/panel/panel'; import type { ComponentCSSClasses, UnknownWidgetFactory } from '../../types'; export type PanelComponentCSSClasses = ComponentCSSClasses< // `collapseIcon` is only used in the default templates of the widget Omit >; export type PanelComponentTemplates = Required>; export type PanelProps = { hidden: boolean; collapsible: boolean; isCollapsed: boolean; data: PanelSharedOptions; cssClasses: PanelComponentCSSClasses; templates: PanelComponentTemplates; bodyElement: HTMLElement; }; function Panel( props: PanelProps ) { const [isCollapsed, setIsCollapsed] = useState(props.isCollapsed); const [isControlled, setIsControlled] = useState(false); const bodyRef = useRef(null); useEffect(() => { const node = bodyRef.current; if (!node) { return undefined; } node.appendChild(props.bodyElement); return () => { node.removeChild(props.bodyElement); }; }, [bodyRef, props.bodyElement]); if (!isControlled && props.isCollapsed !== isCollapsed) { setIsCollapsed(props.isCollapsed); } return (