You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

user-context.tsx 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { createContext, useContext, useState, FC, ReactNode } from 'react';
  2. import {
  3. getStorage,
  4. removeStorage,
  5. setStorage,
  6. } from '../utils/helpers/storage';
  7. import { UserData } from '../utils/interface/userInterface';
  8. interface Props {
  9. children: ReactNode;
  10. }
  11. interface IUserContext {
  12. userStorage: UserData;
  13. }
  14. interface IUserDispatch {
  15. addUser: (x: UserData) => void;
  16. clearUser: () => void;
  17. updateUserInfo: (x: UserData) => void;
  18. }
  19. const UserContext = createContext<IUserContext>({
  20. userStorage: {} as UserData,
  21. });
  22. const UserDispatchContext = createContext<IUserDispatch>({
  23. addUser: (userData: UserData) => {},
  24. clearUser: () => {},
  25. updateUserInfo: (newUserData: UserData) => {},
  26. });
  27. export const useUserData = () => {
  28. return useContext(UserContext);
  29. };
  30. export const useUserUpdate = () => {
  31. return useContext(UserDispatchContext);
  32. };
  33. const useUser = () => {
  34. const USER_KEY = 'user-data';
  35. const [userStorage, setUserStorage] = useState(getStorage(USER_KEY));
  36. const addUser = (userData: UserData) => {
  37. setStorage(USER_KEY, userData);
  38. setUserStorage(userData);
  39. };
  40. const updateUserInfo = (newUserData: UserData) => {
  41. setStorage(USER_KEY, newUserData);
  42. setUserStorage(newUserData);
  43. };
  44. const clearUser = () => {
  45. removeStorage(USER_KEY);
  46. setUserStorage(null);
  47. };
  48. return {
  49. userStorage,
  50. addUser,
  51. updateUserInfo,
  52. clearUser,
  53. };
  54. };
  55. const UserProvider: FC<Props> = ({ children }) => {
  56. const { userStorage, addUser, updateUserInfo, clearUser } = useUser();
  57. return (
  58. <UserContext.Provider value={{ userStorage }}>
  59. <UserDispatchContext.Provider
  60. value={{
  61. addUser,
  62. updateUserInfo,
  63. clearUser,
  64. }}
  65. >
  66. {children}
  67. </UserDispatchContext.Provider>
  68. </UserContext.Provider>
  69. );
  70. };
  71. export default UserProvider;