diff --git a/package-lock.json b/package-lock.json index bf506af..643d755 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react-i18next": "^15.2.0", "react-infinite-scroll-component": "^6.1.0", "react-loading": "^2.0.3", + "react-loading-skeleton": "^3.5.0", "react-multi-date-picker": "^4.5.2", "react-otp-input": "^3.1.1", "react-router-dom": "^7.1.0", @@ -4420,6 +4421,15 @@ "react": ">=0.14.0" } }, + "node_modules/react-loading-skeleton": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", + "integrity": "sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/react-multi-date-picker": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/react-multi-date-picker/-/react-multi-date-picker-4.5.2.tgz", diff --git a/package.json b/package.json index c553ebd..51527d0 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "react-i18next": "^15.2.0", "react-infinite-scroll-component": "^6.1.0", "react-loading": "^2.0.3", + "react-loading-skeleton": "^3.5.0", "react-multi-date-picker": "^4.5.2", "react-otp-input": "^3.1.1", "react-router-dom": "^7.1.0", diff --git a/src/pages/profile/Profile.tsx b/src/pages/profile/Profile.tsx index 7e2fdb9..c1af689 100644 --- a/src/pages/profile/Profile.tsx +++ b/src/pages/profile/Profile.tsx @@ -1,4 +1,4 @@ -import { FC, useCallback, useState } 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' @@ -15,15 +15,61 @@ import { useSingleUpload } from '../ticket/hooks/useTicketData' import { ErrorType } from '../../helpers/types' import { UpdateProfileType } from './types/ProfileTypes' import PageLoading from '../../components/PageLoading' +import { useGetCities, useGetProvines } from '../financial/hooks/useFinancialData' +import { ProvinesItemType } from '../financial/types/FinancialTypes' +import { useFormik } from 'formik' +import * as Yup from 'yup' const Profile: FC = () => { const { t } = useTranslation('global') const singleUpload = useSingleUpload() const [file, setFile] = useState() + const [provinesId, setProvinesId] = useState('') + const getProvines = useGetProvines() + const getCities = useGetCities(provinesId) const getProfile = useGetProfile() 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 || '', + }) + if (getProfile.data.data.user.city) { + setProvinesId(getProfile.data.data.user.city.province?.id) + } + } + + }, [getProfile.data]) + + const onDrop = useCallback((acceptedFiles: File[]) => { if (acceptedFiles.length > 0) { @@ -65,7 +111,7 @@ const Profile: FC = () => { { - getProfile.isPending ? + getProfile.isPending || getProvines.isPending ? :
@@ -181,38 +227,47 @@ const Profile: FC = () => {
({ label: item.name, value: item.id })) : []} + placeholder={t('select')} + {...formik.getFieldProps('cityId')} + error_text={formik.touched.cityId && formik.errors.cityId ? formik.errors.cityId : ''} />