@@ -2,20 +2,29 @@ import React, { useCallback, useState } from "react";
22
33import { Button } from "@canonical/react-components" ;
44import classNames from "classnames" ;
5- import { useNavigate } from "react-router-dom" ;
5+ import { useLocation , useNavigate } from "react-router-dom" ;
66
77import NavigationBanner from "./NavigationBanner" ;
88import NavigationItems from "./NavigationItems" ;
99
1010import NavigationCollapseToggle from "@/components/Navigation/NavigationCollapseToggle" ;
1111import SiteSelector from "@/components/SiteSelector" ;
12+ import { VIEW_OWNED , VIEW_REVIEWED , VIEW_TABLE , VIEW_TREE } from "@/config" ;
1213import type { IUser } from "@/services/api/types/users" ;
14+ import type { TView } from "@/services/api/types/views" ;
1315import { useStore } from "@/store" ;
16+ import { useViewsStore } from "@/store/views" ;
1417
1518const Navigation = ( ) : JSX . Element => {
1619 const navigate = useNavigate ( ) ;
20+ const location = useLocation ( ) ;
1721 const [ isCollapsed , setIsCollapsed ] = useState ( true ) ;
1822 const [ user , setUser ] = useStore ( ( state ) => [ state . user , state . setUser ] ) ;
23+ const [ view , setView , setExpandedProject ] = useViewsStore ( ( state ) => [
24+ state . view ,
25+ state . setView ,
26+ state . setExpandedProject ,
27+ ] ) ;
1928
2029 const logout = useCallback ( ( ) => {
2130 setUser ( { } as IUser ) ;
@@ -26,6 +35,24 @@ const Navigation = (): JSX.Element => {
2635 navigate ( "/app/new-webpage" ) ;
2736 } , [ navigate ] ) ;
2837
38+ const changeView = useCallback (
39+ ( view : TView ) => {
40+ setExpandedProject ( "" ) ;
41+ setView ( view ) ;
42+ if ( [ VIEW_OWNED , VIEW_REVIEWED ] . includes ( view ) ) navigate ( `/app/views/${ view } ` ) ;
43+ if ( [ VIEW_TABLE , VIEW_TREE ] . includes ( view ) ) navigate ( "/app" ) ;
44+ } ,
45+ [ navigate , setExpandedProject , setView ] ,
46+ ) ;
47+
48+ const isViewActive = useCallback (
49+ ( linkView : TView ) => {
50+ if ( view === VIEW_TREE ) return linkView === view ;
51+ return linkView === view && location . pathname === `/app/views/${ linkView } ` ;
52+ } ,
53+ [ location . pathname , view ] ,
54+ ) ;
55+
2956 return (
3057 < >
3158 < header className = "l-navigation-bar" >
@@ -48,15 +75,66 @@ const Navigation = (): JSX.Element => {
4875 < div className = "l-navigation__controls" >
4976 < NavigationCollapseToggle isCollapsed = { isCollapsed } setIsCollapsed = { setIsCollapsed } />
5077 </ div >
51- < SiteSelector />
52- < Button appearance = "" className = "l-new-webpage-button" hasIcon onClick = { handleNewPageClick } >
53- < React . Fragment key = ".0" >
54- < i className = "p-icon--plus" /> < span > Request new page</ span >
55- </ React . Fragment >
56- </ Button >
78+ < div >
79+ < Button appearance = "" className = "l-new-webpage-button" hasIcon onClick = { handleNewPageClick } >
80+ < React . Fragment key = ".0" >
81+ < i className = "p-icon--plus" /> < span > Request new page</ span >
82+ </ React . Fragment >
83+ </ Button >
84+ </ div >
5785 </ div >
86+ < hr className = "p-rule" />
5887 < div className = "p-panel__content" >
59- < NavigationItems />
88+ < ul className = "u-no-margin--left u-no-padding" >
89+ < li
90+ className = { `p-side-navigation__link ${ location . pathname === "/app" && view !== VIEW_TREE && "is-active" } ` }
91+ onClick = { ( ) => changeView ( VIEW_TABLE ) }
92+ >
93+ < span className = "u-has-icon" >
94+ < i className = "p-icon--switcher-dashboard is-dark" />
95+ Table view
96+ </ span >
97+ </ li >
98+ < li
99+ className = { `p-side-navigation__link ${ isViewActive ( VIEW_TREE ) && "is-active" } ` }
100+ onClick = { ( ) => changeView ( VIEW_TREE ) }
101+ >
102+ < span className = "u-has-icon" >
103+ < i className = "p-icon--switcher-environments is-dark" />
104+ Tree view
105+ </ span >
106+ </ li >
107+ </ ul >
108+ { isViewActive ( VIEW_TREE ) && (
109+ < >
110+ < SiteSelector />
111+ < NavigationItems />
112+ </ >
113+ ) }
114+ </ div >
115+ < div className = "p-panel__views" >
116+ < hr className = "p-rule" />
117+ < p className = "p-muted-heading u-text--muted" > Quick views</ p >
118+ < ul className = "u-no-margin u-no-padding" >
119+ < li
120+ className = { `p-side-navigation__link ${ isViewActive ( VIEW_OWNED ) && "is-active" } ` }
121+ onClick = { ( ) => changeView ( VIEW_OWNED ) }
122+ >
123+ < span className = "u-has-icon" >
124+ < i className = "p-icon--user" />
125+ Owned by me
126+ </ span >
127+ </ li >
128+ < li
129+ className = { `p-side-navigation__link ${ isViewActive ( VIEW_REVIEWED ) && "is-active" } ` }
130+ onClick = { ( ) => changeView ( VIEW_REVIEWED ) }
131+ >
132+ < span className = "u-has-icon" >
133+ < i className = "p-icon--show" />
134+ Reviewed by me
135+ </ span >
136+ </ li >
137+ </ ul >
60138 </ div >
61139 < div className = "p-panel__footer p-side-navigation--icons" >
62140 < div className = "u-no-margin u-truncate p-side-navigation__label" >
0 commit comments