summaryrefslogtreecommitdiff
path: root/src/components/CollapsibleSectionHeader.tsx
diff options
context:
space:
mode:
authorHaishan <[email protected]>2020-08-06 16:26:01 +0800
committerHaishan <[email protected]>2020-08-06 22:40:26 +0800
commit2c9ee574ddd5d242021e5954ca6f6144f99eb7f2 (patch)
treef085d8083f106f2decd1156c6ba715c34acd38ed /src/components/CollapsibleSectionHeader.tsx
parent941224c13ba87d2c3f36fb86652f046a5c76e00d (diff)
refactor: improve a11y
Diffstat (limited to 'src/components/CollapsibleSectionHeader.tsx')
-rw-r--r--src/components/CollapsibleSectionHeader.tsx50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/components/CollapsibleSectionHeader.tsx b/src/components/CollapsibleSectionHeader.tsx
new file mode 100644
index 0000000..77e7596
--- /dev/null
+++ b/src/components/CollapsibleSectionHeader.tsx
@@ -0,0 +1,50 @@
+import cx from 'clsx';
+import * as React from 'react';
+import { ChevronDown } from 'react-feather';
+
+import { keyCodes } from '../misc/keycode';
+import Button from './Button';
+import s from './CollapsibleSectionHeader.module.css';
+import { SectionNameType } from './shared/Basic';
+
+type Props = {
+ name: string;
+ type: string;
+ qty?: number;
+ toggle?: () => void;
+ isOpen?: boolean;
+};
+
+export default function Header({ name, type, toggle, isOpen, qty }: Props) {
+ const handleKeyDown = React.useCallback(
+ (e: React.KeyboardEvent) => {
+ e.preventDefault();
+ if (e.keyCode === keyCodes.Enter || e.keyCode === keyCodes.Space) {
+ toggle();
+ }
+ },
+ [toggle]
+ );
+ return (
+ <div
+ className={s.header}
+ onClick={toggle}
+ style={{ cursor: 'pointer' }}
+ tabIndex={0}
+ onKeyDown={handleKeyDown}
+ role="button"
+ >
+ <div>
+ <SectionNameType name={name} type={type} />
+ </div>
+
+ {typeof qty === 'number' ? <span className={s.qty}>{qty}</span> : null}
+
+ <Button kind="minimal" onClick={toggle} className={s.btn}>
+ <span className={cx(s.arrow, { [s.isOpen]: isOpen })}>
+ <ChevronDown size={20} />
+ </span>
+ </Button>
+ </div>
+ );
+}