Portal
Customer-facing portal for document submission, form filling, and appointment booking. Uses separate token-based Authentication (not session-based).
Architecture
Layer Location Routes backend/src/routes/portal/Service backend/src/services/portal-service.tsSub-services backend/src/services/portal/Auth middleware backend/src/middleware/portal-auth.tsAppointment auth backend/src/middleware/appointment-portal-auth.tsPages frontend/src/pages/portal/Components frontend/src/components/portal/ (23 files)Queries frontend/src/lib/queries/portalQueries.ts, portalAppointmentQueries.ts
Portal Pages
Page Purpose PortalDashboard Customer overview with pending tasks PortalFormPage Form wizard for customer data entry PortalAppointmentView Appointment booking and management PortalTokenErrorPage Token validation error handling
Key Components
Component Purpose PortalDocumentUploadModal Upload documents for Document Obtaining PortalDocumentTable / PortalDocumentCard Display document status DocumentChecklist Track required document submission progress PortalHelpChatDialog / PortalStickyChatbot In-portal help chat FormWizard/ Multi-step form rendering (see Form Builder ) PortalNotificationBell In-app Notifications PortalUploadZone Drag-and-drop file upload area
Features
Document upload — customers upload required Documents through a guided checklist
Form wizard — multi-step forms created with Form Builder , rendered for customer completion
Appointment booking — schedule and manage Appointments with renovation team
Help chat — contextual help via sticky chatbot
Notification bell — real-time portal Notifications
Authentication Flow
Portal tokens are issued per-project and sent to customers via email or SMS. The token grants scoped access to a specific project’s portal view, without requiring a full user account.