- Replace top header with left sidebar navigation - Sidebar shows module-aware nav items filtered by /api/modules - Collapsible: expanded shows icon+label, collapsed shows icon only - Toggle with Ctrl+J or collapse button, state persisted in localStorage - Keyboard navigable: Arrow Up/Down, Enter to navigate, Escape to collapse - Bottom section: density toggle, user info with role badge, logout - Add useModules hook for fetching module state - Add sidebar density variables to theme.css Closes #113, closes #114
18 lines
517 B
TypeScript
18 lines
517 B
TypeScript
import { useEffect, useState } from "react";
|
|
import { get } from "../api/client";
|
|
import type { ModuleInfo, ModulesResponse } from "../api/types";
|
|
|
|
export function useModules() {
|
|
const [modules, setModules] = useState<Record<string, ModuleInfo>>({});
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
get<ModulesResponse>("/api/modules")
|
|
.then((res) => setModules(res.modules))
|
|
.catch(() => {})
|
|
.finally(() => setLoading(false));
|
|
}, []);
|
|
|
|
return { modules, loading };
|
|
}
|