UserContext.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import React, { useState, FC, useContext } from "react";
  2. interface UserContextInterface {
  3. user?: User;
  4. isAuthenticated: boolean;
  5. login: (user: User) => void;
  6. logout: () => void;
  7. updateUser: (user: User) => void;
  8. }
  9. export const UserContext = React.createContext<UserContextInterface>({
  10. isAuthenticated: false,
  11. login: () => {},
  12. logout: () => {},
  13. updateUser: () => {},
  14. });
  15. const updateIfChanged = (user: User, newUser: Omit<User, "id">) =>
  16. (Object.keys(newUser) as Array<keyof Omit<User, "id">>).some(
  17. (key) => user[key] !== newUser[key]
  18. );
  19. const UserContextProvider: FC = ({ children }) => {
  20. const [user, setUser] = useState<User>();
  21. const [isAuthenticated, setIsAuthenticated] = useState(false);
  22. const login = (user: User) => {
  23. setIsAuthenticated(true);
  24. setUser(user);
  25. };
  26. const logout = () => {
  27. setIsAuthenticated(false);
  28. setUser(undefined);
  29. };
  30. const updateUser = ({ id, ...newData }: User) => {
  31. if (user && updateIfChanged(user, newData)) {
  32. setUser({
  33. ...newData,
  34. id: typeof id === "string" ? parseInt(id) : id,
  35. });
  36. }
  37. };
  38. return (
  39. <UserContext.Provider
  40. value={{ user, login, logout, updateUser, isAuthenticated }}
  41. >
  42. {children}
  43. </UserContext.Provider>
  44. );
  45. };
  46. export const useAuth = () => useContext(UserContext);
  47. export default UserContextProvider;