'use client'; import { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { DataCallback, getProfile, patchProfile } from '@/app/backendAPI'; import { ErrorData } from '@/components/info/InfoError'; import { IUserProfile, IUserUpdateData } from '@/models/user'; import { useUsers } from './UsersContext'; interface IUserProfileContext { user: IUserProfile | undefined; loading: boolean; processing: boolean; error: ErrorData; errorProcessing: ErrorData; setError: (error: ErrorData) => void; updateUser: (data: IUserUpdateData, callback?: DataCallback) => void; } const ProfileContext = createContext(null); export const useUserProfile = () => { const context = useContext(ProfileContext); if (!context) { throw new Error('useUserProfile has to be used within '); } return context; }; interface UserProfileStateProps { children: React.ReactNode; } export const UserProfileState = ({ children }: UserProfileStateProps) => { const { users } = useUsers(); const [user, setUser] = useState(undefined); const [loading, setLoading] = useState(false); const [processing, setProcessing] = useState(false); const [error, setError] = useState(undefined); const [errorProcessing, setErrorProcessing] = useState(undefined); const reload = useCallback(() => { setError(undefined); setUser(undefined); getProfile({ showError: true, setLoading: setLoading, onError: setError, onSuccess: newData => setUser(newData) }); }, [setUser]); const updateUser = useCallback( (data: IUserUpdateData, callback?: DataCallback) => { setErrorProcessing(undefined); patchProfile({ data: data, showError: true, setLoading: setProcessing, onError: setErrorProcessing, onSuccess: newData => { setUser(newData); const libraryUser = users.find(item => item.id === user?.id); if (libraryUser) { libraryUser.first_name = newData.first_name; libraryUser.last_name = newData.last_name; } if (callback) callback(newData); } }); }, [setUser, users, user?.id] ); useEffect(() => { reload(); }, [reload]); return ( {children} ); };