This repository has been archived on 2025-11-04. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
know-it-all/client/src/contexts/UserProvider.tsx

63 lines
1.6 KiB
TypeScript

import Cookies from "js-cookie";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useNavigate } from "react-router-dom";
import UserContext from "./UserContext";
import createRequest from "../utils/requests";
import { User } from "../types";
interface UserProviderProps {
children: React.ReactNode;
}
export default function UserProvider({ children }: UserProviderProps) {
const [userData, setUserData] = useState<User>({
id: -1,
firstName: "",
lastName: "",
pronouns: "",
nickname: "",
username: "",
email: "",
age: 0,
});
const [loading, setLoading] = useState(true);
const navigate = useNavigate();
const contextValue = useMemo(
() => ({ loading, userData, setUserData }),
[loading, userData, setUserData]
);
const loadUserData = useCallback(async () => {
if (!loading) return;
if (!Cookies.get("token")) {
setLoading(() => false);
}
try {
const instance = createRequest();
const response = await instance.post("/auth/remember");
setUserData(() => response.data.user);
} catch (error) {
Cookies.remove("token");
navigate("/login");
} finally {
setLoading(() => false);
}
}, [navigate, loading]);
useEffect(() => {
loadUserData();
}, [loadUserData]);
return (
<UserContext.Provider value={contextValue}>
{children}
</UserContext.Provider>
);
}