Path: blob/master/cloud/ai-service-apps/nextjs-carbon-react-ui/src/contexts/app-context.js
6408 views
import { createContext, useState, useContext, useEffect, useCallback, useMemo } from "react";1import { getThemeCookie, updateThemeCookie } from "@/utils/theme-util";23export const AppContext = createContext();45export const useAppContext = () => {6return useContext(AppContext);7};89const AppProvider = ({ children }) => {10const [appContext, setAppContext] = useState({11isThemeLoaded: false,12userData: {},13});1415useEffect(() => {16async function fetchTheme() {17const theme = await getThemeCookie();18setAppContext((prevState) => ({ ...prevState, theme }));19}20async function fetchSettings() {21const settings = await _getSettings();22setAppContext((prevState) => ({ ...prevState, userData: settings }));23}2425fetchSettings();26fetchTheme();27setAppContext((prevState) => ({28...prevState,29isThemeLoaded: true,30}));31}, []);3233const updateTheme = useCallback((theme) => {34updateThemeCookie(theme);35setAppContext((prevState) => ({ ...prevState, theme }));36document.body.dataset.theme = theme;37}, []);3839const context = useMemo(40() => ({41...appContext,42updateTheme: (theme) => updateTheme(theme),43}),44[appContext, updateTheme]45);4647return <AppContext.Provider value={context}>{children}</AppContext.Provider>;48};4950async function _getSettings() {51const response = await fetch("/api/settings");52if (!response.ok) {53const { error } = await response.json();54console.error(`Error while fetching settings: ${error}`);55return {};56}57return await response.json();58}5960export { AppProvider };616263