/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import React, { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { API } from '../../helpers/api'; import { initialState, reducer } from './reducer'; import { mergeSelfResponseIntoLocalUser } from '../../helpers/data'; import { normalizeLanguage } from '../../i18n/language'; import AdminInitialSetupModal from '../../components/auth/AdminInitialSetupModal'; export const UserContext = React.createContext({ state: initialState, dispatch: () => null, }); export const UserProvider = ({ children }) => { const [state, dispatch] = React.useReducer(reducer, initialState); const { i18n } = useTranslation(); // 已登录时拉取服务端最新资料(含 role),避免仅依赖本地缓存:例如管理员将代理降级后首页仍显示「已是代理」、不显示申请入口 useEffect(() => { if (!localStorage.getItem('user')) return; let cancelled = false; (async () => { try { const res = await API.get('/api/user/self'); if (cancelled || !res.data.success || !res.data.data) return; mergeSelfResponseIntoLocalUser(res.data.data, dispatch); } catch (e) { // 未登录 / token 失效时忽略 } })(); return () => { cancelled = true; }; }, [dispatch]); // Sync language preference when user data is loaded useEffect(() => { if (state.user?.setting) { try { const settings = JSON.parse(state.user.setting); const normalizedLanguage = normalizeLanguage(settings.language); if (normalizedLanguage && normalizedLanguage !== i18n.language) { i18n.changeLanguage(normalizedLanguage); } if (normalizedLanguage) { localStorage.setItem('i18nextLng', normalizedLanguage); } } catch (e) { // Ignore parse errors } } }, [state.user?.setting, i18n]); return ( {children} ); };