VivahaPlan – Wedding Planning Platform
VivahaPlan is a full-stack wedding planning platform designed to help couples and families manage every aspect of their wedding—from guest lists to vendor searches to pre-wedding trip planning. Here's how I built and continuously improved the platform over the past 75+ hours of development.
Here are the new updates and features I've added:
Interactive Tutorial System
One of the biggest challenges for new users was understanding all the dashboard features. To solve this, I implemented an 11-step interactive tutorial that guides users through each section.
- Keyboard navigation: Used event listeners to detect left/right arrow keys for step navigation and ESC to exit. Implemented with
useEffecthooks to add and clean up event listeners properly. - Progress tracking: Built a dot indicator system using array mapping and conditional styling based on current step index.
- Modal positioning: Centered the tutorial modal using flexbox with
justify-content: centerandalign-items: center, added scrolling support for smaller viewports. - State management: Stored tutorial state in React context to persist progress across page navigation within the dashboard.
Drag-and-Drop Navigation Customization
Users wanted control over which navigation items appeared in their sidebar. I built a full drag-and-drop system with database persistence.
- DnD Kit integration: Used
@dnd-kit/coreand@dnd-kit/sortablelibraries to implement smooth drag interactions. Set upDndContextwith sensors for mouse and touch. - Backend API: Created
/api/navigation/preferencesendpoint that accepts PUT requests with the new navigation order. Updated MongoDB user schema to includenavigationPreferencesfield as an array of objects. - Visibility toggles: Implemented show/hide functionality with Eye/EyeOff icons using Lucide React. Updated state locally, then batch-saved all changes on "Save" button click.
- Optimistic updates: UI updates immediately on drag, with loading state during API call. Rollback mechanism if save fails.
Shareable Wedding Information
Couples needed a way to share wedding details with guests without requiring them to create accounts. I built a secure token-based sharing system.
- Token generation: Backend generates unique tokens using
crypto.randomBytes(32).toString('hex')and stores them in a separateshareTokenscollection with wedding ID reference. - Public route: Created
/wedding/{token}route that bypasses authentication middleware. Validates token, fetches associated wedding data, and renders public-facing page. - Copy to clipboard: Used
navigator.clipboard.writeText()API with success feedback toast. Fallback for older browsers usingdocument.execCommand('copy'). - Auto-update notice: Added timestamp tracking to show guests when information was last updated, queried from database using
updatedAtfield.
Location-Based Hotel Block Search
Implemented a hotel search feature that uses browser geolocation to find nearby hotels with wedding discounts.
- Geolocation API: Used
navigator.geolocation.getCurrentPosition()to get user coordinates. Error handling for permission denials with fallback to wedding venue location. - Hotel data structure: Created mock hotel data with properties: name, distance, price, originalPrice, discount, rating, amenities, phone, bookingUrl.
- Tel links: Implemented clickable phone numbers with
<a href="tel:+1234567890">for mobile users. - External booking integration: "Book Block" buttons link to partner booking sites (Marriott, Hilton, Booking.com) with query parameters for wedding groups.
Bachelor/Bachelorette Trip Planning
Enhanced the pre-wedding trip planner with transport mode switching and dynamic budget calculations.
- Transport mode state: Used React
useStateto toggle between flight and drive modes. Conditional rendering to show/hide relevant inputs. - "Flying from" input: Added origin airport selector using Autocomplete component with IATA airport codes.
- Budget breakdown: Hidden by default, appears only after user clicks "Generate Total Estimate". Calculates totals by mapping over selected activities and accommodations.
- Mode switching: "Changed your mind?" button clears current selections and switches mode with smooth transition animation.
Backend Architecture
- MongoDB models: User model with
navigationPreferencesarray, Wedding model with embedded guest arrays, ShareToken model with expiration timestamps. - API middleware: Authentication middleware checks JWT tokens from cookies, public route middleware bypasses auth for share links.
- Error handling: Centralized error handler catches async errors, returns consistent JSON responses with status codes.
- TypeScript typing: Strong types for all API request/response bodies, database models, and React component props.
UI/UX Polish
- Removed cluttered "Download Backup" and file upload buttons from dashboard header for cleaner interface
- Changed vendor count text to white for better visibility against gradient backgrounds
- Fixed Overview page element sizing—reduced oversized headings from text-4xl to text-2xl, icons from w-16 to w-10
- Added validation to Budget Tracker to prevent empty category names using
trim()and length checks - Improved color contrast throughout with WCAG AA compliance testing