Files
shop-admin/src/pages/setting/Pricing.tsx
T
hamid zarghami ab5c7cc3c3 income price
2025-09-30 16:49:35 +03:30

127 lines
5.3 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 { type FC, useState } from 'react'
import { useGetPricing, useDeletePricing } from './hooks/useSettingData'
import { type PricingItem } from './types/Types'
import PageLoading from '../../components/PageLoading'
import Error from '../../components/Error'
import Td from '../../components/Td'
import Button from '../../components/Button'
import AddPricingModal from './components/AddPrcingModal'
import EditPricingModal from './components/EditPricingModal'
import TrashWithConfrim from '../../components/TrashWithConfrim'
import { Edit } from 'iconsax-react'
import { toast } from 'react-toastify'
const Pricing: FC = () => {
const { data, isLoading, error } = useGetPricing();
const deletePricingMutation = useDeletePricing();
const [isModalOpen, setIsModalOpen] = useState(false);
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
const [selectedPricingItem, setSelectedPricingItem] = useState<PricingItem | null>(null);
if (isLoading) {
return (
<div className="flex justify-center items-center min-h-[400px]">
<PageLoading />
</div>
);
}
if (error) {
return (
<div className="flex justify-center items-center min-h-[400px]">
<Error errorText="خطا در بارگذاری اطلاعات قیمت‌گذاری" />
</div>
);
}
const pricingItems = data?.results?.pricing || [];
const handleEditPricing = (pricingItem: PricingItem) => {
setSelectedPricingItem(pricingItem);
setIsEditModalOpen(true);
};
const handleDeletePricing = async (id: string) => {
try {
await deletePricingMutation.mutateAsync(id);
toast.success('قیمت‌گذاری با موفقیت حذف شد');
} catch (error) {
const message = (error as { response?: { data?: { message?: string } } })?.response?.data?.message || 'خطا در حذف قیمت‌گذاری';
toast.error(message);
}
};
return (
<div>
<div className="flex justify-between items-center mb-6">
<h1 className="">مدیریت قیمتگذاری</h1>
<Button
variant="primary"
className='w-fit'
onClick={() => setIsModalOpen(true)}
>
افزودن قیمتگذاری جدید
</Button>
</div>
<div className='relative overflow-x-auto rounded-3xl mt-5 w-full'>
<table className='w-full text-sm'>
<thead className='thead'>
<tr>
<Td text={'نوع'} />
<Td text={'قیمت'} />
<Td text={'تاریخ ایجاد'} />
<Td text={'تاریخ بروزرسانی'} />
<Td text={'عملیات'} />
</tr>
</thead>
<tbody>
{pricingItems.length === 0 ? (
<tr className='tr'>
<td colSpan={4} className="text-center py-8 text-gray-500">
هیچ آیتم قیمتگذاری یافت نشد
</td>
</tr>
) : (
pricingItems.map((item: PricingItem) => (
<tr key={item._id} className='tr'>
<Td text={item.type} />
<Td text={`${item.price.toLocaleString('fa-IR')} تومان`} />
<Td text={new Date(item.createdAt).toLocaleDateString('fa-IR')} />
<Td text={new Date(item.updatedAt).toLocaleDateString('fa-IR')} />
<Td text={''}>
<div className='flex items-center gap-2'>
<Edit
onClick={() => handleEditPricing(item)}
color='#8C90A3'
size={16}
className="cursor-pointer hover:text-blue-500"
/>
<TrashWithConfrim
onDelete={() => handleDeletePricing(item._id)}
isLoading={deletePricingMutation.isPending}
/>
</div>
</Td>
</tr>
))
)}
</tbody>
</table>
</div>
<AddPricingModal
isOpen={isModalOpen}
onClose={() => setIsModalOpen(false)}
/>
<EditPricingModal
isOpen={isEditModalOpen}
onClose={() => setIsEditModalOpen(false)}
pricingItem={selectedPricingItem}
/>
</div>
)
}
export default Pricing