feat(frontend): add backend and error contexts
This commit is contained in:
parent
c65d0a5350
commit
8efa09397b
91
frontend/src/contexts/backend-context.js
Normal file
91
frontend/src/contexts/backend-context.js
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
import { createContext, useContext, } from 'react';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
|
import { useAlertContext } from './error-context';
|
||||||
|
|
||||||
|
export const BackendContext = createContext({ undefined });
|
||||||
|
|
||||||
|
export const BackendProvider = (props) => {
|
||||||
|
const { children } = props;
|
||||||
|
|
||||||
|
const { setAlert } = useAlertContext();
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
var myHeaders = new Headers();
|
||||||
|
myHeaders.append("Content-Type", "application/json");
|
||||||
|
myHeaders.append("Authorization", localStorage.getItem("token"));
|
||||||
|
|
||||||
|
const httpRequest = async (path, method, body, headers, encoding) => {
|
||||||
|
|
||||||
|
var requestOptions = {
|
||||||
|
method: method,
|
||||||
|
redirect: 'follow',
|
||||||
|
};
|
||||||
|
|
||||||
|
if (body) {
|
||||||
|
requestOptions.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("headers:", headers)
|
||||||
|
if (headers) {
|
||||||
|
requestOptions.headers = headers
|
||||||
|
}else {
|
||||||
|
requestOptions.headers = myHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch(`${process.env.NEXT_PUBLIC_REST_ENDPOINT || ""}${path}`, requestOptions)
|
||||||
|
console.log("status:", response.status)
|
||||||
|
if (response.status != 200) {
|
||||||
|
if (response.status == 401) {
|
||||||
|
router.push("/auth/login")
|
||||||
|
}
|
||||||
|
if (response.status == 204 || response.status == 201) {
|
||||||
|
return {status : response.status, result: null}
|
||||||
|
}
|
||||||
|
const data = await response.text()
|
||||||
|
// setAlert({
|
||||||
|
// severity: "error",
|
||||||
|
// title: "Error",
|
||||||
|
// message: `Status: ${response.status}, Content: ${data}`,
|
||||||
|
// })
|
||||||
|
setAlert({
|
||||||
|
severity: "error",
|
||||||
|
// title: "Error",
|
||||||
|
message: `${data}`,
|
||||||
|
})
|
||||||
|
return {status : response.status, result: null}
|
||||||
|
}
|
||||||
|
if (encoding) {
|
||||||
|
console.log("encoding:", encoding)
|
||||||
|
if (encoding == "text") {
|
||||||
|
const data = await response.text()
|
||||||
|
return {status: response.status, result: data}
|
||||||
|
}else if (encoding == "blob") {
|
||||||
|
const data = await response.blob()
|
||||||
|
return {status: response.status, result: data}
|
||||||
|
}else if (encoding == "json") {
|
||||||
|
const data = await response.json()
|
||||||
|
return {status: response.status, result: data}
|
||||||
|
}else{
|
||||||
|
return {status: response.status, result: response}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const data = await response.json()
|
||||||
|
return {status: response.status, result: data}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BackendContext.Provider
|
||||||
|
value={{
|
||||||
|
httpRequest,
|
||||||
|
setAlert,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</BackendContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const BackendConsumer = BackendContext.Consumer;
|
||||||
|
|
||||||
|
export const useBackendContext = () => useContext(BackendContext);
|
||||||
32
frontend/src/contexts/error-context.js
Normal file
32
frontend/src/contexts/error-context.js
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
import { createContext, useContext, useState } from 'react';
|
||||||
|
|
||||||
|
|
||||||
|
export const AlertContext = createContext({ undefined });
|
||||||
|
|
||||||
|
export const AlertProvider = (props) => {
|
||||||
|
const { children } = props;
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
severity: '', // options => error, warning, info, success
|
||||||
|
message: '',
|
||||||
|
title: '',
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// const [alert, setAlert] = useState(null);
|
||||||
|
const [alert, setAlert] = useState();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AlertContext.Provider
|
||||||
|
value={{
|
||||||
|
alert,
|
||||||
|
setAlert,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</AlertContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const AlertConsumer = AlertContext.Consumer;
|
||||||
|
|
||||||
|
export const useAlertContext = () => useContext(AlertContext);
|
||||||
|
|
@ -9,9 +9,10 @@ import { useNProgress } from 'src/hooks/use-nprogress';
|
||||||
import { createTheme } from 'src/theme';
|
import { createTheme } from 'src/theme';
|
||||||
import { createEmotionCache } from 'src/utils/create-emotion-cache';
|
import { createEmotionCache } from 'src/utils/create-emotion-cache';
|
||||||
import 'simplebar-react/dist/simplebar.min.css';
|
import 'simplebar-react/dist/simplebar.min.css';
|
||||||
import { WsProvider } from 'src/contexts/socketio-context';
|
|
||||||
import '../utils/map.css';
|
import '../utils/map.css';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { BackendProvider } from 'src/contexts/backend-context';
|
||||||
|
import { AlertProvider } from 'src/contexts/error-context';
|
||||||
|
|
||||||
const clientSideEmotionCache = createEmotionCache();
|
const clientSideEmotionCache = createEmotionCache();
|
||||||
|
|
||||||
|
|
@ -33,7 +34,7 @@ const App = (props) => {
|
||||||
<CacheProvider value={emotionCache}>
|
<CacheProvider value={emotionCache}>
|
||||||
<Head>
|
<Head>
|
||||||
<title>
|
<title>
|
||||||
Oktopus | TR-369 Controller
|
Oktopus | Controller
|
||||||
</title>
|
</title>
|
||||||
<meta
|
<meta
|
||||||
name="viewport"
|
name="viewport"
|
||||||
|
|
@ -42,6 +43,9 @@ const App = (props) => {
|
||||||
</Head>
|
</Head>
|
||||||
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
|
{/* <WsProvider> */}
|
||||||
|
<AlertProvider>
|
||||||
|
<BackendProvider>
|
||||||
<ThemeProvider theme={theme}>
|
<ThemeProvider theme={theme}>
|
||||||
<CssBaseline />
|
<CssBaseline />
|
||||||
<AuthConsumer>
|
<AuthConsumer>
|
||||||
|
|
@ -52,6 +56,9 @@ const App = (props) => {
|
||||||
}
|
}
|
||||||
</AuthConsumer>
|
</AuthConsumer>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
|
</BackendProvider>
|
||||||
|
</AlertProvider>
|
||||||
|
{/* </WsProvider> */}
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
</LocalizationProvider>
|
</LocalizationProvider>
|
||||||
</CacheProvider>
|
</CacheProvider>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user