Skip to content
Snippets Groups Projects
CollapsibleSection.tsx 1.33 KiB
Newer Older
insert's avatar
insert committed
import { ChevronDown } from "@styled-icons/boxicons-regular";

import { State, store } from "../../redux";
import { Action } from "../../redux/reducers";
insert's avatar
insert committed

import Details from "../ui/Details";

import { Children } from "../../types/Preact";

interface Props {
    id: string;
    defaultValue: boolean;
    sticky?: boolean;
    large?: boolean;
    summary: Children;
    children: Children;
insert's avatar
insert committed
export default function CollapsibleSection({
    id,
    defaultValue,
    summary,
    children,
    ...detailsProps
insert's avatar
insert committed
}: Props) {
    const state: State = store.getState();

    function setState(state: boolean) {
        if (state === defaultValue) {
            store.dispatch({
                type: "SECTION_TOGGLE_UNSET",
                id,
            } as Action);
        } else {
            store.dispatch({
                type: "SECTION_TOGGLE_SET",
                id,
                state,
            } as Action);
        }
    }

    return (
        <Details
            open={state.sectionToggle[id] ?? defaultValue}
            onToggle={(e) => setState(e.currentTarget.open)}
            {...detailsProps}>
            <summary>
                <div class="padding">
                    <ChevronDown size={20} />
                    {summary}
                </div>
            </summary>
            {children}
        </Details>
    );