Goal
Create all files for the applicant dashboard branching logic and post-acceptance RSVP flow. No real logic yet, stubs only.
The shared (applicant)/layout.tsx is created by auth ticket This ticket only adds dashboard and rsvp pages inside it.
Folders to create
Files to create
Routes
Library
Components
Acceptance criteria
Goal
Create all files for the applicant dashboard branching logic and post-acceptance RSVP flow. No real logic yet, stubs only.
The shared
(applicant)/layout.tsxis created by auth ticket This ticket only adds dashboard and rsvp pages inside it.Folders to create
src/app/(applicant)/dashboard/src/app/(applicant)/rsvp/src/app/api/v1/status/src/app/api/v1/post-acceptance/src/lib/status/src/components/dashboard/Files to create
Routes
src/app/(applicant)/dashboard/page.tsx— routes user to correct branch component based on statussrc/app/(applicant)/rsvp/page.tsx— post-acceptance RSVP form, gated bydecisionStatus+confirm-bysrc/app/api/v1/status/route.ts—GETapplicant status;POSTis a no-op for nowsrc/app/api/v1/post-acceptance/route.ts—POSTRSVP responses; stub returns 501Library
src/lib/status/machine.ts— pure function:(user, dates, showDecision) → DashboardBranchsrc/lib/status/service.ts—getApplicantStatus(userId),saveRsvp(userId, payload)src/lib/status/types.ts—DashboardBranch,ApplicantStatus,DecisionStatus,RsvpStatus,RsvpPayloadtypessrc/lib/status/mock-singletons.ts— local mocks forconfirm-by/show-decisionComponents
src/components/dashboard/PreRegistrationView.tsx— pre-open state, "Applications open soon"src/components/dashboard/InProgressView.tsx— draft saved, link to continue applicationsrc/components/dashboard/SubmittedView.tsx— "We received your application" confirmationsrc/components/dashboard/AdmittedView.tsx— acceptance message + RSVP CTAsrc/components/dashboard/WaitlistedView.tsx— waitlist messagesrc/components/dashboard/DeclinedView.tsx— declined messagesrc/components/dashboard/RsvpForm.tsx— post-acceptance question form (RHF)src/components/dashboard/ConfirmByCountdown.tsx— deadline display, disables RSVP afterconfirm-byAcceptance criteria
/dashboardrenders one of the branch placeholder views.GET /statusreturns a typed mock; all other handlers return 501.