diff --git a/apps/edr-passenger-web/portal/src/app/booking/passengers/page.tsx b/apps/edr-passenger-web/portal/src/app/booking/passengers/page.tsx index d389bd9cb..34cf1fe5d 100644 --- a/apps/edr-passenger-web/portal/src/app/booking/passengers/page.tsx +++ b/apps/edr-passenger-web/portal/src/app/booking/passengers/page.tsx @@ -72,6 +72,36 @@ function clearPendingFaydaIndex() { window.sessionStorage.removeItem(FAYDA_PENDING_INDEX_KEY); } +// Verification is a full-page redirect out to Fayda and back (same flow on desktop and mobile — +// no popup). The in-progress form only lives in React memory, which the reload wipes, so we +// snapshot it to sessionStorage before leaving and restore it (in the form's defaultValues) on +// return. sessionStorage survives a same-tab navigation, including the cross-origin round trip. +const FAYDA_FORM_SNAPSHOT_KEY = 'edr_fayda_form_snapshot'; + +function saveFaydaFormSnapshot(snapshot: unknown) { + if (typeof window === 'undefined') return; + try { + window.sessionStorage.setItem(FAYDA_FORM_SNAPSHOT_KEY, JSON.stringify(snapshot)); + } catch { + // sessionStorage full/unavailable — verification still works, only unsaved fields are lost. + } +} + +function getFaydaFormSnapshot(): { passengers?: any[]; createAccount?: boolean } | null { + if (typeof window === 'undefined') return null; + try { + const raw = window.sessionStorage.getItem(FAYDA_FORM_SNAPSHOT_KEY); + return raw ? JSON.parse(raw) : null; + } catch { + return null; + } +} + +function clearFaydaFormSnapshot() { + if (typeof window === 'undefined') return; + window.sessionStorage.removeItem(FAYDA_FORM_SNAPSHOT_KEY); +} + // Fayda may return gender as "MALE"/"M" etc — normalize to the form's expected values function normalizeFaydaGender(raw: unknown): 'Male' | 'Female' | '' { const g = String(raw || '').trim().toUpperCase(); @@ -85,11 +115,13 @@ function DobPickerModal({ onChange, error, passengerType = 'ADULT', + disabled = false, }: { value: string; onChange: (iso: string) => void; error?: string; passengerType?: 'ADULT' | 'CHILD'; + disabled?: boolean; }) { const [open, setOpen] = useState(false); const [manualMode, setManualMode] = useState(false); @@ -286,9 +318,10 @@ function DobPickerModal({