1
- import React , { Component } from 'react' ;
1
+ import React , { useState } from 'react' ;
2
2
import PropTypes from 'prop-types' ;
3
3
import { concat } from 'ramda' ;
4
4
@@ -9,13 +9,24 @@ import ClockIcon from '../icons/ClockIcon.svg';
9
9
import ErrorIcon from '../icons/ErrorIcon.svg' ;
10
10
import GraphIcon from '../icons/GraphIcon.svg' ;
11
11
import OffIcon from '../icons/OffIcon.svg' ;
12
+ import Collapse from '../icons/Collapse.svg' ;
13
+ import Expand from '../icons/Expand.svg' ;
12
14
import { VersionInfo } from './VersionInfo.react' ;
13
15
import { CallbackGraphContainer } from '../CallbackGraph/CallbackGraphContainer.react' ;
14
16
import { FrontEndErrorContainer } from '../FrontEnd/FrontEndErrorContainer.react' ;
15
17
16
18
const classes = ( base , variant , variant2 ) =>
17
19
`${ base } ${ base } --${ variant } ` + ( variant2 ? ` ${ base } --${ variant2 } ` : '' ) ;
18
20
21
+ const isCollapsed = ( ) => {
22
+ try {
23
+ return localStorage . getItem ( 'dash_debug_menu_collapsed' ) === 'true' ;
24
+ } catch ( e ) {
25
+ // If localStorage is not available, default to false
26
+ return false ;
27
+ }
28
+ }
29
+
19
30
const MenuContent = ( {
20
31
hotReload,
21
32
connected,
@@ -81,71 +92,73 @@ const MenuContent = ({
81
92
) ;
82
93
} ;
83
94
84
- class DebugMenu extends Component {
85
- constructor ( props ) {
86
- super ( props ) ;
95
+ const DebugMenu = ( { error, hotReload, config, children} ) => {
96
+ const [ popup , setPopup ] = useState ( 'errors' ) ;
97
+ const [ collapsed , setCollapsed ] = useState ( isCollapsed ) ;
98
+
99
+ const errCount = error . frontEnd . length + error . backEnd . length ;
100
+ const connected = error . backEndConnected ;
101
+
102
+ const toggleErrors = ( ) => {
103
+ setPopup ( popup == 'errors' ? null : 'errors' ) ;
104
+ } ;
105
+
106
+ const toggleCallbackGraph = ( ) => {
107
+ setPopup ( popup == 'callbackGraph' ? null : 'callbackGraph' )
108
+ } ;
109
+
110
+ const errors = concat ( error . frontEnd , error . backEnd ) ;
111
+
112
+ const popupContent = (
113
+ < div className = 'dash-debug-menu__popup' >
114
+ { popup == 'callbackGraph' ? (
115
+ < CallbackGraphContainer />
116
+ ) : undefined }
117
+ { popup == 'errors' && errCount > 0 ? (
118
+ < FrontEndErrorContainer
119
+ clickHandler = { toggleErrors }
120
+ errors = { errors }
121
+ connected = { error . backEndConnected }
122
+ />
123
+ ) : undefined }
124
+ </ div >
125
+ ) ;
87
126
88
- this . state = {
89
- opened : false ,
90
- popup : 'errors'
91
- } ;
92
- }
127
+ const menuContent = (
128
+ collapsed ?
129
+ undefined :
130
+ < MenuContent
131
+ popup = { popup }
132
+ errCount = { errCount }
133
+ toggleErrors = { toggleErrors }
134
+ toggleCallbackGraph = { toggleCallbackGraph }
135
+ config = { config }
136
+ hotReload = { hotReload }
137
+ connected = { connected }
138
+ />
139
+ ) ;
93
140
94
- render ( ) {
95
- const { popup} = this . state ;
96
- const { error, hotReload, config} = this . props ;
97
- const errCount = error . frontEnd . length + error . backEnd . length ;
98
- const connected = error . backEndConnected ;
99
-
100
- const toggleErrors = ( ) => {
101
- this . setState ( { popup : popup == 'errors' ? null : 'errors' } ) ;
102
- } ;
103
-
104
- const toggleCallbackGraph = ( ) => {
105
- this . setState ( {
106
- popup : popup == 'callbackGraph' ? null : 'callbackGraph'
107
- } ) ;
108
- } ;
109
-
110
- const errors = concat ( error . frontEnd , error . backEnd ) ;
111
-
112
- const popupContent = (
113
- < div className = 'dash-debug-menu__popup' >
114
- { popup == 'callbackGraph' ? (
115
- < CallbackGraphContainer />
116
- ) : undefined }
117
- { popup == 'errors' && errCount > 0 ? (
118
- < FrontEndErrorContainer
119
- clickHandler = { toggleErrors }
120
- errors = { errors }
121
- connected = { error . backEndConnected }
122
- />
123
- ) : undefined }
124
- </ div >
125
- ) ;
126
-
127
- const menuContent = (
128
- < MenuContent
129
- popup = { popup }
130
- errCount = { errCount }
131
- toggleErrors = { toggleErrors }
132
- toggleCallbackGraph = { toggleCallbackGraph }
133
- config = { config }
134
- hotReload = { hotReload }
135
- connected = { connected }
136
- />
137
- ) ;
138
-
139
- return (
140
- < div >
141
- < div className = { classes ( 'dash-debug-menu__outer' ) } >
142
- { popupContent }
143
- { menuContent }
144
- </ div >
145
- { this . props . children }
141
+ return (
142
+ < div >
143
+ < div className = { classes ( 'dash-debug-menu__outer' ) } >
144
+ { popupContent }
145
+ { menuContent }
146
+ < button onClick = {
147
+ ( ) => {
148
+ setCollapsed ( ! collapsed ) ;
149
+ try {
150
+ localStorage . setItem ( 'dash_debug_menu_collapsed' , ! collapsed ) ;
151
+ } catch ( e ) {
152
+ // If localStorage is not available, do nothing
153
+ }
154
+ }
155
+ } >
156
+ { collapsed ? < Expand /> : < Collapse /> }
157
+ </ button >
146
158
</ div >
147
- ) ;
148
- }
159
+ { children }
160
+ </ div >
161
+ ) ;
149
162
}
150
163
151
164
DebugMenu . propTypes = {
0 commit comments