ticket section
This commit is contained in:
@@ -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),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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) => ({
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user