@@ -11,38 +11,65 @@ import SidebarToggleButton from '../../components/sidebar-toggle-button/SidebarT
1111import { SIDEBAR_NAV_TARGETS } from '../common/interactionTargets' ;
1212import 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+
1421type 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