import React from "react"; import { TripCardProps, truckAdditionalData } from "./type"; import { TimerLabel } from "../../lib/common/TimerLabel"; import Spinner from "../common/Spinner"; import { InterestSvg } from "../../assets/svg/InterestSvg"; import { InterestFillSvg } from "../../assets/svg/InterestFillSvg"; import { EyeSvg } from "../../assets/svg/EyeSvg"; import { OpenSvg } from "../../assets/svg/OpenSvg"; import ForkLiftLoading from "../../assets/svg/forklift_icon_svg"; import SteelPlatform from "../../assets/svg/steel_platform_svg"; import SmoothFlooring from "../../assets/svg/smooth_flooring_svg"; import DigitalLock from "../../assets/svg/digital_lock_svg"; import CentralLock from "../../assets/svg/central_lock_svg"; import NoBeeding from "../../assets/svg/no_beeding_svg"; import Fuel from "../../assets/svg/fuel_svg"; import Dimensions from "../../assets/svg/DimensionsSvg"; import CityLoading from "../../assets/svg/city_loading_svg"; import CityUnloading from "../../assets/svg/city_unloading_svg"; import Tarpoline from "../../assets/svg/tarpoline_svg"; import { ContainerSvg } from "../../assets/svg/ContainerSvg"; import Hooks from "../../assets/svg/hooks_svg"; import GPSRequired from "../../assets/svg/gps_required_svg"; import { ProfileFilledSvg } from "../../assets/svg/ProfileFilledSvg"; import { StarSvg } from "../../assets/svg/StarSvg"; import constants from "../../lib/common/constants"; // Mapping of requirement types to icons const requirementIcons: { [key: string]: JSX.Element } = { 'Forklift Loading': , 'Steel Platform': , 'Hooks': , 'Smooth Flooring': , 'Central Lock': , 'Digital Lock': , 'GPS required': , 'Non - CNG': , 'No Beading': , 'Dimensions': , 'City Loading': , 'City Unloading': , 'Tarpaulin': }; type TagKey = "soft_pod" | "to_pay"; interface TagConfig { bgColor: string; textColor: string; label: string; } interface TagItem { key: TagKey; show: boolean; } export const TripCard = (props: TripCardProps) => { const { tripData, onClickTripCard, translatedTon, translatedStops, handleInterest, translatedTarpulin, employeeLanguages, translatedTexts } = props; const { id, sourceName, destinationName, truckTypeName, trafficName, materialName, ton, price, loadingUnloadingPoint, isInterested, isCreatedAtLessThan30Mins, isViewed, humanReadableCreatedAt, isInterestLoading, truck_type_group_id, is_price_per_ton, partner_price_per_ton, trip_additional_truck_requirements , isTopay, podType, softPodLabel, sourceStateCode, destinationStateCode} = tripData; const totalPoints = loadingUnloadingPoint?.length; const onClickCard = () => { onClickTripCard(id); }; const handleInterestAndStopPropagation = (e: React.MouseEvent) => { e.stopPropagation(); handleInterest(id); }; const formatTruckRequirements = (req: truckAdditionalData) => { const requirements = []; if (req.truck_breadth && req.truck_height) { requirements.push({ text: `${req.truck_breadth}ft x ${req.truck_height}ft`, icon: requirementIcons['Dimensions'] }); } if (req.additional_truck_requirements) { requirements.push( ...req.additional_truck_requirements.map(r => { const requirementName = r?.name; return { text: requirementName || '', icon: requirementName ? requirementIcons[requirementName] : null }; }) ); } if (req.tarpoline_count && req.tarpoline_count > 0) { requirements.push({ text: `${translatedTarpulin} ${req.tarpoline_count} ${translatedTexts?.nos ?? "Nos"}`, icon: requirementIcons['Tarpaulin'] }); } return requirements; }; // Use nullish coalescing to provide a default empty array if trip_additional_truck_requirements is undefined const requirementsList = (trip_additional_truck_requirements ?? []).flatMap(req => formatTruckRequirements(req)); const initialRequirements = requirementsList.slice(0, 2); const remainingCount = requirementsList.length > 2 ? requirementsList.length - 2 : 0; const TAG_CONFIG: Record = { soft_pod: { bgColor: "#D5F0B1", textColor: "#2E5C0E", label: softPodLabel ?? "Soft POD", }, to_pay: { bgColor: "#E6F2F8", textColor: "#003072", label: translatedTexts?.toPay ?? "To-Pay", }, }; const tags: TagItem[] = [ { key: "soft_pod", show: podType === constants.POD_TYPE.NO_POD || podType === constants.POD_TYPE.SOFT_POD }, { key: "to_pay", show: isTopay }, ]; const visibleTags = tags.filter(tag => tag.show); return (
{truck_type_group_id === 1 ? : (truck_type_group_id === 2 ? : null)}

{truckTypeName}

 |  {isCreatedAtLessThan30Mins ? ( {translatedTexts?.newLabel ?? "New"} ) : ( {humanReadableCreatedAt} )} {isViewed ? ( {translatedTexts?.viewedLabel ?? "Viewed"} ) : null}
{ton ? (
{ton} {translatedTon}
) : null}

{materialName} <> | {trafficName}

₹{is_price_per_ton ? ( <> {partner_price_per_ton}/{translatedTon ?? "Ton"} ) : ( price )}
{totalPoints === 3 ? ( ) : totalPoints > 3 ? (

{loadingUnloadingPoint?.length - 2} {translatedStops}

) : null} {totalPoints > 2 ?
: <>}
{/* ✅ Tags shown directly under destination name */} {visibleTags.length > 0 ? (
{visibleTags.map((tag, index) => { const config = TAG_CONFIG[tag.key]; if (!config) return null; return ( {config.label} ); })}
) : ( // ✅ If no tags, remove gap — keeps price aligned
)}
{ isInterestLoading ? : isInterested ? : }
{requirementsList.length > 0 && ( )}

{tripData?.trafficRating ?
{/* Profile Icon */} {/* Rating Badge */} {tripData?.trafficRating === 'No Rating' ?
{translatedTexts?.noRating ?? "No Rating"}
:
{tripData?.trafficRating}
}
: }

{translatedTexts.trafficAgent}

{tripData.trafficName}

{employeeLanguages && employeeLanguages.filter((lang) => lang).length > 0 && (
{translatedTexts.speaks} {employeeLanguages.slice(0, 2).map((lang: string, index: number) => ( {lang}{index < employeeLanguages.slice(0, 2).length - 1 ? ',' : ''} ))} {employeeLanguages.length > 2 && ( +{employeeLanguages.length - 2} {translatedTexts?.more ?? "more"} )}
)}
); }; export default TripCard;