feat: Add promo preference survey on main page
- Add promo preference fields to User model (promo_preferred_maker, promo_preferred_model, promo_email_enabled) - Create API endpoints for getting/updating promo preferences - Create PromoPreference component with maker/model selection - Show login prompt for non-logged-in users when interacting - Add promo notification service to send emails when matching vehicles are added to promotion - Add multi-language translations (en, mn, ru, ko) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import axios from 'axios';
|
||||
import { Car, CarListResponse, CarMaker, CarModel, User, HeroBanner, HeroBannerSettings, CarView } from '@/types';
|
||||
import { Car, CarListResponse, CarMaker, CarModel, User, HeroBanner, HeroBannerSettings, CarView, PromoPreference } from '@/types';
|
||||
|
||||
// When NEXT_PUBLIC_API_URL is empty, use relative path (for HTTPS proxy setup)
|
||||
const API_URL = process.env.NEXT_PUBLIC_API_URL;
|
||||
@@ -133,6 +133,18 @@ export const authApi = {
|
||||
const { data } = await api.post('/auth/withdraw/cancel');
|
||||
return data;
|
||||
},
|
||||
|
||||
// 프로모션 선호 차종 조회
|
||||
getPromoPreference: async (): Promise<PromoPreference> => {
|
||||
const { data } = await api.get('/auth/me/promo-preference');
|
||||
return data;
|
||||
},
|
||||
|
||||
// 프로모션 선호 차종 설정
|
||||
updatePromoPreference: async (preference: PromoPreference): Promise<PromoPreference> => {
|
||||
const { data } = await api.put('/auth/me/promo-preference', preference);
|
||||
return data;
|
||||
},
|
||||
};
|
||||
|
||||
// Inquiries API
|
||||
|
||||
@@ -121,6 +121,17 @@ export interface Translations {
|
||||
contactForPrice: string;
|
||||
engine: string;
|
||||
|
||||
// Promo Preference
|
||||
promoPreferenceTitle: string;
|
||||
promoPreferenceDesc: string;
|
||||
selectMaker: string;
|
||||
selectModel: string;
|
||||
promoEmailAlert: string;
|
||||
promoLoginRequired: string;
|
||||
savePreference: string;
|
||||
saving: string;
|
||||
saved: string;
|
||||
|
||||
// Vehicle Request & CC System
|
||||
requestVehicle: string;
|
||||
aiDealerSearching: string;
|
||||
@@ -592,6 +603,17 @@ const translations: Record<Language, Translations> = {
|
||||
contactForPrice: 'Contact for price',
|
||||
engine: 'Engine',
|
||||
|
||||
// Promo Preference
|
||||
promoPreferenceTitle: 'Next Promotion Interest',
|
||||
promoPreferenceDesc: 'Tell us which vehicle you want in the next promotion!',
|
||||
selectMaker: 'Select Maker',
|
||||
selectModel: 'Select Model',
|
||||
promoEmailAlert: 'Notify me by email when this vehicle is on promotion',
|
||||
promoLoginRequired: 'Please login to save your preference',
|
||||
savePreference: 'Save Preference',
|
||||
saving: 'Saving...',
|
||||
saved: 'Saved!',
|
||||
|
||||
// Vehicle Request & CC System
|
||||
requestVehicle: 'Request Vehicle',
|
||||
aiDealerSearching: 'Korean AI Dealer is searching for vehicles...',
|
||||
@@ -1061,6 +1083,17 @@ const translations: Record<Language, Translations> = {
|
||||
contactForPrice: 'Үнийг лавлана уу',
|
||||
engine: 'Хөдөлгүүр',
|
||||
|
||||
// Promo Preference
|
||||
promoPreferenceTitle: 'Дараагийн урамшуулалд сонирхолтой',
|
||||
promoPreferenceDesc: 'Дараагийн урамшуулалд ямар машин хүсч байгаагаа хэлнэ үү!',
|
||||
selectMaker: 'Үйлдвэрлэгч сонгох',
|
||||
selectModel: 'Загвар сонгох',
|
||||
promoEmailAlert: 'Энэ машин урамшуулалд гарахад имэйлээр мэдэгдэнэ үү',
|
||||
promoLoginRequired: 'Сонголтоо хадгалахын тулд нэвтэрнэ үү',
|
||||
savePreference: 'Сонголт хадгалах',
|
||||
saving: 'Хадгалж байна...',
|
||||
saved: 'Хадгалагдлаа!',
|
||||
|
||||
// Vehicle Request & CC System
|
||||
requestVehicle: 'Машин захиалах',
|
||||
aiDealerSearching: 'Солонгосын AI дилер машин хайж байна...',
|
||||
@@ -1530,6 +1563,17 @@ const translations: Record<Language, Translations> = {
|
||||
contactForPrice: 'Цена по запросу',
|
||||
engine: 'Двигатель',
|
||||
|
||||
// Promo Preference
|
||||
promoPreferenceTitle: 'Интерес к следующей акции',
|
||||
promoPreferenceDesc: 'Расскажите, какой автомобиль вы хотите в следующей акции!',
|
||||
selectMaker: 'Выберите марку',
|
||||
selectModel: 'Выберите модель',
|
||||
promoEmailAlert: 'Уведомить по email когда этот автомобиль появится в акции',
|
||||
promoLoginRequired: 'Войдите, чтобы сохранить предпочтения',
|
||||
savePreference: 'Сохранить предпочтения',
|
||||
saving: 'Сохранение...',
|
||||
saved: 'Сохранено!',
|
||||
|
||||
// Vehicle Request & CC System
|
||||
requestVehicle: 'Запросить автомобиль',
|
||||
aiDealerSearching: 'Корейский AI-дилер ищет автомобили...',
|
||||
@@ -1999,6 +2043,17 @@ const translations: Record<Language, Translations> = {
|
||||
contactForPrice: '가격 문의',
|
||||
engine: '엔진',
|
||||
|
||||
// Promo Preference
|
||||
promoPreferenceTitle: '다음 프로모션 관심 차종',
|
||||
promoPreferenceDesc: '다음 프로모션에 원하는 차량을 알려주세요!',
|
||||
selectMaker: '제조사 선택',
|
||||
selectModel: '모델 선택',
|
||||
promoEmailAlert: '이 차량이 프로모션에 등록되면 이메일로 알림받기',
|
||||
promoLoginRequired: '선호도를 저장하려면 로그인하세요',
|
||||
savePreference: '선호도 저장',
|
||||
saving: '저장 중...',
|
||||
saved: '저장됨!',
|
||||
|
||||
// Vehicle Request & CC System
|
||||
requestVehicle: '차량요청하기',
|
||||
aiDealerSearching: '한국AI딜러가 차량을 찾고있습니다...',
|
||||
|
||||
Reference in New Issue
Block a user