62 lines
2.1 KiB
JavaScript
62 lines
2.1 KiB
JavaScript
import * as React from "react";
|
|
import {createContext, useCallback, useEffect, useState} from "react";
|
|
import {logger} from "../lib/DefaultLogger";
|
|
import {userClient} from "../lib/clients/UserClient";
|
|
import {tokenUtil} from "../lib/clients/TokenUtil";
|
|
|
|
export const UserContext = createContext(undefined);
|
|
|
|
export function UserProvider({children}) {
|
|
const refresh = () => {
|
|
checkSession()
|
|
.catch((err) => logger.error(err))
|
|
}
|
|
const [state, setState] = useState({
|
|
user: {},
|
|
session: {},
|
|
error: "",
|
|
isLoading: true,
|
|
refresh: refresh
|
|
});
|
|
|
|
const checkSession = useCallback(async () => {
|
|
try {
|
|
setState((prev) => ({...prev, isLoading: true}));
|
|
if (!tokenUtil.checkToken(tokenUtil.getToken())) {
|
|
setState((prev) => ({...prev, error: '', isLoading: false, user: {}}));
|
|
return;
|
|
}
|
|
if (Object.keys(state.user).length === 0) {
|
|
const userMock = {
|
|
name: 'Sergey',
|
|
lastName: 'Kayashov'
|
|
}
|
|
setState((prev) => ({...prev, error: "", isLoading: false, user: userMock}))
|
|
return;
|
|
const {data, errorData} = await userClient.getMe();
|
|
if (errorData) {
|
|
setState((prev) => ({...prev, error: errorData, isLoading: false, user: {}}));
|
|
return;
|
|
}
|
|
setState((prev) => ({...prev, error: "", isLoading: false, user: data}));
|
|
}
|
|
} catch (err) {
|
|
logger.error(err);
|
|
setState((prev) => ({...prev, error: 'Что-то пошло не так', isLoading: false, user: {}}));
|
|
}
|
|
}, [state]);
|
|
|
|
useEffect(() => {
|
|
checkSession()
|
|
.catch((err) => {
|
|
logger.error(err);
|
|
});
|
|
// eslint-disable-next-line
|
|
}, []);
|
|
|
|
return <UserContext.Provider value={{...state}}>{children}</UserContext.Provider>;
|
|
}
|
|
|
|
export const UserConsumer = UserContext.Consumer;
|
|
|