From 36d56dfe2053c4843469676d738240bddeee5d51 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 20 Apr 2025 15:45:34 +0330 Subject: [PATCH] sidebar + permission header --- src/langs/fa.json | 14 +- src/pages/profile/Profile.tsx | 372 ++++++++++++-------- src/pages/profile/components/Email.tsx | 127 +++++++ src/pages/profile/components/Phone.tsx | 143 ++++++++ src/pages/profile/components/Username.tsx | 132 +++++++ src/pages/profile/hooks/useProfileData.tsx | 40 +++ src/pages/profile/service/ProfileService.ts | 38 ++ src/pages/profile/types/ProfileTypes.ts | 28 ++ src/pages/wallet/Wallet.tsx | 77 ++-- src/pages/wallet/components/CardtoCard.tsx | 41 --- src/pages/wallet/components/Online.tsx | 111 ------ src/pages/wallet/components/Sheba.tsx | 41 --- src/pages/wallet/hooks/useWalletData.ts | 37 ++ src/pages/wallet/service/WalletService.ts | 27 ++ src/pages/wallet/types/WalletTypes.ts | 23 ++ src/shared/Header.tsx | 91 +++-- src/shared/SideBar.tsx | 34 +- 17 files changed, 975 insertions(+), 401 deletions(-) create mode 100644 src/pages/profile/components/Email.tsx create mode 100644 src/pages/profile/components/Phone.tsx create mode 100644 src/pages/profile/components/Username.tsx create mode 100644 src/pages/profile/hooks/useProfileData.tsx create mode 100644 src/pages/profile/service/ProfileService.ts create mode 100644 src/pages/profile/types/ProfileTypes.ts delete mode 100644 src/pages/wallet/components/CardtoCard.tsx delete mode 100644 src/pages/wallet/components/Online.tsx delete mode 100644 src/pages/wallet/components/Sheba.tsx create mode 100644 src/pages/wallet/hooks/useWalletData.ts create mode 100644 src/pages/wallet/service/WalletService.ts create mode 100644 src/pages/wallet/types/WalletTypes.ts diff --git a/src/langs/fa.json b/src/langs/fa.json index cc25f3c..6e16381 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -610,7 +610,9 @@ "image_profile": "تصویر حساب کاربری", "image_profile_desc": "تصویر خود را در حساب کاربری قرار دهید.", "upload_image": "آپلود تصویر", - "format_image": "فرمت های jpg, png,jpeg.حداکثر ۱مگابایت", + "formats": "فرمت های", + "max_size": "حداکثر ۱مگابایت", + "format_image": " jpg, png,jpeg.", "info_account": "اطلاعات حساب", "auth_after_change_info": "در صورت تغییر اطلاعات حساب باید مجددا احراز هویت انجام شود.", "username": "نام کاربری", @@ -623,7 +625,15 @@ "address_live": "آدرس محل سکونت خود را با دقت وارد کنید", "province": "استان", "city": "شهر", - "postal_code": "کد پستی" + "postal_code": "کد پستی", + "username_available": "نام کاربری موجود", + "username_not_available": "نام کاربری موجود نیست", + "username_save_success": "نام کاربری با موفقیت ذخیره شد", + "image_uploaded_successfully": "تصویر با موفقیت آپلود شد", + "confrim_email": "تایید ایمیل", + "confrim": "تایید صورتحساب ", + "link_email": "یک لینک برای تایید ایمیل برای شما ارسال شد.", + "email_not_verified": "ایمیل تایید نشده" }, "email": "ایمیل", "customer": { diff --git a/src/pages/profile/Profile.tsx b/src/pages/profile/Profile.tsx index fbf9f08..8c52adf 100644 --- a/src/pages/profile/Profile.tsx +++ b/src/pages/profile/Profile.tsx @@ -1,16 +1,104 @@ -import { FC } from 'react' +import { FC, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import AvatarImage from '../../assets/images/avatar_image.png' import Button from '../../components/Button' -import { DocumentUpload, Edit } from 'iconsax-react' +import { DocumentUpload } from 'iconsax-react' import Input from '../../components/Input' import DatePickerComponent from '../../components/DatePicker' -import Select from '../../components/Select' -import Textarea from '../../components/Textarea' +import { useGetProfile, useUpdateProfile } from './hooks/useProfileData' +import Username from './components/Username' +import { useDropzone } from 'react-dropzone' +import { toast } from 'react-toastify' +import { ErrorType } from '../../helpers/types' +import { UpdateProfileType } from './types/ProfileTypes' +import PageLoading from '../../components/PageLoading' +import { useFormik } from 'formik' +import * as Yup from 'yup' +import Email from './components/Email' +import Phone from './components/Phone' +import { useGetProvines } from '../customer/hooks/useCustomerData' +import { useSingleUpload } from '../service/hooks/useServiceData' const Profile: FC = () => { const { t } = useTranslation('global') + const [file, setFile] = useState() + const getProvines = useGetProvines() + const getProfile = useGetProfile() + const singleUpload = useSingleUpload() + const updateProfile = useUpdateProfile() + + const formik = useFormik({ + initialValues: { + cityId: '', + userAddress: '', + postalCode: '', + }, + validationSchema: Yup.object({ + cityId: Yup.string().required(t('errors.required')), + userAddress: Yup.string().required(t('errors.required')), + postalCode: Yup.string().required(t('errors.required')), + }), + onSubmit: (values) => { + updateProfile.mutate(values, { + onSuccess: () => { + toast.success(t('success')) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + } + }) + + useEffect(() => { + + if (getProfile.data) { + formik.setValues({ + cityId: getProfile.data.data.user.city?.id || '', + userAddress: getProfile.data.data.user.userAddress || '', + postalCode: getProfile.data.data.user.postalCode || '', + }) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [getProfile.data]) + + + const onDrop = useCallback((acceptedFiles: File[]) => { + + if (acceptedFiles.length > 0) { + const file = acceptedFiles[0]; + if (file.type.startsWith('image/')) { + setFile(file); + const formData = new FormData() + formData.append('file', file) + singleUpload.mutate(formData, { + onSuccess: (data) => { + const params: UpdateProfileType = { + profilePic: data.data?.url + } + updateProfile.mutate(params, { + onSuccess: () => { + toast.success(t('profile.image_uploaded_successfully')) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + } else { + toast.error(t('errors.is_not_image')) + } + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + const { getRootProps, getInputProps } = useDropzone({ onDrop }) return (
@@ -18,161 +106,159 @@ const Profile: FC = () => { {t('profile.account_user')}
-
-
-
-
- {t('profile.image_profile')} -
-
- {t('profile.image_profile_desc')} -
-
-
- -
- -

- {t('profile.format_image')} -

-
-
-
- -
-
-
- {t('profile.info_account')} -
-
- {t('profile.auth_after_change_info')} -
-
-
-
- -
- + { + getProfile.isPending || getProvines.isPending ? + + : +
+
+
- {t('edit')} + {t('profile.image_profile')} +
+
+ {t('profile.image_profile_desc')} +
+
+
+ +
+ +

+ {t('profile.formats')} +

{t('profile.format_image')}
+ {t('profile.max_size')} +

-
- -
- + +
+
- {t('edit')} + {t('profile.info_account')} +
+
+ {t('profile.auth_after_change_info')} +
+
+
+ + + +
+
+ +
+
+
+ {t('profile.personal_information')} +
+
+ {t('profile.enter_carefully_your_information')} +
+
+
+ { }} + placeholder='' + defaulValue={getProfile.data?.data?.user?.birthDate} + /> + +
+
-
- -
- + + {/*
+
- {t('edit')} + {t('profile.address')} +
+
+ {t('profile.address_live')}
-
-
-
+
+
+ ({ label: item.name, value: item.id })) : []} + placeholder={t('select')} + {...formik.getFieldProps('cityId')} + error_text={formik.touched.cityId && formik.errors.cityId ? formik.errors.cityId : ''} + /> +
-
-
-
- {t('profile.personal_information')} -
-
- {t('profile.enter_carefully_your_information')} -
-
-
- { }} - placeholder='' - defaulValue='1400-01-01' - /> +
+ +
+
+