diff --git a/rsconcept/frontend/src/components/RequireAuth.tsx b/rsconcept/frontend/src/components/RequireAuth.tsx index 18c8b2a0..e20837be 100644 --- a/rsconcept/frontend/src/components/RequireAuth.tsx +++ b/rsconcept/frontend/src/components/RequireAuth.tsx @@ -7,7 +7,8 @@ interface RequireAuthProps { } function RequireAuth({ children }: RequireAuthProps) { - const { user } = useAuth() + const { user } = useAuth(); + return ( <> {user && children} diff --git a/rsconcept/frontend/src/context/UserProfileContext.tsx b/rsconcept/frontend/src/context/UserProfileContext.tsx new file mode 100644 index 00000000..d5e20254 --- /dev/null +++ b/rsconcept/frontend/src/context/UserProfileContext.tsx @@ -0,0 +1,77 @@ +import { createContext, useCallback, useContext, useEffect, useState } from 'react'; + +import { ErrorInfo } from '../components/BackendError'; +import { DataCallback, getProfile, patchProfile } from '../utils/backendAPI'; +import { IUserProfile, IUserUpdateData } from '../utils/models'; + +interface IUserProfileContextContext { + user: IUserProfile | undefined + loading: boolean + processing: boolean + error: ErrorInfo + setError: (error: ErrorInfo) => 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 [user, setUser] = useState(undefined); + const [loading, setLoading] = useState(false); + const [processing, setProcessing] = useState(false); + const [error, setError] = useState(undefined); + + const reload = useCallback( + () => { + setError(undefined); + setUser(undefined); + getProfile({ + showError: true, + setLoading: setLoading, + onError: error => { setError(error); }, + onSuccess: newData => { setUser(newData); } + }); + }, [setUser] + ); + + const updateUser = useCallback( + (data: IUserUpdateData, callback?: DataCallback) => { + setError(undefined); + patchProfile({ + data: data, + showError: true, + setLoading: setProcessing, + onError: error => { setError(error); }, + onSuccess: newData => { + setUser(newData); + if (callback) callback(newData); + } + }); + }, [setUser] + ); + + useEffect(() => { + reload(); + }, [reload]); + + return ( + + {children} + + ); +}; diff --git a/rsconcept/frontend/src/hooks/useUserProfile.ts b/rsconcept/frontend/src/hooks/useUserProfile.ts deleted file mode 100644 index 145c0976..00000000 --- a/rsconcept/frontend/src/hooks/useUserProfile.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useCallback, useEffect, useState } from 'react' - -import { type ErrorInfo } from '../components/BackendError' -import { DataCallback, getProfile, patchProfile } from '../utils/backendAPI' -import { type IUserProfile,IUserUpdateData } from '../utils/models' - -export function useUserProfile() { - const [user, setUser] = useState(undefined); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(undefined); - - const reload = useCallback( - () => { - setError(undefined); - setUser(undefined); - getProfile({ - showError: true, - setLoading: setLoading, - onError: error => { setError(error); }, - onSuccess: newData => { setUser(newData); } - }); - }, [setUser] - ) - const updateUser = useCallback( - (data: IUserUpdateData, callback?: DataCallback) => { - setError(undefined); - patchProfile({ - data: data, - showError: true, - setLoading: setLoading, - onError: error => { setError(error); }, - onSuccess: newData => { - setUser(newData); - if (callback) callback(newData); - } - }); - }, [setUser] - ); - - useEffect(() => { - reload(); - }, [reload]) - - return { user, updateUser, error, loading }; -} diff --git a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx index 253efa37..f19e7619 100644 --- a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx +++ b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx @@ -15,6 +15,7 @@ import { IRSFormCreateData, IRSFormMeta } from '../utils/models'; function CreateRSFormPage() { const navigate = useNavigate(); + const { createSchema, error, setError, loading } = useNewRSForm() const [title, setTitle] = useState(''); const [alias, setAlias] = useState(''); @@ -22,25 +23,24 @@ function CreateRSFormPage() { const [common, setCommon] = useState(false); const [file, setFile] = useState() - const handleFile = (event: React.ChangeEvent) => { + useEffect(() => { + setError(undefined); + }, [title, alias, setError]); + + function handleFile(event: React.ChangeEvent) { if (event.target.files && event.target.files.length > 0) { setFile(event.target.files[0]); } else { - setFile(undefined) + setFile(undefined); } } - const onSuccess = (newSchema: IRSFormMeta) => { + function onSuccess(newSchema: IRSFormMeta) { toast.success('Схема успешно создана'); navigate(`/rsforms/${newSchema.id}`); } - const { createSchema, error, setError, loading } = useNewRSForm() - - useEffect(() => { - setError(undefined) - }, [title, alias, setError]); - - const handleSubmit = (event: React.FormEvent) => { + + function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (loading) { return; @@ -54,43 +54,49 @@ function CreateRSFormPage() { fileName: file?.name }; createSchema(data, onSuccess); - }; + } return ( -
- { setTitle(event.target.value); }} - /> - { setAlias(event.target.value); }} - /> -