From 54f05c15a4db1537e20e6db5c94df1f78c70af0b Mon Sep 17 00:00:00 2001 From: yml2213 Date: Tue, 4 Aug 2026 11:27:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E5=88=86=E7=BB=84=E5=B1=95=E5=BC=80=E6=8A=98=E5=8F=A0=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=8C=81=E4=B9=85=E5=8C=96=E8=AE=B0=E5=BF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/layouts/MainLayout.tsx | 48 ++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/frontend/src/layouts/MainLayout.tsx b/frontend/src/layouts/MainLayout.tsx index 2cc7268..15aa99a 100644 --- a/frontend/src/layouts/MainLayout.tsx +++ b/frontend/src/layouts/MainLayout.tsx @@ -170,8 +170,29 @@ function getInitialOpenKeys(sections: SidebarSection[], selectedKey: string) { .map((section) => section.key) } +const SIDEBAR_OPEN_KEYS_KEY = 'sidebar_open_keys' +const SIDEBAR_COLLAPSED_KEY = 'sidebar_collapsed' + +function loadStoredOpenKeys(sections: SidebarSection[], selectedKey: string): string[] { + const initial = getInitialOpenKeys(sections, selectedKey) + try { + const raw = localStorage.getItem(SIDEBAR_OPEN_KEYS_KEY) + if (raw) { + const parsed = JSON.parse(raw) + if (Array.isArray(parsed)) { + return Array.from(new Set([...parsed, ...initial])) + } + } + } catch (e) { + // ignore + } + return initial +} + export default function MainLayout() { - const [collapsed, setCollapsed] = useState(false) + const [collapsed, setCollapsed] = useState(() => { + return localStorage.getItem(SIDEBAR_COLLAPSED_KEY) === 'true' + }) const { user, logout, isAdmin } = useAuth() const navigate = useNavigate() const location = useLocation() @@ -179,11 +200,15 @@ export default function MainLayout() { const sections = useMemo(() => (isAdmin ? adminSections : merchantSections), [isAdmin]) const selectedKey = getSelectedKey(location.pathname, location.search) - const [openKeys, setOpenKeys] = useState(() => getInitialOpenKeys(sections, selectedKey)) + const [openKeys, setOpenKeys] = useState(() => loadStoredOpenKeys(sections, selectedKey)) useEffect(() => { const nextOpenKeys = getInitialOpenKeys(sections, selectedKey) - setOpenKeys((current) => Array.from(new Set([...current, ...nextOpenKeys]))) + setOpenKeys((current) => { + const merged = Array.from(new Set([...current, ...nextOpenKeys])) + localStorage.setItem(SIDEBAR_OPEN_KEYS_KEY, JSON.stringify(merged)) + return merged + }) }, [sections, selectedKey]) const toggleSection = (section: SidebarSection) => { @@ -197,11 +222,18 @@ export default function MainLayout() { if (firstEnabledChild?.path) navigate(firstEnabledChild.path) return } - setOpenKeys((current) => - current.includes(section.key) + setOpenKeys((current) => { + const next = current.includes(section.key) ? current.filter((key) => key !== section.key) - : [...current, section.key], - ) + : [...current, section.key] + localStorage.setItem(SIDEBAR_OPEN_KEYS_KEY, JSON.stringify(next)) + return next + }) + } + + const handleToggleCollapse = (next: boolean) => { + setCollapsed(next) + localStorage.setItem(SIDEBAR_COLLAPSED_KEY, String(next)) } const handleChildClick = (child: SidebarChild) => { @@ -300,7 +332,7 @@ export default function MainLayout() {