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"; interface DropdownProps { className?: string; buttonClassName?: string; isStatic?: boolean; children: ComponentChildren; title?: string; dropdownContainerStyle?: CSSProperties; hideToggleArrow?: boolean; } export default function Dropdown({ className, buttonClassName, isStatic, children, title, dropdownContainerStyle, hideToggleArrow }: 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 (
) }