ConceptPortal-public/rsconcept/frontend/src/context/UserProfileContext.tsx

85 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-07-31 23:47:18 +03:00
import { createContext, useCallback, useContext, useEffect, useState } from 'react';
import { ErrorInfo } from '../components/BackendError';
2023-09-11 20:31:54 +03:00
import { IUserProfile } from '../models/library';
import { IUserUpdateData } from '../models/library';
2023-08-11 17:36:09 +03:00
import { DataCallback, getProfile, patchProfile } from '../utils/backendAPI';
2023-08-27 15:39:49 +03:00
import { useUsers } from './UsersContext';
2023-07-31 23:47:18 +03:00
2023-08-10 13:53:19 +03:00
interface IUserProfileContext {
2023-07-31 23:47:18 +03:00
user: IUserProfile | undefined
loading: boolean
processing: boolean
error: ErrorInfo
setError: (error: ErrorInfo) => void
updateUser: (data: IUserUpdateData, callback?: DataCallback<IUserProfile>) => void
}
2023-08-10 13:53:19 +03:00
const ProfileContext = createContext<IUserProfileContext | null>(null);
2023-07-31 23:47:18 +03:00
export const useUserProfile = () => {
const context = useContext(ProfileContext);
if (!context) {
throw new Error(
'useUserProfile has to be used within <UserProfileState.Provider>'
);
}
return context;
}
interface UserProfileStateProps {
children: React.ReactNode
}
export const UserProfileState = ({ children }: UserProfileStateProps) => {
2023-08-27 15:39:49 +03:00
const { users } = useUsers();
2023-07-31 23:47:18 +03:00
const [user, setUser] = useState<IUserProfile | undefined>(undefined);
const [loading, setLoading] = useState(false);
const [processing, setProcessing] = useState(false);
const [error, setError] = useState<ErrorInfo>(undefined);
const reload = useCallback(
2023-08-27 15:39:49 +03:00
() => {
setError(undefined);
setUser(undefined);
getProfile({
showError: true,
setLoading: setLoading,
onError: error => setError(error),
onSuccess: newData => setUser(newData)
});
}, [setUser]);
2023-07-31 23:47:18 +03:00
const updateUser = useCallback(
2023-08-27 15:39:49 +03:00
(data: IUserUpdateData, callback?: DataCallback<IUserProfile>) => {
setError(undefined);
patchProfile({
data: data,
showError: true,
setLoading: setProcessing,
onError: error => setError(error),
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;
2023-07-31 23:47:18 +03:00
}
2023-08-27 15:39:49 +03:00
if (callback) callback(newData);
}
});
}, [setUser, users, user?.id]);
2023-07-31 23:47:18 +03:00
useEffect(() => {
reload();
}, [reload]);
return (
<ProfileContext.Provider
2023-08-11 17:36:09 +03:00
value={{user, updateUser, error, loading, setError, processing}}
2023-07-31 23:47:18 +03:00
>
{children}
</ProfileContext.Provider>
);
};