2026-03-24 19:36:40 +09:00
|
|
|
import { useQuery } from "@tanstack/react-query";
|
2026-03-24 14:03:49 +09:00
|
|
|
import dayjs from "dayjs";
|
|
|
|
|
import StatusBadge from "./StatusBadge";
|
2026-03-24 19:36:40 +09:00
|
|
|
import { fetchCarriers } from "@/api/parcels";
|
2026-03-24 14:03:49 +09:00
|
|
|
|
2026-03-24 19:36:40 +09:00
|
|
|
function ParcelCard({ parcel, onClick }) {
|
|
|
|
|
const { data: carriers = [] } = useQuery({
|
|
|
|
|
queryKey: ["carriers"],
|
|
|
|
|
queryFn: fetchCarriers,
|
|
|
|
|
staleTime: 1000 * 60 * 60,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const carrier = carriers.find((c) => c.id === parcel.carrier_id);
|
2026-03-24 14:03:49 +09:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div
|
2026-03-24 19:36:40 +09:00
|
|
|
onClick={onClick}
|
2026-03-24 14:03:49 +09:00
|
|
|
className="bg-white rounded-xl shadow-sm cursor-pointer hover:shadow-md transition-shadow flex items-center gap-3 lg:gap-4 p-3.5 lg:p-4"
|
|
|
|
|
>
|
2026-03-24 19:36:40 +09:00
|
|
|
<CarrierLogo carrier={carrier} />
|
2026-03-24 14:03:49 +09:00
|
|
|
|
|
|
|
|
<div className="flex-1 min-w-0 space-y-1.5 lg:space-y-2">
|
|
|
|
|
<div className="flex items-center gap-1.5 text-xs lg:text-sm text-gray-400">
|
2026-03-24 19:36:40 +09:00
|
|
|
<span>{parcel.carrier_name}</span>
|
2026-03-24 14:03:49 +09:00
|
|
|
<span>|</span>
|
|
|
|
|
<span className="tracking-letter-spacing">
|
2026-03-24 19:36:40 +09:00
|
|
|
{parcel.tracking_number}
|
2026-03-24 14:03:49 +09:00
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<p className="font-semibold text-sm lg:text-base text-gray-900 truncate">
|
2026-03-24 19:36:40 +09:00
|
|
|
{parcel.label || parcel.tracking_number}
|
2026-03-24 14:03:49 +09:00
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div className="flex items-center justify-between">
|
|
|
|
|
<span className="text-xs lg:text-sm text-gray-400">
|
2026-03-24 19:36:40 +09:00
|
|
|
{dayjs(parcel.created_at).format("YYYY.MM.DD")}
|
2026-03-24 14:03:49 +09:00
|
|
|
</span>
|
|
|
|
|
<StatusBadge status={parcel.status} />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 19:36:40 +09:00
|
|
|
function CarrierLogo({ carrier }) {
|
2026-03-24 20:29:13 +09:00
|
|
|
if (!carrier) return <div className="w-9 h-9 lg:w-10 lg:h-10 shrink-0" />;
|
2026-03-24 19:36:40 +09:00
|
|
|
|
|
|
|
|
if (carrier.logo_url) {
|
|
|
|
|
return (
|
|
|
|
|
<img
|
|
|
|
|
src={carrier.logo_url}
|
|
|
|
|
alt={carrier.name}
|
2026-03-24 20:29:13 +09:00
|
|
|
className="w-9 h-9 lg:w-10 lg:h-10 rounded-full object-contain shrink-0"
|
2026-03-24 19:36:40 +09:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<span
|
2026-03-24 20:29:13 +09:00
|
|
|
className="inline-flex items-center justify-center w-9 h-9 lg:w-10 lg:h-10 rounded-full text-white text-[11px] lg:text-xs font-bold shrink-0"
|
2026-03-24 19:36:40 +09:00
|
|
|
style={{ backgroundColor: carrier.color }}
|
|
|
|
|
>
|
|
|
|
|
{carrier.short_name?.slice(0, 2)}
|
|
|
|
|
</span>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 14:03:49 +09:00
|
|
|
export default ParcelCard;
|