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:
AutonetSellCar Deploy
2026-01-12 23:37:31 +09:00
parent 2378392f95
commit 2720689515
10 changed files with 618 additions and 11 deletions

View File

@@ -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

View File

@@ -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딜러가 차량을 찾고있습니다...',