Integration: team platform-updates + redesign + free-model#4
Open
KSultonboy wants to merge 57 commits into
Open
Integration: team platform-updates + redesign + free-model#4KSultonboy wants to merge 57 commits into
KSultonboy wants to merge 57 commits into
Conversation
- Rewrite palette.ts: Deep Navy base, Sky Blue primary, Aqua Mint AI accent - Add AI/gradient tokens (aiAccent, gradientPrimary, gradientHero, blurTint, sand) - Default theme preference to dark (dark-first brand) - Switch heading font Plus Jakarta -> Space Grotesk (Inter body unchanged) - Add RADIUS.button/card, CONTROL_HEIGHT, and effects.ts glow helpers - Install expo-linear-gradient, expo-blur, space-grotesk; drop plus-jakarta Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Button: gradient primary + new 'ai' variant with aqua glow + spark icon, 56px CTA height - Add GlassCard (expo-blur frosted panel) for use over photos/maps - Card: 20px radius, hairline border, shared cardShadow - Badge: new 'ai' variant with sparkle + aqua glow - Add AiSpark (animated SVG sparkle, reduce-motion aware) - Add AiThinking (rotating AI loading phrases) replacing LoadingDots - AnimatedBrand: aqua glow + aqua 'AI' accent - Remove dead decorative components (FabricWave, FallingPetals, LoadingDots) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Splash (index): hero gradient + animated brand + tagline - Onboarding: gradient bg, aqua glow icon, aqua dots, gradient CTA - Tab bar: frosted glass (BlurView) + aqua active glow pill - Home: AI planner gradient CTA card with spark + glow; aqua accents - Planner: gradient generate button, aqua progress bar, AiSpark loading - Planner result: gradient save button, brand-colored confetti - Trip map loading: hero gradient + AiSpark - Budget chart: brand aqua/sky/sand segment palette Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- StitchButton: gradient primary variant (powers auth/list screens) - StitchMobile: aqua section actions, theme-aware dark button - Replace legacy near-black (#050814) surfaces with primaryDark (visible on navy) - Trip setup featured option row -> sky-blue branded CTA with dark text - Map markers + achievement accents -> brand aqua/sky/sand palette - Notification accent -> sky blue; remove dead legacy colors.ts Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add AuroraBackground (Skia animated mesh/aurora, reduce-motion aware) - Add Globe3D (SVG + Reanimated pseudo-3D rotating globe, UI-thread) - Add LottieAnim wrapper + hand-authored ai-loading & success Lottie JSON - Splash: aurora background + rotating 3D globe + forced-light brand text - Trip map loading: aurora + Lottie ai-loading - Planner loading overlay: Lottie ai-loading - Planner result: Lottie success overlay on trip save - Install @shopify/react-native-skia + lottie-react-native (SDK 54) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Policy-based runtimeVersion is unsupported when a native android/ dir exists. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Backend:
- Add TourAgency.telegram field (+ migration); make TourBooking.customerEmail optional
- Expose agency contact (phone/telegram/website) in tour/agency/booking payloads
- Booking accepts a free lead with phone OR email (no payment required)
Mobile (Tour Details):
- "Agentlik bilan bog'lanish" card: Telegram / WhatsApp / Call / Website buttons
- Prefill name/email from logged-in user; email now optional
- Reworded as free request ("So'rov qoldiring / yuborish")
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- publicAgency exposes telegram; updateAgencyProfile allows editing telegram - Admin approval copies application.telegram -> TourAgency.telegram - Email the agency owner on every new free booking lead (sendBookingLeadEmail) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…odel Combine codex/travelorai-platform-updates (team web/agency/auth/booking-deadline work) with the navy/aqua mobile redesign + free user↔agency lead model. - backend: keep team's expanded controllers/auth/migrations; port telegram field (TourAgency + public/admin/agency outputs), free-lead flow (optional customerEmail, phone-or-email), and agency new-lead email notification onto team's booking flow (responseDeadlineAt preserved) - website: take team's version wholesale (AccountPortal, AgencyPortal, landing v2, GoogleContinueButton, LandingTours) - mobile: keep redesign; port team's wishlist toggle on home cards, bookings screen route, planner response-time UI + "Bookinglarim" CTA, resolveMediaUrl - schema: TourAgency.telegram + TourBooking.customerEmail optional; migration history linear Verified: prisma generate OK, mobile tsc clean, website next build OK. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Agency (agency.travelorai.com): - Monolit 1400-qator AgencyPortal.tsx -> sahifa-routing arxitektura - lib/agency: types + api helper + session context (yagona holat manbasi) - /agency dashboard (lead-first ish stoli), /leads (inbox: yangi/qabul/arxiv), /tours + /tours/new + /tours/[id] (editor), /profile (email-change countdown) - Sidebar: yangi lead badge, sahifalararo real URL navigatsiya Admin (admin.travelorai.com): - /admin dashboard: tasdiqlash navbatlari (ariza/tour/lead) + platforma stats - /admin/moderation: agentlik arizalari + tour review (approve/reject + izoh) - /admin/leads: barcha leadlar nazorati + admin override - /admin/agencies: faollik boshqaruvi - Mavjud /admin/content va /admin/hero saqlanadi, yagona AdminShell nav Baza prod jonli manbasi bilan sinxronlandi (cookie-auth proxylar, email-change).
- Nav links light-on-dark, mint active state with glow, username chip - Aside rounded card look; stats read flat totalUsers/totalTrips/totalPlaces/totalFeedback
- Admin/agency sidebar: flush to edge, collapse/expand toggle (localStorage) - Agency auth: full-viewport split layout (image left, form right), no page scroll - Onboarding application: 4-step wizard (kompaniya/aloqa/onlayn/tavsif) - Tour editor: 3-step wizard (asosiy/narx/kontent) with step validation
- Agency auth left panel: faqat brand + sarlavha (ortiqcha matnlar olib tashlandi) - Admin login: yangilangan matn (boshqaruv paneli), ixcham karta, scrollsiz, /admin'ga redirect
…ression, approval celebration - Wizard bosqichlari yo'nalishli slide+fade bilan o'tadi (reduced-motion hurmat qilinadi) - Sana: '11-iyun, 2026-yil' formatida (Intl uz-UZ 'M06' muammosi o'rniga qo'lda oy nomlari) - Rasm yuklash: client-side siqish (max 1280px JPEG) — reviewga yuborish sezilarli tezlashadi - Ariza tasdiqlanganda: ikki burchakdan konfeti + 'Xush kelibsiz!' kartasi, so'ng kabinet ochiladi
Email almashtirish yakunlanganda ikkala manzilga 'muvaffaqiyatli o'zgartirildi' xabarnomasi (fire-and-forget).
Prod container'da SMTP/Google sozlamalarini recreate'siz .env orqali almashtirish imkonini beradi.
Email almashtirilganda eski Google identifikatori uziladi — aks holda eski Gmail bilan 'Continue with Google' hisobga kiraverardi. Xabarnomaga eslatma qo'shildi.
…eports - /admin/places: POI CRUD (landing ko'rsatish/featured toggle) - /admin/stories: sayohatchi fikrlari CRUD - /admin/reports: umumiy hisobotlar — tizim holati, platforma, turlar, leadlar, POI sifat (oddiy kartalar) - /admin/content monolit (Platform overview) -> /admin redirect - AdminShell nav + dashboard quick links yangilandi
- Boshqaruv sahifasi endi navbatlar + to'liq monitoring (tizim/platforma/turlar/leadlar/POI) - /admin/reports -> /admin redirect, Hisobotlar nav olib tashlandi - /admin/hero: eski /admin/content redirect o'rniga HeroSlidesAdmin AdminShell ichida - HeroSlidesAdmin: o'z monolit sidebar'i olib tashlandi (yagona shell)
- Booking forma: 'ro'yxatdan o'tish shart emas' tushuntiruvi (agentlik fikri asosida) - Bookinglarim: mehmonga do'stona ekran (jim bo'sh o'rniga kirish tushuntirishi + tugmalar) - eas.json: production-apk profili (production channel, adb sideload uchun)
- Backend: schema +21 paket maydonlari, 3 migration, tourImage util, controllers/schemas (Codex) + mening patchlarim saqlangan (email notice, googleId detach) — 3-way merge - Website v2: TourEditor 4 bosqich (Asosiy / Mehmonxona va ovqat / Narx va mavjudlik / Kontent), meal-plan select + hint, checkbox-row stillar, admin moderation paket ko'rinishi, 16mb proxy - Mobile: tur detail paket kartasi (Codex) + guest-booking izohi saqlangan
….md rules - POST /agency/auth/google route + googleAuth controller + googleAuthSchema - AgencyAccount.googleId (idempotent migration — prod DB da ustun bor edi) - AGENTS.md: agentlar uchun majburiy qoidalar (git baza, podman deploy, port-war oldini olish)
…eens, package badges on catalog - Bookinglarim: status endi uzbekcha + rangli (Javob kutilmoqda/Qabul qilingan/...) - O'lik checkout.tsx + payment-methods.tsx olib tashlandi (free-model, hech qayerdan chaqirilmaydi) - Katalog kartasida hotel kategoriya + meal-plan badge (codex paket maydonlari)
- Backend: User.expoPushToken + migration, push.service (Expo Push API, fire-and-forget), POST /auth/push-token, agency+admin booking status -> push (token bo'lsa) - Mobile: getExpoPushToken (FCM, guarded), _layout'da kirgan userni ro'yxatdan o'tkazish, authAPI.savePushToken - google-services.json app.json'ga ulandi (gitignore'da maxfiy)
…device token - push.service: Expo Push o'rniga to'g'ridan-to'g'ri FCM HTTP v1 (service account -> OAuth2 access token, keshlangan). Dashboard/EAS cred kerak emas. - mobile: getDevicePushTokenAsync (native FCM token) - auth: push token validatsiyasi yumshatildi (FCM token formati)
- yangi (tabs)/tours.tsx: agentlik turlari marketplace (alohida tab) - (tabs)/_layout: 5 tab (Home, Turlar, Reja, Explore, Profil), planner ikonkasi sparkles - planner.tsx: segment + agentlik turlari + FAB menyu olib tashlandi -> faqat AI builder. Ustma-ust UI (segment kartalar hero ustiga bosib turardi) tuzatildi. Header'ga 'Rejalarim' tugmasi (-> /my-plans) - home: turlar endi agencyOnly:true (hamma joyda izchil agentlik turlari) - i18n: tabs.tours qo'shildi (uz/ru/en)
…I cities - yangi claudePlanner.service: POI/destination ma'lumoti bo'lmagan (outbound) shaharlar uchun noldan to'liq kun-marshrut yaratadi. Structured JSON output (output_config.format), model env orqali (default claude-opus-4-8), SDK lazy-require. - planner.service: base plan bo'sh (kunlarda activity yo'q) bo'lsa Claude generatorini ishlatadi, aks holda mavjud POI+Gemini yo'li. - ANTHROPIC_API_KEY o'rnatilmasa xato bermaydi (null qaytaradi).
…vy/aqua - palette.ts: dark va light "Minimal Green" (#051F20/#0B2B26/#163832/#235347/#8EB69B/#DAF1DE) - token'ni chetlab o'tgan qattiq-kodlangan ko'k/aqua ranglar yashilga: AuroraBackground, BudgetBreakdownChart, splash/loading fon, confetti, xarita markerlar, achievement/notification accent
… dark - default tema light (oq fon) - 'tunt'/xira ko'rinishni hal qiladi - light: toza oq surface (#FFFFFF) faint mint fon ustida, jonli emerald #059669/#10B981, yuqori kontrast matn (#0B231A) - dark: surfacelar aniq ajraladi (bg<surface<card), jonli emerald accent - endi xira emas
…with Claude) - aiItinerary.js: provider-agnostik prompt + JSON schema + plan mapper - geminiPlanner: generateTripPlanWithGemini (noldan to'liq kun-marshrut, responseJsonSchema) - claudePlanner: umumiy modulга refactor - planner.service: base bo'sh bo'lsa avval Gemini, keyin Claude generatori Jonli test: integratsiya ishlaydi, lekin prod GEMINI_API_KEY muddati o'tgan (yangilash kerak).
gemini-2.5-flash thinkingConfig.thinkingBudget=0 (tezlashtirish) va generatsiya timeout 50s. Jonli test: Dubay 3 kun ~11s, real joy nomlari bilan.
…ile) - 5 top bardan burger (menu) icon olib tashlandi (Home/Explore/Planner/Tours/Rejalarim), muvozanat uchun spacer - app/side-menu.tsx o'chirildi + Stack.Screen registratsiyasi olindi - StitchMobile fallback router.back() ga o'zgartirildi - side-menu havolalari (Wishlist/Sozlamalar/Aksiyalar/Yordam) Profil tabida allaqachon bor
… empty) - keshdan darrov ko'rsatadi (agency_tours_cache_v1) - har tab ochilganda qayta yuklaydi (mount-once emas -> tasdiqlangan tur kech qo'shilsa ham chiqadi) - bo'sh/xato javobda keshdagi ro'yxatni o'chirmaydi Server tekshirildi: /home + /home/tours(agencyOnly) ikkalasi 2 Guli_travel turini qaytaradi (izchil).
…ove booking form - launch/onboarding: Home'dan oldin login ekrani (token bo'lmasa), majburiy emas - login/register'da 'Hozircha o'tkazib yuborish' bor - tour-details: authsiz bron qilib bo'lmaydi (login'ga yo'naltiradi) - 'ro'yxatdan o'tish shart emas...' tushuntirish matni olib tashlandi - pastki booking formasi (ism/email/telefon/sana/xabar) olib tashlandi - kirgan foydalanuvchi bir tugma bilan profil ma'lumoti orqali so'rov yuboradi
…bo'yicha filter) - Turlar tab'ida davlat tanlash dropdown (modal ro'yxat) + Qidirish btn - bosilganda turlarni davlat kalit-so'zlari bo'yicha klient tomonda filtrlaydi (title+city+destinationCountry+subtitle) - topilmasa tegishli bo'sh holat
… hotel/avia checkboxes, price-basis people, price-lock countdown, discount) Backend: +days, flightIncluded, discount, priceBasisPeople, priceLockMinutes, priceLockUntil (Prisma + migration + schema + controller priceLockUntil compute + formatTour mapper) Website TourEditor: qayerdan/qayerga dropdownlar, kecha+kunduz, mehmonxona/avia checkbox, xona turi (uz + Moslashuvchan), chegirma+bola siyosati, narx-bazasi (1/2/boshqa+kishi soni), narx kafolati (Ha/Yo'q + daqiqa), narxga-kiradi auto(hotel/avia)+qo'shimcha; min narx/joylar holati/narxga-kirmaydi olib tashlandi Mobile: tour-details kecha/kunduz, avia kiritilgan/alohida, chegirma, narx kafolati orqaga-sanovchi; narxga-kirmaydi olib tashlandi
- jwt.js/agencyJwt.js: prod'da JWT_SECRET/AGENCY_JWT_SECRET majburiy (env yo'q bo'lsa throw) — ma'lum zaxira sir bilan token soxtalashtirish xavfini yopadi - PlannerFlowScreens: ishlatilmaydigan AVAILABILITY_LABELS/FLIGHT_LABELS/priceExcludes olib tashlandi
…tive orbs + redundant progress bar Product register: minimalizm + dekorativ blob taqiqi. 4 ta ortiqcha progress ko'rsatkichi -> stepRail (tappable) yagona qoldi. anim/progress dead logic + 4 unused style tozalandi.
…ing English on EN-locale devices detectLanguage() endi doim 'uz' qaytaradi (qurilma tili emas). Saqlangan til _layout boshida tiklanadi. Sign in/Email/Password/Register/Skip... endi o'zbekcha.
…nly) Onboarding eski qurilmada 'en' saqlagan -> _layout uni tiklab inglizcha qilardi. Endi uz-only: boot'da doim uz'ga qaytaradi va saqlaydi.
- USER register + Google-auth: agentlik (verified) emaili foydalanuvchi yarata olmaydi - AGENCY register: foydalanuvchi emaili agentlik yarata olmaydi - dublikat (bir jadval ichida) avvaldan bloklangan Jonli test: agency->user 409, user->agency 409, dublikat 409
…pool register() awaited the Gmail SMTP send, so responses took 2-13s (one prod request measured 12585ms) and often exceeded the mobile 15s axios timeout — the spinner hung and the code sometimes never arrived. Now issueAuthCode fires the email send fire-and-forget after persisting the code, returning immediately (prod register 12585ms -> 241ms). Also added SMTP connection/greeting/socket timeouts + connection pooling so a slow SMTP server can never hang a request. Affects register, forgot-password, resend-verification, email-change and account-delete flows. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
issueAgencyCode awaited the Gmail SMTP send (2-13s), so agency register / email-change risked the website agency-proxy 15s timeout (504) and hung the UI. Now the email is sent fire-and-forget after the code row is persisted, returning immediately (prod agency register 361ms). Same fix as the mobile user flow in issueAuthCode. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Translate landing (Navbar, Hero, HowItWorks, Footer, Destinations,
AppPreview) + page/layout metadata to Uzbek; nav "Turlar" now links to a
real /tours page instead of an anchor.
- Add /tours: server-rendered browse page showing agency tours + popular
places (mobile-app-like), open to all. Booking ("Bron qilish") routes to
/account which gates auth, so active actions require login.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /tours: client ToursBrowser with "Qayerga" country chips (same 12-country set + keyword matching as the mobile app) + search box. Filters on title/city/destinationCountry/subtitle/agency, so the agency form's DESTINATION_OPTIONS (already aligned) drive correct filtering. Added destinationCountry to LandingTour type; tours fetch bumped to 60, places 24. - Admin: translate remaining English (Boshqaruv, Tasdiqlash/Rad etish/Yakunlash, section eyebrows, placeholders) to Uzbek for portal consistency. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ner on web User web account now mirrors mobile actions (same backend, already synced): - Edit profile (name/lastName/bio) via PUT /auth/profile. - Edit travel style + interests via PUT /auth/preferences. - Remove wishlist items (DELETE /wishlist/:id). - Generate a new AI itinerary (POST /planner/generate) and save it (POST /trips) — appears under "Mening safarlarim", synced to mobile. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Birlashtirilgan va lokal to'liq test qilingan integratsiya branch'i.
Tarkib
Test (lokal)
origin/main (245612d) ajdod — fast-forward, yo'qotishsiz.