feat: Use carmodooApi for PromoPreference to share data with Request Vehicle

- Changed from carsApi to carmodooApi for maker/model data
- Now shares same data source as vehicle-request page
- Added CarmodooMaker and CarmodooModel types

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
AutonetSellCar Deploy
2026-01-13 00:19:08 +09:00
parent d1b14f8b76
commit 25caadde95

View File

@@ -2,10 +2,9 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import Link from 'next/link'; import Link from 'next/link';
import { carsApi, authApi } from '@/lib/api'; import { carmodooApi, authApi, CarmodooMaker, CarmodooModel } from '@/lib/api';
import { useAuthStore } from '@/lib/store'; import { useAuthStore } from '@/lib/store';
import { useTranslation, useLanguageStore, translateCarName } from '@/lib/i18n'; import { useTranslation, useLanguageStore, translateCarName } from '@/lib/i18n';
import { CarMaker, CarModel } from '@/types';
export default function PromoPreference() { export default function PromoPreference() {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -13,10 +12,12 @@ export default function PromoPreference() {
const { user, token } = useAuthStore(); const { user, token } = useAuthStore();
const isLoggedIn = !!token && !!user; const isLoggedIn = !!token && !!user;
const [makers, setMakers] = useState<CarMaker[]>([]); const [makers, setMakers] = useState<CarmodooMaker[]>([]);
const [models, setModels] = useState<CarModel[]>([]); const [models, setModels] = useState<CarmodooModel[]>([]);
const [selectedMaker, setSelectedMaker] = useState<string>(''); const [selectedMakerCode, setSelectedMakerCode] = useState<string>('');
const [selectedModel, setSelectedModel] = useState<string>(''); const [selectedMakerName, setSelectedMakerName] = useState<string>('');
const [selectedModelCode, setSelectedModelCode] = useState<string>('');
const [selectedModelName, setSelectedModelName] = useState<string>('');
const [emailEnabled, setEmailEnabled] = useState(false); const [emailEnabled, setEmailEnabled] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [saved, setSaved] = useState(false); const [saved, setSaved] = useState(false);
@@ -26,7 +27,7 @@ export default function PromoPreference() {
useEffect(() => { useEffect(() => {
const loadMakers = async () => { const loadMakers = async () => {
try { try {
const data = await carsApi.getMakers(); const data = await carmodooApi.getMakers();
setMakers(data); setMakers(data);
} catch (error) { } catch (error) {
console.error('Failed to load makers:', error); console.error('Failed to load makers:', error);
@@ -42,16 +43,19 @@ export default function PromoPreference() {
try { try {
const pref = await authApi.getPromoPreference(); const pref = await authApi.getPromoPreference();
if (pref.promo_preferred_maker) { if (pref.promo_preferred_maker) {
setSelectedMaker(pref.promo_preferred_maker); // Find maker by name and set code
// Load models for selected maker
const maker = makers.find(m => m.name === pref.promo_preferred_maker); const maker = makers.find(m => m.name === pref.promo_preferred_maker);
if (maker) { if (maker) {
const modelsData = await carsApi.getModels(maker.id); setSelectedMakerCode(maker.code);
setSelectedMakerName(maker.name);
// Load models for selected maker
const modelsData = await carmodooApi.getModels(maker.code);
setModels(modelsData); setModels(modelsData);
} }
} }
if (pref.promo_preferred_model) { if (pref.promo_preferred_model) {
setSelectedModel(pref.promo_preferred_model); setSelectedModelName(pref.promo_preferred_model);
// Find model code from loaded models or set it later
} }
setEmailEnabled(pref.promo_email_enabled); setEmailEnabled(pref.promo_email_enabled);
} catch (error) { } catch (error) {
@@ -64,38 +68,41 @@ export default function PromoPreference() {
}, [isLoggedIn, makers]); }, [isLoggedIn, makers]);
// Load models when maker changes // Load models when maker changes
const handleMakerChange = async (makerName: string) => { const handleMakerChange = async (makerCode: string) => {
if (!isLoggedIn) { if (!isLoggedIn) {
setShowLoginPrompt(true); setShowLoginPrompt(true);
return; return;
} }
setShowLoginPrompt(false); setShowLoginPrompt(false);
setSelectedMaker(makerName); setSelectedMakerCode(makerCode);
setSelectedModel(''); setSelectedModelCode('');
setSelectedModelName('');
setSaved(false); setSaved(false);
if (makerName) { const maker = makers.find(m => m.code === makerCode);
const maker = makers.find(m => m.name === makerName); setSelectedMakerName(maker?.name || '');
if (maker) {
try { if (makerCode) {
const data = await carsApi.getModels(maker.id); try {
setModels(data); const data = await carmodooApi.getModels(makerCode);
} catch (error) { setModels(data);
console.error('Failed to load models:', error); } catch (error) {
} console.error('Failed to load models:', error);
} }
} else { } else {
setModels([]); setModels([]);
} }
}; };
const handleModelChange = (modelName: string) => { const handleModelChange = (modelCode: string) => {
if (!isLoggedIn) { if (!isLoggedIn) {
setShowLoginPrompt(true); setShowLoginPrompt(true);
return; return;
} }
setShowLoginPrompt(false); setShowLoginPrompt(false);
setSelectedModel(modelName); setSelectedModelCode(modelCode);
const model = models.find(m => m.code === modelCode);
setSelectedModelName(model?.name || '');
setSaved(false); setSaved(false);
}; };
@@ -117,8 +124,8 @@ export default function PromoPreference() {
setLoading(true); setLoading(true);
try { try {
await authApi.updatePromoPreference({ await authApi.updatePromoPreference({
promo_preferred_maker: selectedMaker || undefined, promo_preferred_maker: selectedMakerName || undefined,
promo_preferred_model: selectedModel || undefined, promo_preferred_model: selectedModelName || undefined,
promo_email_enabled: emailEnabled, promo_email_enabled: emailEnabled,
}); });
setSaved(true); setSaved(true);
@@ -143,27 +150,27 @@ export default function PromoPreference() {
<div className="space-y-3"> <div className="space-y-3">
<div className="flex flex-col sm:flex-row gap-2"> <div className="flex flex-col sm:flex-row gap-2">
<select <select
value={selectedMaker} value={selectedMakerCode}
onChange={(e) => handleMakerChange(e.target.value)} onChange={(e) => handleMakerChange(e.target.value)}
className="flex-1 px-3 py-2 rounded-lg text-sm text-gray-800 bg-white border-0 focus:ring-2 focus:ring-yellow-500" className="flex-1 px-3 py-2 rounded-lg text-sm text-gray-800 bg-white border-0 focus:ring-2 focus:ring-yellow-500"
> >
<option value="">{t.selectMaker || 'Select Maker'}</option> <option value="">{t.selectMaker || 'Select Maker'}</option>
{makers.map((maker) => ( {makers.map((maker) => (
<option key={maker.id} value={maker.name}> <option key={maker.code} value={maker.code}>
{translateCarName(maker.name, language)} {translateCarName(maker.name, language)}
</option> </option>
))} ))}
</select> </select>
<select <select
value={selectedModel} value={selectedModelCode}
onChange={(e) => handleModelChange(e.target.value)} onChange={(e) => handleModelChange(e.target.value)}
disabled={!selectedMaker} disabled={!selectedMakerCode}
className="flex-1 px-3 py-2 rounded-lg text-sm text-gray-800 bg-white border-0 focus:ring-2 focus:ring-yellow-500 disabled:bg-gray-100 disabled:text-gray-400" className="flex-1 px-3 py-2 rounded-lg text-sm text-gray-800 bg-white border-0 focus:ring-2 focus:ring-yellow-500 disabled:bg-gray-100 disabled:text-gray-400"
> >
<option value="">{t.selectModel || 'Select Model'}</option> <option value="">{t.selectModel || 'Select Model'}</option>
{models.map((model) => ( {models.map((model) => (
<option key={model.id} value={model.name}> <option key={model.code} value={model.code}>
{translateCarName(model.name, language)} {translateCarName(model.name, language)}
</option> </option>
))} ))}
@@ -199,7 +206,7 @@ export default function PromoPreference() {
)} )}
{/* Save Button */} {/* Save Button */}
{isLoggedIn && (selectedMaker || emailEnabled) && ( {isLoggedIn && (selectedMakerCode || emailEnabled) && (
<button <button
onClick={handleSave} onClick={handleSave}
disabled={loading} disabled={loading}