ticket section

This commit is contained in:
hamid zarghami
2026-02-23 15:15:34 +03:30
parent 4ba62b39f9
commit 1c8e5aa849
8 changed files with 33 additions and 28 deletions
+2 -2
View File
@@ -2,10 +2,10 @@ import * as api from "../service/AdminService";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import type { CreateAdminType } from "../types/Types"; import type { CreateAdminType } from "../types/Types";
export const useGetAdmins = (page: number) => { export const useGetAdmins = (page: number = 1, limit: number = 10) => {
return useQuery({ return useQuery({
queryKey: ["admins", page], queryKey: ["admins", page],
queryFn: () => api.getAdmins(page), queryFn: () => api.getAdmins(page, limit),
}); });
}; };
+2 -2
View File
@@ -6,9 +6,9 @@ import type {
AdminDetailResponseType, AdminDetailResponseType,
} from "../types/Types"; } from "../types/Types";
export const getAdmins = async (page: number) => { export const getAdmins = async (page: number, limit: number = 10) => {
const { data } = await axios.get<AdminsType>("/admin/admins", { const { data } = await axios.get<AdminsType>("/admin/admins", {
params: { page }, params: { page, limit },
}); });
return data; return data;
}; };
+19
View File
@@ -15,6 +15,7 @@ import { useNavigate, useSearchParams } from 'react-router-dom'
import { toast } from 'react-toastify' import { toast } from 'react-toastify'
import { Paths } from '@/config/Paths' import { Paths } from '@/config/Paths'
import { extractErrorMessage } from '@/config/func' import { extractErrorMessage } from '@/config/func'
import { useGetAdmins } from '../admin/hooks/useAdminData'
const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType => ({ const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType => ({
invoiceItemId: invoiceItemId ?? '', invoiceItemId: invoiceItemId ?? '',
@@ -25,6 +26,7 @@ const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType
title: '', title: '',
description: '', description: '',
attachments: [], attachments: [],
designerId: ''
}) })
const getValidationSchema = (invoiceItemId: string | null) => const getValidationSchema = (invoiceItemId: string | null) =>
@@ -36,6 +38,7 @@ const getValidationSchema = (invoiceItemId: string | null) =>
estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'), estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'),
title: Yup.string().required('عنوان اجباری است.'), title: Yup.string().required('عنوان اجباری است.'),
description: Yup.string(), description: Yup.string(),
designerId: Yup.string().required('این فیلد اجباری است')
}) })
const ConvertToOrders: FC = () => { const ConvertToOrders: FC = () => {
@@ -48,6 +51,7 @@ const ConvertToOrders: FC = () => {
const { data: categories } = useGetCategory() const { data: categories } = useGetCategory()
const { data: users } = useGetUsers() const { data: users } = useGetUsers()
const { data: products } = useGetProducts() const { data: products } = useGetProducts()
const { data: admins } = useGetAdmins(1, 50)
const { mutate: converToOrder, isPending } = useConverToOrder() const { mutate: converToOrder, isPending } = useConverToOrder()
@@ -133,6 +137,21 @@ const ConvertToOrders: FC = () => {
<div className="rowTwoInput"> <div className="rowTwoInput">
<Select
items={admins?.data?.map((item) => {
return {
label: item.firstName + ' ' + item.lastName,
value: item.id
}
}) || []}
label="طراح"
placeholder="انتخاب طراح"
{...formik.getFieldProps('designerId')}
error_text={
formik.touched.designerId && formik.errors.designerId ? formik.errors.designerId : ''
}
/>
<Select <Select
items={ items={
categories?.data?.map((item) => ({ categories?.data?.map((item) => ({
+3 -18
View File
@@ -7,24 +7,21 @@ import { useVoiceRecorder } from '@/hooks/useVoiceRecorder'
import { Play, Pause } from 'iconsax-react' import { Play, Pause } from 'iconsax-react'
import { useMultiUpload, useSingleUpload } from '@/pages/uploader/hooks/useUploader' import { useMultiUpload, useSingleUpload } from '@/pages/uploader/hooks/useUploader'
import type { AddTicketType } from '../types/Types' import type { AddTicketType } from '../types/Types'
import { useAddTicket, useGetOrderDetails, useGetTickets } from '../hooks/useOrderData' import { useAddTicket, useGetTickets } from '../hooks/useOrderData'
import { useParams } from 'react-router-dom' import { useParams } from 'react-router-dom'
import { toast } from '@/shared/toast' import { toast } from '@/shared/toast'
import { extractErrorMessage, getFileNameAndExtensionFromUrl } from '@/config/func' import { extractErrorMessage, getFileNameAndExtensionFromUrl } from '@/config/func'
import VoicePlayer from '@/components/VoicePlayer' import VoicePlayer from '@/components/VoicePlayer'
import Select from '@/components/Select'
const TicketSection: FC = () => { const TicketSection: FC = () => {
const { id } = useParams() const { id } = useParams()
const [itemId, setItemId] = useState<string>('')
const { data: order } = useGetOrderDetails(id!)
const [message, setMessage] = useState('') const [message, setMessage] = useState('')
const [files, setFiles] = useState<File[]>([]) const [files, setFiles] = useState<File[]>([])
const addTicket = useAddTicket() const addTicket = useAddTicket()
const { data, refetch } = useGetTickets(itemId) const { data, refetch } = useGetTickets(id!)
const singleUpload = useSingleUpload() const singleUpload = useSingleUpload()
const multiUpload = useMultiUpload() const multiUpload = useMultiUpload()
@@ -69,7 +66,7 @@ const TicketSection: FC = () => {
}) })
} }
addTicket.mutate({ orderId: itemId, params: params }, { addTicket.mutate({ orderId: id!, params: params }, {
onSuccess: () => { onSuccess: () => {
toast('پیام شما با موفقیت ارسال شد') toast('پیام شما با موفقیت ارسال شد')
refetch() refetch()
@@ -99,18 +96,6 @@ const TicketSection: FC = () => {
placeholder="عباس حسینی" placeholder="عباس حسینی"
readOnly readOnly
/> />
<Select
items={order?.data?.items?.map((item) => {
return {
label: item.product?.title,
value: item.id + ''
}
}) || []}
onChange={(e) => setItemId(e.target.value)}
label='انتخاب محصول'
placeholder='انتخاب'
/>
</div> </div>
{ {
data?.data?.map((item) => { data?.data?.map((item) => {
+2 -5
View File
@@ -43,16 +43,13 @@ export const getOrderDetail = async (id: string) => {
export const getTickets = async (orderId: string) => { export const getTickets = async (orderId: string) => {
const { data } = await axios.get<TicketsResponseType>( const { data } = await axios.get<TicketsResponseType>(
`/admin/ticket/order/${orderId}`, `/admin/chat/ref/${orderId}`,
); );
return data; return data;
}; };
export const addTicket = async (ticketId: string, params: AddTicketType) => { export const addTicket = async (ticketId: string, params: AddTicketType) => {
const { data } = await axios.post( const { data } = await axios.post(`/admin/chat/ref/${ticketId}`, params);
`/admin/ticket/order/item/${ticketId}`,
params,
);
return data; return data;
}; };
+1
View File
@@ -206,6 +206,7 @@ export type ConvertToOrderItemType = {
title: string; title: string;
description?: string; description?: string;
attachments: string[]; attachments: string[];
designerId: string;
}; };
export type OrderPrintFieldType = { export type OrderPrintFieldType = {
+3
View File
@@ -5,6 +5,7 @@ import RequestItem from './components/RequestItem'
import { Paths } from '@/config/Paths' import { Paths } from '@/config/Paths'
import Button from '@/components/Button' import Button from '@/components/Button'
import { TickSquare } from 'iconsax-react' import { TickSquare } from 'iconsax-react'
import TicketSection from '../order/components/TicketSection'
const RequestDetail: FC = () => { const RequestDetail: FC = () => {
const { id } = useParams() const { id } = useParams()
@@ -38,6 +39,8 @@ const RequestDetail: FC = () => {
))} ))}
</div> </div>
</div> </div>
<TicketSection />
</div> </div>
) )
} }
+1 -1
View File
@@ -5,7 +5,7 @@ import { Route, Routes } from 'react-router-dom'
const AuthRouter: FC = () => { const AuthRouter: FC = () => {
return ( return (
<Routes> <Routes>
<Route path="/login" element={<Login />} /> <Route path="*" element={<Login />} />
</Routes> </Routes>
) )
} }