Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ibm
GitHub Repository: ibm/watson-machine-learning-samples
Path: blob/master/cloud/ai-service-apps/nextjs-carbon-react-ui/src/contexts/app-context.js
6408 views
1
import { createContext, useState, useContext, useEffect, useCallback, useMemo } from "react";
2
import { getThemeCookie, updateThemeCookie } from "@/utils/theme-util";
3
4
export const AppContext = createContext();
5
6
export const useAppContext = () => {
7
return useContext(AppContext);
8
};
9
10
const AppProvider = ({ children }) => {
11
const [appContext, setAppContext] = useState({
12
isThemeLoaded: false,
13
userData: {},
14
});
15
16
useEffect(() => {
17
async function fetchTheme() {
18
const theme = await getThemeCookie();
19
setAppContext((prevState) => ({ ...prevState, theme }));
20
}
21
async function fetchSettings() {
22
const settings = await _getSettings();
23
setAppContext((prevState) => ({ ...prevState, userData: settings }));
24
}
25
26
fetchSettings();
27
fetchTheme();
28
setAppContext((prevState) => ({
29
...prevState,
30
isThemeLoaded: true,
31
}));
32
}, []);
33
34
const updateTheme = useCallback((theme) => {
35
updateThemeCookie(theme);
36
setAppContext((prevState) => ({ ...prevState, theme }));
37
document.body.dataset.theme = theme;
38
}, []);
39
40
const context = useMemo(
41
() => ({
42
...appContext,
43
updateTheme: (theme) => updateTheme(theme),
44
}),
45
[appContext, updateTheme]
46
);
47
48
return <AppContext.Provider value={context}>{children}</AppContext.Provider>;
49
};
50
51
async function _getSettings() {
52
const response = await fetch("/api/settings");
53
if (!response.ok) {
54
const { error } = await response.json();
55
console.error(`Error while fetching settings: ${error}`);
56
return {};
57
}
58
return await response.json();
59
}
60
61
export { AppProvider };
62
63