1- import React from 'react' ;
21import { VscListSelection , VscCode , VscOpenPreview , VscGraph , VscNewFile } from 'react-icons/vsc' ;
32
43import { Tooltip } from './common' ;
54import { SettingsModal } from './Modals/Settings/SettingsModal' ;
65
7- import state from '../state' ;
6+ import { usePanelsState , panelsState } from '../state/index. state' ;
87
9- type NavItemType = 'navigation' | 'editor' | 'template' | 'visualiser' ;
8+ import type { FunctionComponent , ReactNode } from 'react' ;
9+ import type { PanelsState } from '../state/panels.state' ;
1010
11- function setActiveNav ( navItem : NavItemType ) {
12- const panels = state . sidebar . panels ;
13- const panelsState = panels . get ( ) ;
11+ function updateState ( panelName : keyof PanelsState [ 'show' ] , type ?: PanelsState [ 'secondaryPanelType' ] ) {
12+ const settingsState = panelsState . getState ( ) ;
13+ let secondaryPanelType = settingsState . secondaryPanelType ;
14+ const newShow = { ...settingsState . show } ;
1415
15- const newState = {
16- ...panelsState ,
17- } ;
18-
19- if ( navItem === 'template' || navItem === 'visualiser' ) {
16+ if ( type === 'template' || type === 'visualiser' ) {
2017 // on current type
21- if ( newState . viewType === navItem ) {
22- newState . view = ! newState . view ;
18+ if ( secondaryPanelType === type ) {
19+ newShow [ ` ${ panelName } ` ] = ! newShow [ ` ${ panelName } ` ] ;
2320 } else {
24- newState . viewType = navItem ;
25- if ( newState . view === false ) {
26- newState . view = true ;
21+ secondaryPanelType = type ;
22+ if ( newShow [ ` ${ panelName } ` ] === false ) {
23+ newShow [ ` ${ panelName } ` ] = true ;
2724 }
2825 }
2926 } else {
30- newState [ `${ navItem } ` ] = ! newState [ `${ navItem } ` ] ;
27+ newShow [ `${ panelName } ` ] = ! newShow [ `${ panelName } ` ] ;
3128 }
3229
33- if ( newState . navigation && ! newState . editor && ! newState . view ) {
34- panels . set ( {
35- ...newState ,
36- view : true ,
37- } ) ;
38- return ;
39- }
40- if ( ! Object . values ( newState ) . some ( itemNav => itemNav === true ) ) {
41- panels . set ( {
42- ...newState ,
43- view : true ,
44- } ) ;
45- return ;
30+ if ( ! newShow . primaryPanel && ! newShow . secondaryPanel ) {
31+ newShow . secondaryPanel = true ;
4632 }
4733
48- panels . set ( newState ) ;
34+ panelsState . setState ( {
35+ show : newShow ,
36+ secondaryPanelType,
37+ } ) ;
4938}
5039
5140interface NavItem {
5241 name : string ;
5342 title : string ;
54- isActive : ( ) => boolean ;
55- icon : React . ReactNode ;
56- tooltip : React . ReactNode ;
43+ isActive : boolean ;
44+ updateState ?: ( ) => void ;
45+ icon : ReactNode ;
46+ tooltip : ReactNode ;
5747}
5848
5949interface SidebarProps { }
6050
61- export const Sidebar : React . FunctionComponent < SidebarProps > = ( ) => {
62- const sidebarState = state . useSidebarState ( ) ;
51+ export const Sidebar : FunctionComponent < SidebarProps > = ( ) => {
52+ const { show , secondaryPanelType } = usePanelsState ( ) ;
6353
64- if ( sidebarState . show . get ( ) === false ) {
54+ if ( show . activityBar === false ) {
6555 return null ;
6656 }
6757
6858 const navigation : NavItem [ ] = [
6959 // navigation
7060 {
71- name : 'navigation ' ,
61+ name : 'primarySidebar ' ,
7262 title : 'Navigation' ,
73- isActive : ( ) => sidebarState . panels . navigation . get ( ) ,
63+ isActive : show . primarySidebar ,
64+ updateState : ( ) => updateState ( 'primarySidebar' ) ,
7465 icon : < VscListSelection className = "w-5 h-5" /> ,
7566 tooltip : 'Navigation' ,
7667 } ,
7768 // editor
7869 {
79- name : 'editor ' ,
70+ name : 'primaryPanel ' ,
8071 title : 'Editor' ,
81- isActive : ( ) => sidebarState . panels . editor . get ( ) ,
72+ isActive : show . primaryPanel ,
73+ updateState : ( ) => updateState ( 'primaryPanel' ) ,
8274 icon : < VscCode className = "w-5 h-5" /> ,
8375 tooltip : 'Editor' ,
8476 } ,
8577 // template
8678 {
8779 name : 'template' ,
8880 title : 'Template' ,
89- isActive : ( ) => sidebarState . panels . view . get ( ) && sidebarState . panels . viewType . get ( ) === 'template' ,
81+ isActive : show . secondaryPanel && secondaryPanelType === 'template' ,
82+ updateState : ( ) => updateState ( 'secondaryPanel' , 'template' ) ,
9083 icon : < VscOpenPreview className = "w-5 h-5" /> ,
9184 tooltip : 'HTML preview' ,
9285 } ,
9386 // visuliser
9487 {
9588 name : 'visualiser' ,
9689 title : 'Visualiser' ,
97- isActive : ( ) => sidebarState . panels . view . get ( ) && sidebarState . panels . viewType . get ( ) === 'visualiser' ,
90+ isActive : show . secondaryPanel && secondaryPanelType === 'visualiser' ,
91+ updateState : ( ) => updateState ( 'secondaryPanel' , 'visualiser' ) ,
9892 icon : < VscGraph className = "w-5 h-5" /> ,
9993 tooltip : 'Blocks visualiser' ,
10094 } ,
10195 // newFile
10296 {
10397 name : 'newFile' ,
10498 title : 'New file' ,
105- isActive : ( ) => false ,
99+ isActive : false ,
100+ updateState : ( ) => panelsState . setState ( { newFileOpened : true } ) ,
106101 icon : < VscNewFile className = "w-5 h-5" /> ,
107102 tooltip : 'New file' ,
108103 } ,
@@ -115,11 +110,11 @@ export const Sidebar: React.FunctionComponent<SidebarProps> = () => {
115110 < Tooltip content = { item . tooltip } placement = 'right' hideOnClick = { true } key = { item . name } >
116111 < button
117112 title = { item . title }
118- onClick = { ( ) => setActiveNav ( item . name as NavItemType ) }
113+ onClick = { ( ) => item . updateState ?. ( ) }
119114 className = { 'flex text-sm focus:outline-none border-box p-2' }
120115 type = "button"
121116 >
122- < div className = { item . isActive ( ) ? 'bg-gray-600 p-2 rounded text-white' : 'p-2 text-gray-500 hover:text-white' } >
117+ < div className = { item . isActive ? 'bg-gray-600 p-2 rounded text-white' : 'p-2 text-gray-500 hover:text-white' } >
123118 { item . icon }
124119 </ div >
125120 </ button >
0 commit comments