From 19a02b435f0c197060264efdf435d783c7f10400 Mon Sep 17 00:00:00 2001 From: Ulle9 Date: Mon, 31 Jul 2023 21:45:27 +0300 Subject: [PATCH] Update profile function --- .../frontend/src/hooks/useUserProfile.ts | 18 +++++-- .../src/pages/UserProfilePage/UserProfile.tsx | 54 +++++++++++++++---- rsconcept/frontend/src/utils/backendAPI.ts | 10 +++- rsconcept/frontend/src/utils/models.ts | 1 + 4 files changed, 70 insertions(+), 13 deletions(-) diff --git a/rsconcept/frontend/src/hooks/useUserProfile.ts b/rsconcept/frontend/src/hooks/useUserProfile.ts index 4f06d224..cbd6759c 100644 --- a/rsconcept/frontend/src/hooks/useUserProfile.ts +++ b/rsconcept/frontend/src/hooks/useUserProfile.ts @@ -1,8 +1,8 @@ import { useCallback, useEffect, useState } from 'react' import { type ErrorInfo } from '../components/BackendError' -import { getProfile } from '../utils/backendAPI' -import { type IUserProfile } from '../utils/models' +import { DataCallback, getProfile, patchProfile } from '../utils/backendAPI' +import { type IUserProfile,IUserUpdateData } from '../utils/models' export function useUserProfile() { const [user, setUser] = useState(undefined); @@ -21,10 +21,22 @@ export function useUserProfile() { }); }, [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(() => { fetchUser(); }, [fetchUser]) - return { user, fetchUser, error, loading }; + return { user, fetchUser, updateUser, error, loading }; } diff --git a/rsconcept/frontend/src/pages/UserProfilePage/UserProfile.tsx b/rsconcept/frontend/src/pages/UserProfilePage/UserProfile.tsx index 92861952..62896e49 100644 --- a/rsconcept/frontend/src/pages/UserProfilePage/UserProfile.tsx +++ b/rsconcept/frontend/src/pages/UserProfilePage/UserProfile.tsx @@ -1,15 +1,51 @@ +import { useLayoutEffect, useState } from 'react'; +import { toast } from 'react-toastify'; + +import TextInput from '../../components/Common/TextInput'; import { useUserProfile } from '../../hooks/useUserProfile'; +import { IUserUpdateData } from '../../utils/models'; + export function UserProfile() { - const { user } = useUserProfile(); - console.log(user) + const { updateUser, user} = useUserProfile(); + + const [username, setUsername] = useState(''); + const [email, setEmail] = useState(''); + const [first_name, setFirstName] = useState(''); + const [last_name, setLastName] = useState(''); + + useLayoutEffect(() => { + if (user) { + setUsername(user.username); + setEmail(user.email); + setFirstName(user.first_name); + setLastName(user.last_name); + } + }, [user]); + + const handleSubmit = (event: React.FormEvent) => { + event.preventDefault(); + const data: IUserUpdateData = { + username: username, + email: email, + first_name: first_name, + last_name: last_name, + }; + updateUser(data, () => toast.success('Изменения сохранены')); + }; + + // console.log(user) return ( +
-

Логин: {user?.username ?? 'Логин'}

-

Имя: {user?.first_name ?? 'Имя'}

-

Фамилия: {user?.last_name ?? 'Фамилия'}

-

Электронная почта: {user?.email ?? ''}

- + { setUsername(event.target.value); }}/> + { setFirstName(event.target.value); }}/> + { setLastName(event.target.value); }}/> + { setEmail(event.target.value); }}/> +
+ +
+
- ); -} +
+ )} \ No newline at end of file diff --git a/rsconcept/frontend/src/utils/backendAPI.ts b/rsconcept/frontend/src/utils/backendAPI.ts index 24242aad..7dfaa107 100644 --- a/rsconcept/frontend/src/utils/backendAPI.ts +++ b/rsconcept/frontend/src/utils/backendAPI.ts @@ -12,7 +12,7 @@ import { IRSExpression, IRSFormCreateData, IRSFormData, IRSFormMeta, IRSFormUpdateData, IRSFormUploadData, IUserInfo, - IUserLoginData, IUserProfile, IUserSignupData} from './models' + IUserLoginData, IUserProfile, IUserSignupData, IUserUpdateData} from './models' // ================ Data transfer types ================ export type DataCallback = (data: ResponseData) => void; @@ -87,6 +87,14 @@ export function getProfile(request: FrontPull) { }); } +export function patchProfile(request: FrontExchange) { + AxiosPatch({ + title: 'Current user profile', + endpoint: `${config.url.AUTH}profile`, + request: request + }); +} + export function getActiveUsers(request: FrontPull) { AxiosGet({ title: 'Active users list', diff --git a/rsconcept/frontend/src/utils/models.ts b/rsconcept/frontend/src/utils/models.ts index dc248b8b..0af94210 100644 --- a/rsconcept/frontend/src/utils/models.ts +++ b/rsconcept/frontend/src/utils/models.ts @@ -22,6 +22,7 @@ export interface IUserSignupData extends Omit { password2: string } export interface IUserProfile extends Omit {} +export interface IUserUpdateData extends Omit {} export interface IUserInfo extends Omit {} // ======== RS Parsing ============