base detail order

This commit is contained in:
hamid zarghami
2026-01-28 09:24:26 +03:30
parent 6ad26fe032
commit a5ea0174ee
6 changed files with 81 additions and 35 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
VITE_TOKEN_NAME = 'negareh_t' VITE_TOKEN_NAME = 'negareh_t'
VITE_REFRESH_TOKEN_NAME = 'negareh_rt' VITE_REFRESH_TOKEN_NAME = 'negareh_rt'
VITE_API_BASE_URL = 'http://10.24.161.1:4000' VITE_API_BASE_URL = 'http://192.168.99.225:4000'
+13 -1
View File
@@ -3,10 +3,12 @@ import { useState, type FC } from 'react'
import { TabMyOrdersEnum } from './enum/OrderEnum' import { TabMyOrdersEnum } from './enum/OrderEnum'
import Filters from '@/components/Filters' import Filters from '@/components/Filters'
import Button from '@/components/Button' import Button from '@/components/Button'
import { AddSquare } from 'iconsax-react' import { AddSquare, Eye } from 'iconsax-react'
import Table from '@/components/Table' import Table from '@/components/Table'
import { useGetMyOrders } from './hooks/useOrderData' import { useGetMyOrders } from './hooks/useOrderData'
import moment from 'moment-jalaali' import moment from 'moment-jalaali'
import { Link } from 'react-router-dom'
import { Paths } from '@/config/Paths'
const MyOrders: FC = () => { const MyOrders: FC = () => {
const [page, setPage] = useState<number>(1) const [page, setPage] = useState<number>(1)
@@ -101,6 +103,16 @@ const MyOrders: FC = () => {
{ {
key: 'actions', key: 'actions',
title: '', title: '',
render: (item) => {
return (
<Link to={Paths.orderDetails + item.id}>
<Eye
size={20}
color='#000000'
/>
</Link>
)
}
} }
]} ]}
data={data?.data} data={data?.data}
+22 -6
View File
@@ -3,8 +3,13 @@ import { Microphone, Paperclip2, Receipt1 } from 'iconsax-react'
import Button from '@/components/Button' import Button from '@/components/Button'
import UploadBox from '@/components/UploadBox' import UploadBox from '@/components/UploadBox'
import Input from '@/components/Input' import Input from '@/components/Input'
import { useParams } from 'react-router-dom'
import { useGetOrderDetails } from './hooks/useOrderData'
const OrderDetail: FC = () => { const OrderDetail: FC = () => {
const { id } = useParams()
const { data } = useGetOrderDetails(id!)
const [message, setMessage] = useState('') const [message, setMessage] = useState('')
const [files, setFiles] = useState<File[]>([]) const [files, setFiles] = useState<File[]>([])
@@ -28,7 +33,7 @@ const OrderDetail: FC = () => {
<div className="text-sm text-[#8C90A3]"> <div className="text-sm text-[#8C90A3]">
سفارش #{orderData.orderId} سفارش #{data?.data?.orderNumber}
</div> </div>
</div> </div>
@@ -42,16 +47,22 @@ const OrderDetail: FC = () => {
<span>پیش فاکتور</span> <span>پیش فاکتور</span>
</a> </a>
</div> </div>
<div className='flex flex-col gap-10'>
{
data?.data?.items?.map((item) => {
return (
<div key={item.product.id}>
<div className="flex items-center gap-6"> <div className="flex items-center gap-6">
{/* Product Image */} {/* Product Image */}
<div className='size-[86px] rounded-lg bg-gray-200'> <div className='size-[86px] rounded-lg overflow-hidden'>
<img src={item.product?.images?.[0]} className='size-full' />
</div> </div>
{/* Order Details */} {/* Order Details */}
<div className="flex-1 flex gap-20 pr-10"> <div className="flex-1 flex gap-20 pr-10">
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
<div className="text-xs text-desc">عنوان:</div> <div className="text-xs text-desc">عنوان:</div>
<div className="text-sm font-medium text-black">{orderData.title}</div> <div className="text-sm font-medium text-black">{item.product.title}</div>
</div> </div>
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
<div className="text-xs text-desc">نام طرح:</div> <div className="text-xs text-desc">نام طرح:</div>
@@ -59,11 +70,11 @@ const OrderDetail: FC = () => {
</div> </div>
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
<div className="text-xs text-desc">تعداد:</div> <div className="text-xs text-desc">تعداد:</div>
<div className="text-sm font-medium text-black">{orderData.quantity}</div> <div className="text-sm font-medium text-black">{item.quantity}</div>
</div> </div>
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
<div className="text-xs text-desc">تخمین زمان:</div> <div className="text-xs text-desc">تخمین زمان:</div>
<div className="text-sm font-medium text-black">{orderData.estimatedDate}</div> <div className="text-sm font-medium text-black">{data?.data?.estimatedDays}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -72,10 +83,15 @@ const OrderDetail: FC = () => {
<div className="mt-6 pt-6 border-t border-dashed border-desc"> <div className="mt-6 pt-6 border-t border-dashed border-desc">
<div className="text-sm font-medium mb-2 text-desc">شرح سفارش:</div> <div className="text-sm font-medium mb-2 text-desc">شرح سفارش:</div>
<p className="text-sm font-light text-black leading-6"> <p className="text-sm font-light text-black leading-6">
{orderData.description} {item.description}
</p> </p>
</div> </div>
</div> </div>
)
})
}
</div>
</div>
{/* Bottom Section - White Card */} {/* Bottom Section - White Card */}
<div className="bg-white rounded-2xl p-6"> <div className="bg-white rounded-2xl p-6">
+9 -1
View File
@@ -17,7 +17,15 @@ export const useSubmitOrder = () => {
export const useGetMyOrders = (page: number = 1, statuses: TabMyOrdersEnum) => { export const useGetMyOrders = (page: number = 1, statuses: TabMyOrdersEnum) => {
return useQuery({ return useQuery({
queryKey: ["products", page, statuses], queryKey: ["my-orders", page, statuses],
queryFn: () => api.getMyOrders(page, statuses), queryFn: () => api.getMyOrders(page, statuses),
}); });
}; };
export const useGetOrderDetails = (id: string) => {
return useQuery({
queryKey: ["order", id],
queryFn: () => api.getOrderDetails(id),
enabled: !!id,
});
};
+9 -1
View File
@@ -1,6 +1,7 @@
import axios from "@/config/axios"; import axios from "@/config/axios";
import type { import type {
MyOrdersResponseType, MyOrdersResponseType,
OrderDetailResponseType,
OrderType, OrderType,
ProductsResponseType, ProductsResponseType,
} from "../type/Types"; } from "../type/Types";
@@ -12,7 +13,7 @@ export const getProducts = async () => {
}; };
export const submitOrder = async (params: OrderType[]) => { export const submitOrder = async (params: OrderType[]) => {
const { data } = await axios.post(`/public/order`, { items: params }); const { data } = await axios.post(`/public/orders`, { items: params });
return data; return data;
}; };
@@ -48,3 +49,10 @@ export const getMyOrders = async (
); );
return data; return data;
}; };
export const getOrderDetails = async (id: string) => {
const { data } = await axios.get<OrderDetailResponseType>(
`/public/orders/${id}`,
);
return data;
};
+2
View File
@@ -97,3 +97,5 @@ export interface MyOrderType extends RowDataType {
} }
export type MyOrdersResponseType = BaseResponse<MyOrderType[]>; export type MyOrdersResponseType = BaseResponse<MyOrderType[]>;
export type OrderDetailResponseType = BaseResponse<MyOrderType>;