Skip to content

Commit 676cd67

Browse files
committed
suggested refactor
1 parent de2a24c commit 676cd67

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

packages/react/src/accordion/panel/AccordionPanel.tsx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ import { AccordionPanelCssVars } from './AccordionPanelCssVars';
1414
import { useOpenChangeComplete } from '../../utils/useOpenChangeComplete';
1515
import { useRenderElement } from '../../utils/useRenderElement';
1616
import type { TransitionStatus } from '../../utils/useTransitionStatus';
17+
import type { StateAttributesMapping } from '../../utils/getStateAttributesProps';
18+
import { AccordionPanelDataAttributes } from './AccordionPanelDataAttributes';
19+
20+
const stateAttributesMapping: StateAttributesMapping<AccordionPanel.State> = {
21+
...accordionStateAttributesMapping,
22+
open: (open) => {
23+
const hidden = !open;
24+
const itemMapping = accordionStateAttributesMapping.open?.(open) ?? {};
25+
if (hidden) {
26+
return {
27+
...itemMapping,
28+
[AccordionPanelDataAttributes.hidden]: '',
29+
};
30+
}
31+
return itemMapping;
32+
},
33+
};
1734

1835
/**
1936
* A collapsible panel with the accordion item contents.
@@ -132,9 +149,8 @@ export const AccordionPanel = React.forwardRef(function AccordionPanel(
132149
() => ({
133150
...state,
134151
transitionStatus,
135-
hidden: !open,
136152
}),
137-
[state, transitionStatus, open],
153+
[state, transitionStatus],
138154
);
139155

140156
const element = useRenderElement('div', componentProps, {
@@ -154,7 +170,7 @@ export const AccordionPanel = React.forwardRef(function AccordionPanel(
154170
},
155171
elementProps,
156172
],
157-
stateAttributesMapping: accordionStateAttributesMapping,
173+
stateAttributesMapping,
158174
});
159175

160176
const shouldRender = keepMounted || hiddenUntilFound || (!keepMounted && mounted);

packages/react/src/collapsible/panel/CollapsiblePanel.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ import { BaseUIComponentProps } from '../../utils/types';
66
import { useRenderElement } from '../../utils/useRenderElement';
77
import { useCollapsibleRootContext } from '../root/CollapsibleRootContext';
88
import type { CollapsibleRoot } from '../root/CollapsibleRoot';
9-
import { collapsibleStateAttributesMapping } from '../root/stateAttributesMapping';
9+
import { transitionStatusMapping } from '../../utils/stateAttributesMapping';
10+
import { panelOpenStateMapping } from '../../utils/collapsibleOpenStateMapping';
1011
import { useCollapsiblePanel } from './useCollapsiblePanel';
1112
import { CollapsiblePanelCssVars } from './CollapsiblePanelCssVars';
1213
import { useOpenChangeComplete } from '../../utils/useOpenChangeComplete';
1314
import type { TransitionStatus } from '../../utils/useTransitionStatus';
15+
import type { StateAttributesMapping } from '../../utils/getStateAttributesProps';
1416

17+
const stateAttributesMapping: StateAttributesMapping<CollapsiblePanel.State> = {
18+
...panelOpenStateMapping,
19+
...transitionStatusMapping,
20+
};
1521
/**
1622
* A panel with the collapsible contents.
1723
* Renders a `<div>` element.
@@ -124,10 +130,9 @@ export const CollapsiblePanel = React.forwardRef(function CollapsiblePanel(
124130
const panelState: CollapsiblePanel.State = React.useMemo(
125131
() => ({
126132
...state,
127-
hidden: !open,
128133
transitionStatus,
129134
}),
130-
[state, transitionStatus, open],
135+
[state, transitionStatus],
131136
);
132137

133138
const element = useRenderElement('div', componentProps, {
@@ -145,7 +150,7 @@ export const CollapsiblePanel = React.forwardRef(function CollapsiblePanel(
145150
},
146151
elementProps,
147152
],
148-
stateAttributesMapping: collapsibleStateAttributesMapping,
153+
stateAttributesMapping,
149154
});
150155

151156
const shouldRender = keepMounted || hiddenUntilFound || (!keepMounted && mounted);
@@ -159,7 +164,6 @@ export const CollapsiblePanel = React.forwardRef(function CollapsiblePanel(
159164

160165
export interface CollapsiblePanelState extends CollapsibleRoot.State {
161166
transitionStatus: TransitionStatus;
162-
hidden: boolean;
163167
}
164168

165169
export interface CollapsiblePanelProps extends BaseUIComponentProps<'div', CollapsiblePanel.State> {

packages/react/src/utils/collapsibleOpenStateMapping.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,21 @@ export const collapsibleOpenStateMapping = {
3333
} satisfies StateAttributesMapping<{
3434
open: boolean;
3535
}>;
36+
37+
export const panelOpenStateMapping = {
38+
open: (open) => {
39+
const panelHidden = !open;
40+
const collapsibleStateMapping = collapsibleOpenStateMapping.open(open);
41+
42+
if (panelHidden) {
43+
return {
44+
...collapsibleStateMapping,
45+
[CollapsiblePanelDataAttributes.hidden]: '',
46+
};
47+
}
48+
49+
return collapsibleStateMapping;
50+
},
51+
} satisfies StateAttributesMapping<{
52+
open: boolean;
53+
}>;

0 commit comments

Comments
 (0)