Files
negareh-admin/src/pages/order/ConvertToOrders.tsx
T
hamid zarghami d357a5000b Create order
2026-02-22 09:50:36 +03:30

177 lines
7.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState, type FC } from 'react'
import { useFormik } from 'formik'
import * as Yup from 'yup'
import Input from '@/components/Input'
import Select from '@/components/Select'
import UploadBox from '@/components/UploadBox'
import Button from '@/components/Button'
import { useMultiUpload } from '@/pages/uploader/hooks/useUploader'
import type { ConvertToOrderItemType } from './types/Types'
import { useConverToOrder, useGetProducts } from './hooks/useOrderData'
import { useGetCategory } from '@/pages/product/hooks/useProductData'
import { useGetUsers } from '@/pages/user/hooks/useUserData'
import { useSearchParams } from 'react-router-dom'
const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType => ({
invoiceItemId: invoiceItemId ?? '',
productId: '',
userId: '',
typeId: '',
estimatedDays: 0,
title: '',
attachments: [],
})
const getValidationSchema = (invoiceItemId: string | null) =>
Yup.object({
invoiceItemId: Yup.string(),
productId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب محصول اجباری است.'),
userId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب کاربر اجباری است.'),
typeId: Yup.string().required('انتخاب نوع اجباری است.'),
estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'),
title: Yup.string().required('عنوان اجباری است.'),
})
const ConvertToOrders: FC = () => {
const [searchParams] = useSearchParams()
const invoiceItemId = searchParams.get('invoiceItemId')
const multiUpload = useMultiUpload()
const [attachmentFiles, setAttachmentFiles] = useState<File[]>([])
const { data: categories } = useGetCategory()
const { data: users } = useGetUsers()
const { data: products } = useGetProducts()
const { mutate: converToOrder, isPending } = useConverToOrder()
const formik = useFormik<ConvertToOrderItemType>({
initialValues: getInitialValues(invoiceItemId),
validationSchema: getValidationSchema(invoiceItemId),
enableReinitialize: true,
onSubmit: async (values) => {
const attachments: string[] = [...values.attachments]
if (attachmentFiles.length > 0) {
const result = await multiUpload.mutateAsync(attachmentFiles)
result?.data?.forEach((item) => {
attachments.push(item.url)
})
}
const payload: ConvertToOrderItemType = {
...values,
invoiceItemId: invoiceItemId ?? values.invoiceItemId ?? '',
productId: invoiceItemId ? undefined : values.productId,
userId: invoiceItemId ? undefined : values.userId,
estimatedDays: Number(values.estimatedDays),
attachments,
}
await converToOrder(payload)
},
})
return (
<div className="mt-5">
<h1 className="text-lg font-light">تبدیل به سفارش</h1>
<div className="bg-white rounded-3xl p-6 mt-8">
<form
onSubmit={formik.handleSubmit}
className="space-y-6"
>
{!invoiceItemId && (
<div className="rowTwoInput">
<Select
items={
users?.data?.map((item) => ({
label: item.firstName ? `${item.firstName} ${item.lastName}` : item.phone,
value: item.id,
})) ?? []
}
label="کاربر"
placeholder="انتخاب کاربر"
{...formik.getFieldProps('userId')}
error_text={
formik.touched.userId && formik.errors.userId ? formik.errors.userId : ''
}
/>
<Select
items={
products?.data?.map((item) => ({
label: item.title,
value: String(item.id),
})) ?? []
}
label="محصول"
placeholder="انتخاب محصول"
{...formik.getFieldProps('productId')}
error_text={
formik.touched.productId && formik.errors.productId
? formik.errors.productId
: ''
}
/>
</div>
)}
<div className="rowTwoInput">
<Select
items={
categories?.data?.map((item) => ({
label: item.title,
value: String(item.id),
})) ?? []
}
label="نوع"
placeholder="انتخاب نوع"
{...formik.getFieldProps('typeId')}
error_text={
formik.touched.typeId && formik.errors.typeId ? formik.errors.typeId : ''
}
/>
</div>
<div className="rowTwoInput">
<Input
label="تخمین روز"
type="number"
{...formik.getFieldProps('estimatedDays')}
error_text={
formik.touched.estimatedDays && formik.errors.estimatedDays
? formik.errors.estimatedDays
: ''
}
/>
<Input
label="عنوان"
{...formik.getFieldProps('title')}
error_text={
formik.touched.title && formik.errors.title ? formik.errors.title : ''
}
/>
</div>
<div>
<UploadBox
label="پیوست‌ها"
isMultiple
onChange={setAttachmentFiles}
/>
</div>
<div className="flex justify-end">
<Button type="submit" isLoading={multiUpload.isPending || isPending}>
ثبت
</Button>
</div>
</form>
</div>
</div>
)
}
export default ConvertToOrders