setting shop
This commit is contained in:
@@ -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<File[]>([])
|
||||
|
||||
const formik = useFormik<UpdateShopType>({
|
||||
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 <div className="flex justify-center items-center h-64">در حال بارگذاری...</div>
|
||||
}
|
||||
|
||||
if (shopDetailError) {
|
||||
return <div className="text-red-500 text-center mt-8">خطا در بارگذاری اطلاعات شاپ</div>
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='mt-4'>
|
||||
<div className='flex justify-between items-center'>
|
||||
<div className='flex items-center gap-3'>
|
||||
<h1>ویرایش اطلاعات شاپ</h1>
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
className='px-6'
|
||||
onClick={() => formik.handleSubmit()}
|
||||
isLoading={updateShopMutation.isPending}
|
||||
disabled={!formik.isValid || updateShopMutation.isPending}
|
||||
>
|
||||
<div className='flex gap-2 items-center'>
|
||||
<TickCircle size={16} color='#fff' />
|
||||
<div>بروزرسانی شاپ</div>
|
||||
</div>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='flex gap-6 xl:mt-8 mt-6'>
|
||||
{/* اطلاعات اصلی */}
|
||||
<div className='flex-1 text-sm bg-white py-8 xl:px-10 px-6 rounded-3xl'>
|
||||
<h2 className='text-lg font-medium mb-6'>اطلاعات اصلی</h2>
|
||||
|
||||
<div className='space-y-6'>
|
||||
<div className='grid grid-cols-1 md:grid-cols-2 gap-6'>
|
||||
<Input
|
||||
label='نام شاپ'
|
||||
placeholder='مثال: فروشگاه آنلاین'
|
||||
{...formik.getFieldProps('shopName')}
|
||||
error_text={formik.touched.shopName && formik.errors.shopName ? formik.errors.shopName : ''}
|
||||
/>
|
||||
<Input
|
||||
label='شماره تلفن'
|
||||
placeholder='مثال: ۰۹۱۲۳۴۵۶۷۸۹'
|
||||
{...formik.getFieldProps('telephoneNumber')}
|
||||
error_text={formik.touched.telephoneNumber && formik.errors.telephoneNumber ? formik.errors.telephoneNumber : ''}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Input
|
||||
label='کد پستی'
|
||||
placeholder='مثال: ۱۲۳۴۵۶۷۸۹۰'
|
||||
{...formik.getFieldProps('shopPostalCode')}
|
||||
error_text={formik.touched.shopPostalCode && formik.errors.shopPostalCode ? formik.errors.shopPostalCode : ''}
|
||||
/>
|
||||
|
||||
<Textarea
|
||||
label='توضیحات شاپ'
|
||||
placeholder='توضیحات کامل شاپ را وارد کنید...'
|
||||
{...formik.getFieldProps('shopDescription')}
|
||||
error_text={formik.touched.shopDescription && formik.errors.shopDescription ? formik.errors.shopDescription : ''}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* فایلها */}
|
||||
<div className='w-80 space-y-6'>
|
||||
<div className='text-sm bg-white py-8 px-6 rounded-3xl'>
|
||||
<h2 className='text-lg font-medium mb-6'>فایلها</h2>
|
||||
|
||||
<div className='space-y-6'>
|
||||
<div>
|
||||
<UploadBox
|
||||
label='لوگو شاپ'
|
||||
isMultiple={false}
|
||||
onChange={(files) => setLogoFile(files)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Shop
|
||||
Reference in New Issue
Block a user