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:
@@ -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) {
|
|
||||||
|
if (makerCode) {
|
||||||
try {
|
try {
|
||||||
const data = await carsApi.getModels(maker.id);
|
const data = await carmodooApi.getModels(makerCode);
|
||||||
setModels(data);
|
setModels(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load models:', 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}
|
||||||
|
|||||||
Reference in New Issue
Block a user