CHANGELOG.md
Changelog
All notable changes to RentNGo are documented here.
[Unreleased]
Added
Bilingual blog support: blogs now have separate Romanian and English content
- Schema:
title_ro/en,description_ro/en,content_ro/en,readingTime_ro/en - Public queries accept
localearg, return locale-resolved fields - Admin queries return both language variants for editing
- Admin create/edit dialogs have RO/EN content tabs
- Preview tab has locale toggle
- Static generation and sitemap work with locale-aware queries
- Migration script:
npx convex run migrations/bilingualBlogs
- Schema:
SEO overhaul: comprehensive SEO improvements following Next.js best practices
- Created shared
buildMetadata()helper (lib/metadata.ts) eliminating duplicated metadata across all pages - Added
jsonLdScriptContent()utility with XSS escaping for all JSON-LD structured data - Dynamic
<html lang>attribute based on locale (was hardcoded to "ro") - Added
x-defaulthreflang to all page alternates - Moved JSON-LD structured data from client components to server-rendered layouts (transfers, contact, about)
- Added
generateStaticParamsfor car detail and blog detail pages - Added breadcrumb JSON-LD schema for car detail pages
- Added
noindexmetadata for transactional pages (reservation, profile) - Fixed blog
keywordstype (was string, now string[])
- Created shared
Barrel import optimization: Added
optimizePackageImportsto next.config.ts- Configured for
lucide-react(80 files) anddate-fns(8 files) - Reduces cold start by 200-800ms, speeds up dev server boot
- Automatically transforms barrel imports to direct imports at build time
- Configured for
Dynamic import admin dialogs: Converted 10 admin dialogs to lazy-load with
next/dynamic- CreateVehicleDialog, EditVehicleDialog
- CreateBlogDialog, EditBlogDialog
- CreateReservationDialog, EditReservationDialog, ReservationEmailDialog
- CreateSeasonDialog, EditSeasonDialog
- TransferPricingDialog, CreateClassDialog
- Dialogs now load on-demand when opened, reducing initial page bundle
Memoize expensive components: Applied React.memo() and useMemo() optimizations
- Components wrapped with React.memo(): VehicleCard, TransferVehicleCard, BlogCard, FilterCheckboxItem, VehiclePricingCard, TransferBookingFloatingCard
- Calculations memoized with useMemo(): pricing tip in VehiclePricingCard, vehicle grouping in VehicleListDisplay, reservation pricing hook, pagination in UserReservationsTable, featured vehicles hook
- Prevents unnecessary re-renders in list-rendered components and expensive calculations
Planned
- Copy & content review across all translations
- React performance optimization (dynamic imports, memoization, lazy state init)
[2.3.0] - 2026-01-20
Added
- Transfer vehicle seats configuration: Added
transferSeatsfield for accurate passenger capacity filtering- New
transferSeatsfield on vehicles schema (optional number) - Field only visible in admin when "Is Transfer Vehicle" is checked
- Filtering logic: uses
transferSeatsif set, otherwise falls back toseats - 2 - Transfer vehicle cards and emails show
transferSeats ?? seats - Admin dialogs show regular seats value as placeholder for reference
- New
Changed
- Transfer vehicle filtering now uses effective capacity (
transferSeats ?? (seats - 2)) instead of adding +2 buffer - Transfer confirmation emails pass effective seats for vehicle info section
- Transfer vehicle list component now passes
transferSeatsto vehicle cards
Fixed
- Removed cursor-pointer from terms acceptance text on transfer booking page (only checkbox and links are clickable)
[2.2.0] - 2026-01-20
Added
- Transfer booking Terms & Privacy links: Added links to Terms & Conditions and Privacy Policy
- Links open in new tab with proper
rel="noopener noreferrer" - Locale-based translations (Romanian/English)
- Styling matches the reservation page implementation
- Added border-top separator for visual distinction from payment methods
- Links open in new tab with proper
[2.1.0] - 2026-01-20
Added
- Transfer email vehicle details: Added full vehicle information to transfer confirmation emails
- Extended
TransferVehicleInfotype with type, seats, transmission, fuelType - Reused
VehicleInfoSectioncomponent from reservation emails - Both user and admin transfer emails now display vehicle details
- Includes Romanian and English translations for vehicle section labels
- Extended
[2.0.0] - 2026-01-20
Added
- Vehicle class transfer multiplier UI: Admin can now edit transfer multiplier per class
- Added "Transfer Pricing" section to class detail page (
/admin/vehicles/classes/[classId]) - Includes Base Fare and Rate Multiplier fields with inline editing
- Separated pricing settings into "Rental Pricing" and "Transfer Pricing" sections
- Added "Transfer Pricing" section to class detail page (
Changed
- Class detail page pricing UI reorganized for better clarity
- "Rental Pricing" section: Extra 50km Price
- "Transfer Pricing" section: Base Fare, Rate Multiplier
[1.9.0] - 2026-01-20
Added
- Vehicle slug URLs: SEO-friendly car detail page URLs
- Added
slugfield to vehicles schema with unique index - Car detail pages now use
/cars/[slug]instead of/cars/[id] - Admin dialogs include slug input with auto-generate button (sparkle icon)
- Slug format:
{make}-{model}-{year}(e.g.,bmw-x5-2024) - Added
getBySlugquery with uniqueness validation - Added
generateVehicleSlug()andvalidateVehicleSlug()utilities
- Added
Changed
- Vehicle cards now link to slug-based URLs (falls back to
_idfor backwards compatibility) - Reservation page back button uses slug-based URL
- Sitemap generates slug-based URLs for vehicles
[1.8.1] - 2026-01-20
Removed
- Email components consolidation: Removed unused legacy email system
- Deleted
components/shared/email/directory (10 files) - legacy code from before Convex migration - Deleted deprecated
/api/send/request-confirmationroute (only consumer of shared/email) - Production email system lives in
convex/emails/(self-contained with 4 templates and 8 components) - Kept
/api/send/reservation-emailroute (used by admin for manual resends, has inline HTML)
- Deleted
[1.8.0] - 2026-01-20
Changed
- Component directory restructuring: Reorganized ~130 components from type-based to feature-based structure
- Created
shared/directory withauth/,search-filters/,providers/,navigation/ - Created
features/directory withvehicles/,reservations/,transfers/,blog/,landing/ - Reorganized
admin/into resource-based subdirectories:vehicles/,reservations/,transfers/,vehicle-classes/,seasons/,blog/ - Moved 14 scattered top-level components to proper locations
- Added barrel exports (index.ts) for cleaner imports
- Updated all import paths across the codebase
- Created
[1.7.0] - 2026-01-19
Removed
paymentstable from schema (never implemented)vehicles.classfield (replaced byclassId)vehicles.pricePerDayfield (replaced bypricingTiers)by_classindex from vehicles tablehooks/useSeasonalPricing.ts(replaced byuseDateBasedSeasonalPricing)VehicleClasstype export fromtypes/vehicle.ts- ~20 lines of TODO comments from
convex/reservations.ts - Legacy
pricePerDayfallbacks from pricing utilities
Added
convex/migrations/clearDeprecatedClassField.ts- Migration to clear deprecated class fieldconvex/migrations/clearDeprecatedPricePerDay.ts- Migration to clear deprecated pricePerDay field
Changed
- Admin vehicle dialogs now use
useDateBasedSeasonalPricinghook vehicles-table.tsxnow looks up class name viaclassIdreference- Pricing logic in
types/vehicle.tsnow requirespricingTiers(no fallback) - Transfer page titles: removed "VIP" keyword from translations (en/ro)
[1.6.0] - 2026-01-19
Removed
- 19 unused component files (~2,500 lines of code):
- Vehicle:
edit-vehicle-form,create-vehicle-form,vehicle-image-carrousel(typo), 4 skeletons - UI (shadcn):
input-otp,navigation-menu,display-cards,slideshow,collapsible,drawer,progressive-blur - Admin:
team-switcher,nav-projects - Top-level:
location-search-input,rental-details-skeleton,login-form
- Vehicle:
Changed
- Updated
components/vehicle/index.tsto remove stale exports
[1.5.0] - 2026-01-19
Added
- Sticky glassmorphic booking card on transfer vehicle selection page
- Card uses CSS
position: stickyto stay at bottom while scrolling TransferBookingFloatingCardcomponent with glass effect stylingonVehiclesLoadedcallback toTransferVehicleListcomponent
Changed
- Transfer vehicle selection page uses full-width vehicle grid
- Continue button always visible via sticky card at bottom of container
[1.4.0] - 2026-01-19
Changed
- Renamed admin vehicle classes section from "ordering" to "classes"
- Button: "Manage Ordering" → "Manage Classes"
- Page title: "Class Ordering" → "Vehicle Classes"
- URL:
/admin/vehicles/ordering→/admin/vehicles/classes
[1.3.0] - 2026-01-19
Added
- Tiered transfer pricing system with admin-configurable km ranges
- Transfer base fare per vehicle class
- Transfer pricing tiers management in admin panel
Changed
- Transfer pricing now uses:
base_fare + (extra_km × tier_price × class_multiplier) - Simplified client-facing transfer pricing display (distance + total only)
[1.2.0] - 2026-01-18
Added
- Sequential calendar flow: return date calendar auto-opens after selecting pickup date
Changed
- Applied sequential calendar behavior to all reservation pages
[1.1.0] - 2026-01-18
Changed
- Default pickup and return time set to 10:00
[1.0.0] - 2026-01-18
Added
- Initial PRD documentation
- Vehicle reservations with tiered pricing
- VIP transfer booking with Mapbox integration
- Seasonal pricing system
- Admin dashboard for vehicles, reservations, transfers, seasons, blogs
- Email notifications via Resend
- Romanian and English language support