import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
|
import { api } from "./api";
|
|
export type SystemSettings = {
|
system_name: string;
|
logo_url: string | null;
|
};
|
|
const DEFAULT: SystemSettings = {
|
system_name: "考试阅卷系统",
|
logo_url: null,
|
};
|
|
const SystemSettingsContext = createContext<{
|
settings: SystemSettings;
|
logoCacheKey: number;
|
refresh: () => Promise<void>;
|
}>({ settings: DEFAULT, logoCacheKey: 0, refresh: async () => {} });
|
|
export function SystemSettingsProvider({ children }: { children: React.ReactNode }) {
|
const [settings, setSettings] = useState<SystemSettings>(DEFAULT);
|
const [logoCacheKey, setLogoCacheKey] = useState(0);
|
|
const refresh = useCallback(async () => {
|
try {
|
const { data } = await api.get<SystemSettings>("/api/settings");
|
setSettings(data);
|
setLogoCacheKey((k) => k + 1);
|
document.title = data.system_name;
|
} catch {
|
setSettings(DEFAULT);
|
}
|
}, []);
|
|
useEffect(() => {
|
refresh();
|
}, [refresh]);
|
|
const value = useMemo(() => ({ settings, logoCacheKey, refresh }), [settings, logoCacheKey, refresh]);
|
|
return <SystemSettingsContext.Provider value={value}>{children}</SystemSettingsContext.Provider>;
|
}
|
|
export function useSystemSettings() {
|
return useContext(SystemSettingsContext);
|
}
|
|
export function logoSrc(logoUrl: string | null, cacheBust?: number) {
|
if (!logoUrl) return null;
|
const q = cacheBust ? `?t=${cacheBust}` : "";
|
return `${logoUrl}${q}`;
|
}
|