Skip to content

Commit 4a32205

Browse files
feat(components/standalone-accordion): make controlled
1 parent 6a55da4 commit 4a32205

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

lib/components/accordion/standalone-accordion.stories.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useDisclosure } from '@chakra-ui/react';
12
import type { Meta, StoryObj } from '@storybook/react';
23

34
import { Tab, TabList, TabPanel, TabPanels, Tabs } from '../tabs';
@@ -15,12 +16,14 @@ export default meta;
1516
type Story = StoryObj<typeof StandaloneAccordion>;
1617

1718
const Component = (props: StandaloneAccordionProps) => {
19+
const { isOpen, onToggle } = useDisclosure();
1820
return (
1921
<StandaloneAccordion
2022
{...props}
2123
label="The Best Flavours of Banana Sushi"
2224
badges={['Yum', 'Gourmet', 'Barf']}
23-
defaultIsOpen
25+
isOpen={isOpen}
26+
onToggle={onToggle}
2427
>
2528
<Tabs variant="collapse">
2629
<TabList>

lib/components/accordion/standalone-accordion.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
1-
import type { PropsWithChildren } from 'react';
2-
import { memo } from 'react';
1+
import type { MouseEventHandler, PropsWithChildren } from 'react';
2+
import { memo, useCallback } from 'react';
33

44
import { AccordionButton } from './accordion-button';
55
import { Accordion, AccordionItem, AccordionPanel } from './wrapper';
66

77
export type StandaloneAccordionProps = PropsWithChildren<{
88
label: string;
99
badges?: (string | number)[];
10-
defaultIsOpen?: boolean;
10+
isOpen: boolean;
11+
onToggle: () => void;
1112
}>;
1213

1314
export const StandaloneAccordion = memo((props: StandaloneAccordionProps) => {
15+
const onClick = useCallback<MouseEventHandler<HTMLButtonElement>>(
16+
(e) => {
17+
e.preventDefault();
18+
props.onToggle();
19+
},
20+
[props]
21+
);
1422
return (
15-
<Accordion allowToggle defaultIndex={props.defaultIsOpen ? 0 : undefined}>
23+
<Accordion index={props.isOpen ? 0 : undefined} allowToggle>
1624
<AccordionItem>
17-
<AccordionButton badges={props.badges}>{props.label}</AccordionButton>
25+
<AccordionButton badges={props.badges} onClick={onClick}>
26+
{props.label}
27+
</AccordionButton>
1828
<AccordionPanel>{props.children}</AccordionPanel>
1929
</AccordionItem>
2030
</Accordion>

0 commit comments

Comments
 (0)