Skip to content
Snippets Groups Projects
CollapsibleSection.tsx 1.05 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 {
insert's avatar
insert committed
	id: string;
	defaultValue: boolean;
insert's avatar
insert committed
	sticky?: boolean;
	large?: boolean;
insert's avatar
insert committed
	summary: Children;
	children: Children;
insert's avatar
insert committed
export default function CollapsibleSection({
	id,
	defaultValue,
	summary,
	children,
	...detailsProps
}: 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>
	);