-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathindex.tsx
79 lines (71 loc) · 2.33 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import React, { useState, useRef, ReactNode, useEffect } from "react";
import Chevron from "./Chevron.svg";
import clsx from "clsx";
import "./Accordion.scss";
type AccordionVariants = "underline" | "bordered" | "shadow";
type AccordionProps = {
children: ReactNode;
defaultOpen?: boolean;
isCompact?: boolean;
title: string;
variant?: AccordionVariants;
};
const AccordionVariant = {
bordered: "deriv-accordion--bordered",
shadow: "deriv-accordion--shadow",
underline: "deriv-accordion--underline",
} as const;
export const Accordion = ({
defaultOpen = false,
children,
isCompact = false,
title,
variant = "underline",
}: AccordionProps) => {
const [active, setActive] = useState(defaultOpen);
const [setHeight, setHeightState] = useState(defaultOpen ? "auto" : "0px");
const content = useRef<HTMLDivElement | null>(null);
useEffect(() => {
const scrollHeight = content?.current?.scrollHeight;
setHeightState(active ? `${scrollHeight}px` : "0px");
}, [active]);
const toggleAccordion = () => setActive(!active);
return (
<div
className={clsx("deriv-accordion", AccordionVariant[variant], {
"deriv-accordion--compact": isCompact,
})}
>
<button
className={clsx("deriv-accordion__header", {
"deriv-accordion__header--active": active,
})}
onClick={toggleAccordion}
aria-expanded={active}
>
<p>{title}</p>
<img
src={Chevron}
className={clsx("deriv-accordion__icon", {
"deriv-accordion__icon--active": active,
})}
/>
</button>
<div
ref={content}
style={{ maxHeight: setHeight }}
className={clsx("deriv-accordion__content", {
"deriv-accordion__content--active": active,
})}
>
<div
className={clsx("deriv-accordion__text", {
"deriv-accordion__text--compact": isCompact,
})}
>
{children}
</div>
</div>
</div>
);
};