From de7727d5bc4967408fa14f04bc9cd39f83f20b86 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 1 Oct 2025 09:24:22 +0330 Subject: [PATCH] setting shop --- src/config/Pages.ts | 3 + src/pages/setting/Shop.tsx | 165 ++++++++++++++++++++ src/pages/setting/hooks/useSettingData.ts | 17 ++ src/pages/setting/service/SettingService.ts | 12 ++ src/pages/setting/types/Types.ts | 40 +++++ src/router/Main.tsx | 2 + src/shared/SideBar.tsx | 2 +- 7 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 src/pages/setting/Shop.tsx diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 7845a21..61ce84c 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -65,6 +65,9 @@ export const Pages = { documents: "/pages/documents", incomeTariff: "/pages/income-tariff", }, + setting: { + shop: "/settings/shop", + }, wallet: "/wallet", profile: "/profile", customers: { diff --git a/src/pages/setting/Shop.tsx b/src/pages/setting/Shop.tsx new file mode 100644 index 0000000..6ef972d --- /dev/null +++ b/src/pages/setting/Shop.tsx @@ -0,0 +1,165 @@ +import { type FC, useState, useEffect } from 'react' +import { useFormik } from 'formik' +import * as Yup from 'yup' +import { useGetShop, useUpdateShop } from './hooks/useSettingData' +import { type UpdateShopType } from './types/Types' +import Button from '../../components/Button' +import Input from '../../components/Input' +import Textarea from '../../components/Textarea' +import UploadBox from '../../components/UploadBox' +import { TickCircle } from 'iconsax-react' +import { toast } from 'react-toastify' +import { extractErrorMessage } from '@/helpers/utils' + +// Validation schema برای UpdateShopType +const validationSchema = Yup.object().shape({ + shopName: Yup.string().required('نام شاپ الزامی است'), + shopDescription: Yup.string().required('توضیحات شاپ الزامی است'), + telephoneNumber: Yup.string().required('شماره تلفن الزامی است'), + shopPostalCode: Yup.string().required('کد پستی الزامی است'), + logo: Yup.string().required('لوگو الزامی است') +}) + +const Shop: FC = () => { + const { data: shopDetail, isLoading: shopDetailLoading, error: shopDetailError } = useGetShop() + const updateShopMutation = useUpdateShop() + + const [logoFile, setLogoFile] = useState([]) + + const formik = useFormik({ + initialValues: { + shopName: '', + shopDescription: '', + telephoneNumber: '', + shopPostalCode: '', + logo: '' + }, + validationSchema, + onSubmit: async (values) => { + const logoUrl = values.logo + + if (logoFile.length > 0) { + // TODO: اینجا باید API آپلود فایل اضافه شود + // const logoResponse = await uploadSingle.mutateAsync(logoFile[0]) + // logoUrl = logoResponse.results?.url?.url || values.logo + } + + const submitData = { + ...values, + logo: logoUrl + } + + updateShopMutation.mutate(submitData, { + onSuccess: () => { + toast.success('اطلاعات شاپ با موفقیت بروزرسانی شد') + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + } + }) + } + }) + + useEffect(() => { + if (shopDetail?.results?.shop) { + const shop = shopDetail.results.shop + + formik.setValues({ + shopName: shop.shopName || '', + shopDescription: shop.shopDescription || '', + telephoneNumber: shop.telephoneNumber || '', + shopPostalCode: shop.shopPostalCode || '', + logo: shop.logo || '' + }) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [shopDetail]) + + if (shopDetailLoading) { + return
در حال بارگذاری...
+ } + + if (shopDetailError) { + return
خطا در بارگذاری اطلاعات شاپ
+ } + + return ( +
+
+
+

ویرایش اطلاعات شاپ

+
+
+ +
+
+ +
+ {/* اطلاعات اصلی */} +
+

اطلاعات اصلی

+ +
+
+ + +
+ + + +