import classNames from "classnames"; import { atom, useAtom } from "jotai"; import type { HTMLAttributes, ReactNode } from "react"; import { useMemo } from "react"; import { atomWithKVStorage } from "../../lib/atoms/atomWithKVStorage"; import type { BannerProps } from "./Banner"; import { Banner } from "./Banner"; interface Props extends HTMLAttributes { summary: ReactNode; color?: BannerProps["color"]; defaultOpen?: boolean; storageKey?: string; } export function DetailsBanner({ className, color, summary, children, defaultOpen, storageKey, ...extraProps }: Props) { // oxlint-disable-next-line react-hooks/exhaustive-deps -- We only want to recompute the atom when storageKey changes const openAtom = useMemo( () => storageKey ? atomWithKVStorage(["details_banner", storageKey], defaultOpen ?? false) : atom(defaultOpen ?? false), [storageKey], ); const [isOpen, setIsOpen] = useAtom(openAtom); const handleToggle = (e: React.SyntheticEvent) => { if (storageKey) { setIsOpen(e.currentTarget.open); } }; return (
{summary}
{children}
); }