'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; import { useTranslation, formatPriceWithCurrency, translateCarName } from '@/lib/i18n'; import { useAuthStore } from '@/lib/store'; import { vehicleRequestsApi, VehicleRequestWithVehicles, DirectPurchasedCar } from '@/lib/api'; import SidebarLayout from '@/components/SidebarLayout'; const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || ''; // 이미지 URL 변환 (로컬 경로는 백엔드 URL 추가) const getImageUrl = (url: string | undefined): string => { if (!url) return ''; if (url.startsWith('http://') || url.startsWith('https://')) { return url; } // 로컬 경로인 경우 백엔드 URL 추가 return `${API_BASE_URL}${url}`; }; export default function MyRequestPage() { const router = useRouter(); const { t, language } = useTranslation(); const { user } = useAuthStore(); const [requests, setRequests] = useState([]); const [directPurchases, setDirectPurchases] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [expandedRequest, setExpandedRequest] = useState(null); const [showDirectPurchases, setShowDirectPurchases] = useState(true); // Redirect if not logged in useEffect(() => { if (!user) { router.push('/login?redirect=/my-request'); } }, [user, router]); // Load all vehicles (recommended + directly purchased) useEffect(() => { const loadVehicles = async () => { if (!user) return; try { setIsLoading(true); const data = await vehicleRequestsApi.getMyVehicles(); setRequests(data.vehicle_requests); setDirectPurchases(data.direct_purchases); // Auto-expand first request if it has approved vehicles if (data.vehicle_requests.length > 0 && data.vehicle_requests[0].approved_vehicles.length > 0) { setExpandedRequest(data.vehicle_requests[0].request.id); } } catch (err) { console.error('Failed to load vehicles:', err); setError(language === 'ko' ? '차량 목록을 불러오는데 실패했습니다.' : 'Failed to load vehicles.'); } finally { setIsLoading(false); } }; loadVehicles(); }, [user, language]); // Format date (mn uses en-US as mn-MN is not supported in most browsers) const formatDate = (dateString: string) => { const date = new Date(dateString); const locale = language === 'ko' ? 'ko-KR' : language === 'ru' ? 'ru-RU' : 'en-US'; return date.toLocaleDateString(locale, { year: 'numeric', month: 'long', day: 'numeric', }); }; // Get status badge const getStatusBadge = (status: string) => { const statusConfig: Record = { pending: { color: 'bg-yellow-100 text-yellow-800', label: t.pendingReview }, reviewed: { color: 'bg-blue-100 text-blue-800', label: language === 'ko' ? '검토됨' : 'Reviewed' }, completed: { color: 'bg-green-100 text-green-800', label: t.adminApproved }, }; const config = statusConfig[status] || statusConfig.pending; return ( {config.label} ); }; // Format price const formatPrice = (priceKrw: number | undefined) => { return formatPriceWithCurrency(priceKrw, language); }; if (!user) { return (

{t.loginRequired}

{t.loginToRequest}

{t.login}
); } return (
{/* Header */}

{t.myRequestTitle}

{t.trackYourVehicle}

{t.newRequest}
{/* Loading State */} {isLoading && (
)} {/* Error State */} {error && (

{error}

)} {/* No Vehicles at all */} {!isLoading && !error && requests.length === 0 && directPurchases.length === 0 && (

{t.noRequestsYet}

{t.requestVehicle}
)} {/* Requests List */} {!isLoading && !error && requests.length > 0 && (
{requests.map((item) => (
{/* Request Header */}
setExpandedRequest(expandedRequest === item.request.id ? null : item.request.id)} >

{translateCarName(item.request.maker_name, language)} - {translateCarName(item.request.model_name, language)} {item.request.grade_name && ` (${translateCarName(item.request.grade_name, language)})`}

{getStatusBadge(item.request.status)}

{t.requestDate}: {formatDate(item.request.created_at)}

{(item.request.year_from || item.request.year_to) && (

{t.yearRange}: {item.request.year_from || '-'} ~ {item.request.year_to || '-'}

)} {(item.request.mileage_min || item.request.mileage_max) && (

{t.mileageRange}:{' '} {item.request.mileage_min ? `${Math.round(item.request.mileage_min / 10000)}${t.tenThousandKm}` : '-'} ~{' '} {item.request.mileage_max ? `${Math.round(item.request.mileage_max / 10000)}${t.tenThousandKm}` : '-'}

)}
{item.approved_vehicles.length > 0 && ( {item.approved_vehicles.length} {t.approvedVehicles} )}
{/* Approved Vehicles */} {expandedRequest === item.request.id && item.approved_vehicles.length > 0 && (

{t.approvedVehicles}

{item.approved_vehicles.map((vehicle) => { const carData = vehicle.car_data; const priceInfo = formatPrice(carData?.final_price); const isSoldout = carData?.soldout === true; // Use car_id from vehicle or fallback to local_car_id in car_data const carId = vehicle.car_id || carData?.local_car_id || carData?.id; return (
{/* Clickable Vehicle Card */} {/* Vehicle Image */}
{carData?.main_image ? ( {carData.car_name ) : (
)} {/* Soldout Badge */} {isSoldout && (
{language === 'ko' ? '판매완료' : 'SOLD OUT'}
)}
{/* Vehicle Info */}
{translateCarName(carData?.car_name, language)}
{t.year} {carData?.year || '-'}
{t.mileage} {carData?.mileage?.toLocaleString()} km
{t.fuel} {translateCarName(carData?.fuel, language) || '-'}
{priceInfo.usdt}
{priceInfo.local}
{/* Action Buttons */}
{isSoldout ? (
{language === 'ko' ? '판매완료' : 'Sold Out'}
) : carId ? ( <> ) : (
{language === 'ko' ? '차량 정보 없음' : 'Vehicle unavailable'}
)}
); })}
)} {/* No approved vehicles message */} {expandedRequest === item.request.id && item.approved_vehicles.length === 0 && (

{t.waitingForQuote}

{t.quoteWithin24Hours}

)}
))}
)} {/* Directly Purchased Cars Section */} {!isLoading && !error && directPurchases.length > 0 && (
{/* Section Header */}
setShowDirectPurchases(!showDirectPurchases)} >

{language === 'ko' ? '직접 구매한 차량' : 'Directly Purchased Cars'}

{language === 'ko' ? '배너에서 1CC로 정보를 구매한 차량' : 'Cars purchased with 1CC from banners'}

{directPurchases.length} {language === 'ko' ? '대' : 'cars'}
{/* Direct Purchases Grid */} {showDirectPurchases && (
{directPurchases.map((purchase) => { const carData = purchase.car_data; const priceInfo = formatPrice(carData?.final_price); const isSoldout = carData?.soldout === true; const carId = purchase.car_id; return (
{/* Clickable Vehicle Card */} {/* Vehicle Image */}
{carData?.main_image ? ( {carData.car_name ) : (
)} {/* Soldout Badge */} {isSoldout && (
{language === 'ko' ? '판매완료' : 'SOLD OUT'}
)} {/* Direct Purchase Badge */}
{purchase.cc_paid} CC
{/* Vehicle Info */}
{translateCarName(carData?.car_name, language)}
{t.year} {carData?.year || '-'}
{t.mileage} {carData?.mileage?.toLocaleString()} km
{t.fuel} {translateCarName(carData?.fuel, language) || '-'}
{priceInfo.usdt}
{priceInfo.local}
{/* Action Buttons */}
{isSoldout ? (
{language === 'ko' ? '판매완료' : 'Sold Out'}
) : ( <> )}
); })}
)}
)}
); }