11import './menu.css'
22import { OutlineManager } from '../outline/manager'
3- import { authSession , authn } from 'solid-logic'
3+ import { authSession } from 'solid-logic'
44
55type MenuItem = {
66 id ?: string
7+ icon ?: string
8+ paneName ?: string
79 label : string
810 onclick : ( ) => void | Promise < void >
911}
@@ -64,6 +66,8 @@ const getMenuItems = async (outliner: any): Promise<MenuItem[]> => {
6466 const items = await outliner . getDashboardItems ( )
6567 return items . map ( ( element ) => {
6668 return {
69+ icon : element . icon ,
70+ paneName : element . tabName || element . paneName ,
6771 label : element . label ,
6872 onclick : ( ) => openDashboardPane ( outliner , element . tabName || element . paneName )
6973 }
@@ -78,7 +82,23 @@ const createMenuButton = (item: MenuItem) => {
7882 const button = document . createElement ( 'button' )
7983 button . className = 'menu-item'
8084 button . type = 'button'
81- button . textContent = item . label
85+ if ( item . paneName ) {
86+ button . dataset . paneName = item . paneName
87+ }
88+
89+ if ( item . icon ) {
90+ const icon = document . createElement ( 'img' )
91+ icon . className = 'menu-item-icon'
92+ icon . src = item . icon
93+ icon . alt = ''
94+ icon . setAttribute ( 'aria-hidden' , 'true' )
95+ button . appendChild ( icon )
96+ }
97+
98+ const label = document . createElement ( 'span' )
99+ label . className = 'menu-item-label'
100+ label . textContent = item . label
101+ button . appendChild ( label )
82102
83103 if ( item . id ) {
84104 button . id = item . id
@@ -91,21 +111,38 @@ const createMenuButton = (item: MenuItem) => {
91111 return button
92112}
93113
94- const renderMenuItems = async ( outliner : OutlineManager , container : HTMLElement ) => {
95- const me = authn . currentUser ( )
96- const menuItems = me ? await getMenuItems ( outliner ) : [ ]
97-
98- if ( me ) {
99- menuItems . push ( {
100- id : 'MenuLogoutItem' ,
101- label : 'Logout' ,
102- onclick : async ( ) => {
103- await authSession . logout ( )
104- }
105- } )
114+ const setActiveMenuItem = ( container : HTMLElement , paneName ?: string ) => {
115+ const menuItems = Array . from ( container . querySelectorAll < HTMLButtonElement > ( '.menu-item' ) )
116+ let activeItem : HTMLButtonElement | undefined
117+
118+ menuItems . forEach ( ( item ) => {
119+ const isActive = Boolean ( paneName ) && item . dataset . paneName === paneName
120+ item . classList . toggle ( 'menu-item-active' , isActive )
121+ if ( isActive ) {
122+ item . setAttribute ( 'aria-current' , 'page' )
123+ activeItem = item
124+ } else {
125+ item . removeAttribute ( 'aria-current' )
126+ }
127+ } )
128+
129+ if ( ! activeItem && menuItems [ 0 ] ) {
130+ menuItems [ 0 ] . classList . add ( 'menu-item-active' )
131+ menuItems [ 0 ] . setAttribute ( 'aria-current' , 'page' )
132+ container . dataset . activePaneName = menuItems [ 0 ] . dataset . paneName || ''
133+ return
134+ }
135+
136+ if ( paneName ) {
137+ container . dataset . activePaneName = paneName
106138 }
139+ }
140+
141+ const renderMenuItems = async ( outliner : OutlineManager , container : HTMLElement ) => {
142+ const menuItems = await getMenuItems ( outliner )
107143
108144 container . replaceChildren ( ...menuItems . map ( createMenuButton ) )
145+ setActiveMenuItem ( container , container . dataset . activePaneName )
109146}
110147
111148const applyMobileMenuStyles = ( navMenu : HTMLElement , isOpen : boolean ) => {
@@ -223,6 +260,9 @@ export const createLeftSideMenu = async (outliner: OutlineManager) => {
223260
224261 navMenuContent . addEventListener ( 'click' , ( event ) => {
225262 const item = ( event . target as HTMLElement ) . closest ( '.menu-item' )
263+ if ( item instanceof HTMLButtonElement ) {
264+ setActiveMenuItem ( navMenuContent , item . dataset . paneName )
265+ }
226266 const isMobile = outliner . context ?. environment ?. layout === 'mobile'
227267 if ( item && isMobile ) {
228268 closeMobileMenu ( )
@@ -234,7 +274,6 @@ export const createLeftSideMenu = async (outliner: OutlineManager) => {
234274}
235275
236276async function openDashboardPane ( outliner : any , pane : string ) : Promise < void > {
237- console . log ( '-----Opening profile pane' )
238277 outliner . showDashboard ( {
239278 pane
240279 } )
0 commit comments