1
- import React , { useState , useEffect , useRef } from 'react'
1
+ import React , { useState , useEffect , useRef , useCallback } from 'react'
2
2
import PropTypes from 'prop-types'
3
3
import clsx from 'clsx'
4
4
import { makeStyles , useTheme } from '@material-ui/core/styles'
@@ -10,14 +10,8 @@ import AppHeader from '../../_common/AppHeader'
10
10
import AppFooter from '../../_common/AppFooter'
11
11
import AppSidebar from '../../_common/AppSidebar'
12
12
13
- const DashboardLayout = (
14
- { header, footer, sidebar, children } = {
15
- header : AppHeader ,
16
- footer : AppFooter ,
17
- sidebar : AppSidebar ,
18
- } ,
19
- ) => {
20
- const refHeaderContainer = useRef ( null )
13
+ const DashboardLayout : React . FC = ( { children } ) => {
14
+ const refHeaderContainer = useRef < HTMLDivElement > ( null )
21
15
22
16
const classes = useStyles ( )
23
17
const theme = useTheme ( )
@@ -30,9 +24,10 @@ const DashboardLayout = (
30
24
const [ isSidebarCollapsed , setIsSidebarCollapsed ] = useState ( false )
31
25
32
26
useEffect ( ( ) => {
33
- // code to run on component mount
34
- setHeaderHeight ( refHeaderContainer . current . offsetHeight )
35
- } , [ ] )
27
+ if ( refHeaderContainer && refHeaderContainer . current ) {
28
+ setHeaderHeight ( refHeaderContainer . current . offsetHeight )
29
+ }
30
+ } , [ refHeaderContainer ] )
36
31
37
32
const contentOffset = ( ( ) => {
38
33
if ( ( isDesktop && ! isSidebarOpenDesktop ) || isMobile ) {
@@ -44,24 +39,20 @@ const DashboardLayout = (
44
39
}
45
40
} ) ( )
46
41
47
- const HeaderComponent = header
48
- const SidebarComponent = sidebar
49
- const FooterComponent = footer
50
-
51
42
function handleSidebarToggleOpenMobile ( ) {
52
43
setIsSidebarOpenMobile ( ! isSidebarOpenMobile )
53
44
}
54
45
55
- function handleSidebarToggle ( ) {
46
+ const handleSidebarToggle = useCallback ( ( ) => {
56
47
// Open/close on mobile
57
48
if ( isMobile ) {
58
- setIsSidebarOpenMobile ( ! isSidebarOpenMobile )
49
+ setIsSidebarOpenMobile ( ( isSidebarOpenMobile ) => ! isSidebarOpenMobile )
59
50
}
60
51
// Collapse/uncollapse on desktop
61
52
else {
62
- setIsSidebarCollapsed ( ! isSidebarCollapsed )
53
+ setIsSidebarCollapsed ( ( isSidebarCollapsed ) => ! isSidebarCollapsed )
63
54
}
64
- }
55
+ } , [ isMobile ] )
65
56
66
57
// function handleSidebarToggleCollapse() {
67
58
// setIsSidebarCollapsed(!isSidebarCollapsed)
@@ -76,7 +67,7 @@ const DashboardLayout = (
76
67
width : `calc(100% - ${ contentOffset } px)` ,
77
68
} }
78
69
>
79
- { HeaderComponent && < HeaderComponent onToggleClick = { handleSidebarToggle } /> }
70
+ < AppHeader onToggleClick = { handleSidebarToggle } />
80
71
</ div >
81
72
< div
82
73
// ref={refSidebarContainer}
@@ -99,7 +90,7 @@ const DashboardLayout = (
99
90
keepMounted : true , // Better open performance on mobile.
100
91
} }
101
92
>
102
- { SidebarComponent && < SidebarComponent /> }
93
+ < AppSidebar />
103
94
</ Drawer >
104
95
</ Hidden >
105
96
{ /* Desktop sidebar */ }
@@ -110,7 +101,7 @@ const DashboardLayout = (
110
101
} }
111
102
variant = "permanent"
112
103
>
113
- { SidebarComponent && < SidebarComponent isCollapsed = { isSidebarCollapsed } /> }
104
+ < AppSidebar isCollapsed = { isSidebarCollapsed } />
114
105
</ Drawer >
115
106
</ Hidden >
116
107
</ div >
@@ -122,7 +113,7 @@ const DashboardLayout = (
122
113
>
123
114
< div className = { classes . contentContainer } > { children } </ div >
124
115
< div className = { classes . footerContainer } >
125
- { FooterComponent && < FooterComponent /> }
116
+ < AppFooter />
126
117
</ div >
127
118
</ main >
128
119
</ div >
0 commit comments