admin shipment

This commit is contained in:
hamid zarghami
2025-10-27 11:53:20 +03:30
parent cf3e2b7d4b
commit 19a68f7188
6 changed files with 171 additions and 194 deletions
+138
View File
@@ -0,0 +1,138 @@
import { useState } from 'react';
import DefaulModal from '@/components/DefaulModal';
import Button from '@/components/Button';
import Select from '@/components/Select';
import { type Shipper, type ShipmentMethod } from '@/pages/shipment/types/Types';
import { useGetShipment, useGetAdminShop, useAddShipmentToAdmin, useRemoveShipmentFromAdmin } from '@/pages/shipment/hooks/useShipmentData';
import { toast } from 'react-toastify';
import { extractErrorMessage } from '@/helpers/utils';
interface ShipmentManagementModalProps {
isManagementModalOpen: boolean;
setIsManagementModalOpen: (open: boolean) => void;
}
export const ShipmentManagementModal = ({
isManagementModalOpen,
setIsManagementModalOpen,
}: ShipmentManagementModalProps) => {
const [selectedShipment, setSelectedShipment] = useState('');
const { data: shipmentData } = useGetShipment(1);
const { data: adminShopData, refetch: refetchAdminShop } = useGetAdminShop();
const addShipmentToAdminMutation = useAddShipmentToAdmin();
const removeShipmentFromAdminMutation = useRemoveShipmentFromAdmin();
const shipments = shipmentData?.results?.shipper || [];
const adminShipments: ShipmentMethod[] = adminShopData?.results?.data?.shipmentMethod || [];
// لیست روش‌های ارسال که هنوز به ادمین اضافه نشده‌اند
const availableShipments = shipments.filter((shipment: Shipper) =>
!adminShipments.some((adminShipment: ShipmentMethod) => adminShipment._id === shipment._id)
);
const handleAddShipmentToAdmin = async () => {
if (!selectedShipment) return;
await addShipmentToAdminMutation.mutateAsync(Number(selectedShipment), {
onError: (error) => {
toast.error(extractErrorMessage(error));
},
onSuccess: () => {
refetchAdminShop();
toast.success('روش ارسال با موفقیت اضافه شد');
}
});
};
const handleRemoveShipmentFromAdmin = async (shipmentId: string) => {
await removeShipmentFromAdminMutation.mutateAsync(Number(shipmentId), {
onError: (error) => {
toast.error(extractErrorMessage(error));
},
onSuccess: () => {
refetchAdminShop();
toast.success('روش ارسال با موفقیت حذف شد');
}
});
};
const getDeliveryTypeText = (type: string) => {
switch (type) {
case 'Standard':
return 'معمولی';
case 'SameDay':
return 'همان روز';
case 'Express':
return 'اکسپرس';
default:
return type;
}
};
return (
<DefaulModal
open={isManagementModalOpen}
close={() => setIsManagementModalOpen(false)}
title_header="مدیریت روش‌های ارسال ادمین"
isHeader={true}
width={800}
>
<div className="space-y-6 w-[400px] mt-5">
{/* بخش اضافه کردن روش ارسال جدید */}
<div className="border-b pb-4">
<h3 className="mb-3">اضافه کردن روش ارسال جدید</h3>
<div className="flex gap-3">
<Select
className="flex-1"
placeholder="انتخاب روش ارسال"
value={selectedShipment}
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => setSelectedShipment(e.target.value)}
items={availableShipments.map((shipment: Shipper) => ({
value: shipment._id.toString(),
label: shipment.name
}))}
/>
<Button
label="اضافه کردن"
onClick={handleAddShipmentToAdmin}
isLoading={addShipmentToAdminMutation.isPending}
disabled={!selectedShipment}
className="w-fit whitespace-nowrap"
/>
</div>
</div>
{/* بخش روش‌های ارسال فعال ادمین */}
<div>
<h3 className="mb-3">روشهای ارسال فعال ادمین</h3>
{adminShipments.length === 0 ? (
<p className="text-gray-500 text-center py-8">هیچ روش ارسالی فعالی وجود ندارد</p>
) : (
<div className="space-y-3">
{adminShipments.map((shipment: ShipmentMethod) => (
<div key={shipment._id} className="flex items-center justify-between p-4 bg-gray-50 rounded-xl">
<div>
<h4 className="font-medium">{shipment.name}</h4>
<p className="text-sm text-gray-600">{shipment.description}</p>
<p className="text-xs text-gray-500 mt-1">
نوع ارسال: {getDeliveryTypeText(shipment.deliveryType)} |
زمان ارسال: {shipment.deliveryTime} روز
</p>
</div>
<Button
variant="danger"
size="sm"
label="حذف"
onClick={() => handleRemoveShipmentFromAdmin(shipment._id.toString())}
isLoading={removeShipmentFromAdminMutation.isPending}
className="w-fit"
/>
</div>
))}
</div>
)}
</div>
</div>
</DefaulModal>
);
};