"use client"; import { createContext, useReducer, useEffect, useState } from "react"; export * from "./useMainLayout"; const MainLayoutContext = createContext<{ isSidebarExpanded: boolean; dispatch: (action: { type: "updateState", payload: Partial }) => void; }>({ isSidebarExpanded: false, dispatch: () => {}, }); const initialState = { isSidebarExpanded: false, }; const reducer = (state: typeof initialState, action: { type: "updateState", payload: Partial }) => { switch (action.type) { case "updateState": return { ...state, ...action.payload, }; } return state; } export const MainLayoutProvider = ({ children }: { children: React.ReactNode }) => { const [state, dispatch] = useReducer(reducer, initialState); const [isHydrated, setIsHydrated] = useState(false); // 客户端 hydration 后从 localStorage 恢复状态 useEffect(() => { setIsHydrated(true); const saved = localStorage.getItem('sidebarExpanded'); if (saved !== null) { dispatch({ type: "updateState", payload: { isSidebarExpanded: JSON.parse(saved) } }); } }, []); // 当状态改变时保存到 localStorage useEffect(() => { if (isHydrated) { localStorage.setItem('sidebarExpanded', JSON.stringify(state.isSidebarExpanded)); } }, [state.isSidebarExpanded, isHydrated]); return ( {children} ); } export default MainLayoutContext;