Skip to content

Commit 7e3bf5a

Browse files
committed
feat(sidebar): Provide renderToggleButton for custom toggle component
1 parent abc11ee commit 7e3bf5a

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

src/elements/content-sidebar/ContentSidebar.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ class ContentSidebar extends React.Component<Props, State> {
377377
onPanelChange,
378378
onVersionChange,
379379
onVersionHistoryClick,
380+
renderToggleButton,
380381
signSidebarProps,
381382
theme,
382383
versionsSidebarProps,
@@ -420,6 +421,7 @@ class ContentSidebar extends React.Component<Props, State> {
420421
onPanelChange={onPanelChange}
421422
onVersionChange={onVersionChange}
422423
onVersionHistoryClick={onVersionHistoryClick}
424+
renderToggleButton={renderToggleButton}
423425
signSidebarProps={signSidebarProps}
424426
theme={theme}
425427
versionsSidebarProps={versionsSidebarProps}

src/elements/content-sidebar/Sidebar.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ class Sidebar extends React.Component<Props, State> {
311311
metadataSidebarProps,
312312
onAnnotationSelect,
313313
onVersionChange,
314+
renderToggleButton,
314315
signSidebarProps,
315316
theme,
316317
versionsSidebarProps,
@@ -351,6 +352,7 @@ class Sidebar extends React.Component<Props, State> {
351352
hasDocGen={docGenSidebarProps.isDocGenTemplate}
352353
isOpen={isOpen}
353354
onPanelChange={this.handlePanelChange}
355+
renderToggleButton={renderToggleButton}
354356
signSidebarProps={signSidebarProps}
355357
/>
356358
)}

src/elements/content-sidebar/SidebarNav.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type Props = {
5858
onPanelChange?: (name: string, isInitialState: boolean) => void,
5959
routerDisabled?: boolean,
6060
signSidebarProps: SignSidebarProps,
61+
renderToggleButton: () => React.ReactNode,
6162
};
6263

6364
const SidebarNav = ({
@@ -77,6 +78,7 @@ const SidebarNav = ({
7778
isOpen,
7879
onNavigate,
7980
onPanelChange = noop,
81+
renderToggleButton,
8082
routerDisabled,
8183
signSidebarProps,
8284
}: Props) => {
@@ -203,6 +205,7 @@ const SidebarNav = ({
203205
internalSidebarNavigation={internalSidebarNavigation}
204206
internalSidebarNavigationHandler={internalSidebarNavigationHandler}
205207
isOpen={isOpen}
208+
renderToggleButton={renderToggleButton}
206209
routerDisabled={routerDisabled}
207210
/>
208211
</div>

src/elements/content-sidebar/SidebarToggle.js

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,65 @@ import SidebarToggleButton from '../../components/sidebar-toggle-button/SidebarT
1111
import { SIDEBAR_NAV_TARGETS } from '../common/interactionTargets';
1212
import type { InternalSidebarNavigation, InternalSidebarNavigationHandler } from '../common/types/SidebarNavigation';
1313

14+
type ToggleButtonProps = {
15+
'data-resin-target'?: string,
16+
'data-testid'?: string,
17+
isOpen: boolean,
18+
handleToggleClick: (event: React.MouseEvent<HTMLButtonElement>) => void,
19+
};
20+
1421
type Props = {
1522
history?: RouterHistory,
1623
internalSidebarNavigation?: InternalSidebarNavigation,
1724
internalSidebarNavigationHandler?: InternalSidebarNavigationHandler,
1825
isOpen?: boolean,
26+
renderToggleButton?: (toggleButtonProps: ToggleButtonProps) => React.ReactNode,
1927
routerDisabled?: boolean,
2028
};
2129

22-
const SidebarToggle = ({
23-
history,
30+
const SidebarToggle = ({
31+
history,
2432
internalSidebarNavigation,
2533
internalSidebarNavigationHandler,
2634
isOpen,
35+
renderToggleButton,
2736
routerDisabled = false,
2837
}: Props) => {
29-
const handleToggleClick = event => {
30-
event.preventDefault();
31-
32-
if (routerDisabled) {
33-
// Use internal navigation handler when router is disabled
34-
if (internalSidebarNavigationHandler && internalSidebarNavigation) {
35-
internalSidebarNavigationHandler({
36-
...internalSidebarNavigation,
37-
open: !isOpen,
38-
}, true); // Always use replace for toggle
38+
const handleToggleClick = React.useCallback(
39+
(event: React.MouseEvent<HTMLButtonElement>) => {
40+
event.preventDefault();
41+
42+
if (routerDisabled) {
43+
// Use internal navigation handler when router is disabled
44+
if (internalSidebarNavigationHandler && internalSidebarNavigation) {
45+
internalSidebarNavigationHandler(
46+
{
47+
...internalSidebarNavigation,
48+
open: !isOpen,
49+
},
50+
true,
51+
); // Always use replace for toggle
52+
}
53+
} else if (history) {
54+
history.replace({ state: { open: !isOpen } });
3955
}
40-
} else if (history) {
41-
history.replace({ state: { open: !isOpen } });
42-
}
43-
};
56+
},
57+
[history, isOpen, routerDisabled, internalSidebarNavigationHandler, internalSidebarNavigation],
58+
);
59+
60+
const renderProps = React.useMemo(
61+
() => ({
62+
isOpen,
63+
onClick: handleToggleClick,
64+
'data-resin-target': SIDEBAR_NAV_TARGETS.TOGGLE,
65+
'data-testid': 'sidebartoggle',
66+
}),
67+
[isOpen, handleToggleClick],
68+
);
4469

45-
return (
70+
return renderToggleButton ? (
71+
renderToggleButton(renderProps)
72+
) : (
4673
<SidebarToggleButton
4774
data-resin-target={SIDEBAR_NAV_TARGETS.TOGGLE}
4875
data-testid="sidebartoggle"

0 commit comments

Comments
 (0)