mohammed-ahad

Untitled

Sep 27th, 2023
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. import React, { createContext, useState, useContext, useEffect, useMemo } from 'react';
  2. import { UserI } from '../types';
  3. import { getUser, getAvatar } from "./getUser";
  4.  
  5. type AvatarI = Blob | null;
  6.  
  7. type UserContextProps = {
  8. userData: UserI | null;
  9. avatarData: AvatarI;
  10. loading: boolean;
  11. error: Error | null;
  12. setUserData: React.Dispatch<React.SetStateAction<UserI | null>>;
  13. };
  14.  
  15. type UserProviderProps = {
  16. children: React.ReactNode;
  17. };
  18.  
  19. const UserContext = createContext<UserContextProps | undefined>(undefined);
  20.  
  21. export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
  22. const [userData, setUserData] = useState<UserI | null>(null);
  23. const [avatarData, setAvatarData] = useState<AvatarI>(null);
  24. const [loading, setLoading] = useState<boolean>(true);
  25. const [error, setError] = useState<Error | null>(null);
  26.  
  27. useEffect(() => {
  28. const fetchUserDataAndAvatar = async () => {
  29. try {
  30. const data = await getUser();
  31. const avatar = await getAvatar();
  32. setUserData(data);
  33. setAvatarData(avatar);
  34. } catch (err) {
  35. if (err instanceof Error) {
  36. setError(err);
  37. } else {
  38. setError(new Error("An unexpected error occurred."));
  39. }
  40. } finally {
  41. setLoading(false);
  42. }
  43. };
  44.  
  45. fetchUserDataAndAvatar();
  46. }, []);
  47.  
  48. const contextValue = useMemo(() => ({
  49. userData,
  50. avatarData,
  51. loading,
  52. error,
  53. setUserData
  54. }), [userData, avatarData, loading, error]);
  55.  
  56. return (
  57. <UserContext.Provider value={contextValue}>
  58. {children}
  59. </UserContext.Provider>
  60. );
  61. };
  62.  
  63. export const useUser = (): UserContextProps => {
  64. const context = useContext(UserContext);
  65. if (!context) {
  66. throw new Error('useUser must be used within a UserProvider');
  67. }
  68. return context;
  69. };
  70.  
Advertisement
Add Comment
Please, Sign In to add comment