import { Dropdown as BootstrapDropdown } from "bootstrap"; import { ComponentChildren } from "preact"; import { CSSProperties } from "preact/compat"; import { useCallback, useEffect, useRef, useState } from "preact/hooks"; import { useUniqueName } from "./hooks"; export interface DropdownProps { className?: string; buttonClassName?: string; isStatic?: boolean; children: ComponentChildren; title?: string; dropdownContainerStyle?: CSSProperties; dropdownContainerClassName?: string; hideToggleArrow?: boolean; noSelectButtonStyle?: boolean; disabled?: boolean; text?: ComponentChildren; } export default function Dropdown({ className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, hideToggleArrow, disabled, noSelectButtonStyle }: DropdownProps) { const dropdownRef = useRef(null); const triggerRef = useRef(null); const [ shown, setShown ] = useState(false); useEffect(() => { if (!triggerRef.current) return; const dropdown = BootstrapDropdown.getOrCreateInstance(triggerRef.current); return () => dropdown.dispose(); }, []); // Add dependency array const onShown = useCallback(() => { setShown(true); }, []) const onHidden = useCallback(() => { setShown(false); }, []); useEffect(() => { if (!dropdownRef.current) return; const $dropdown = $(dropdownRef.current); $dropdown.on("show.bs.dropdown", onShown); $dropdown.on("hide.bs.dropdown", onHidden); // Add proper cleanup return () => { $dropdown.off("show.bs.dropdown", onShown); $dropdown.off("hide.bs.dropdown", onHidden); }; }, []); // Add dependency array const ariaId = useUniqueName("button"); return (
{shown && children}
) }