@@ -14,6 +14,8 @@ export default function LoginPage() {
1414 const [ errorMessage , setErrorMessage ] = useState < string | null > ( null ) ;
1515 const [ isLoading , setIsLoading ] = useState ( true ) ;
1616 const [ isMobile , setIsMobile ] = useState ( false ) ;
17+ const [ redirectTo , setRedirectTo ] = useState < string > ( "/" ) ;
18+
1719
1820 useEffect ( ( ) => {
1921 setIsMobile ( isMobileDevice ( ) ) ;
@@ -24,6 +26,7 @@ export default function LoginPage() {
2426 if ( typeof window === 'undefined' ) return ;
2527
2628 const params = new URLSearchParams ( window . location . search ) ;
29+ const redirect = params . get ( "redirect" ) ;
2730 const ename = params . get ( 'ename' ) ;
2831 const session = params . get ( 'session' ) ;
2932 const signature = params . get ( 'signature' ) ;
@@ -32,12 +35,17 @@ export default function LoginPage() {
3235 if ( ename && session && signature ) {
3336 // Clean up URL
3437 window . history . replaceState ( { } , '' , window . location . pathname ) ;
35-
38+
3639 // Auto-submit login
3740 handleAutoLogin ( ename , session , signature , appVersion || '0.4.0' ) ;
3841 return ;
3942 }
4043
44+ if ( redirect && redirect . startsWith ( "/" ) && ! redirect . startsWith ( "//" ) ) {
45+ setRedirectTo ( redirect ) ;
46+ sessionStorage . setItem ( "postLoginRedirect" , redirect ) ;
47+ }
48+
4149 // If no query params, proceed with normal flow
4250 const fetchQRCode = async ( ) => {
4351 try {
@@ -84,7 +92,11 @@ export default function LoginPage() {
8492 if ( data . token && data . user ) {
8593 setAuthToken ( data . token ) ;
8694 setAuthId ( data . user . id ) ;
87- window . location . href = "/" ;
95+ const redirect =
96+ sessionStorage . getItem ( "postLoginRedirect" ) || redirectTo || "/" ;
97+
98+ sessionStorage . removeItem ( "postLoginRedirect" ) ;
99+ window . location . href = redirect ;
88100 }
89101 } else {
90102 const errorData = await response . json ( ) ;
@@ -110,7 +122,7 @@ export default function LoginPage() {
110122 eventSource . onmessage = ( event ) => {
111123 try {
112124 const data = JSON . parse ( event . data ) ;
113-
125+
114126 // Check for error messages (version mismatch)
115127 if ( data . error && data . type === 'version_mismatch' ) {
116128 setErrorMessage ( data . message || 'Your eID Wallet app version is outdated. Please update to continue.' ) ;
@@ -122,7 +134,11 @@ export default function LoginPage() {
122134 if ( data . token && data . user ) {
123135 setAuthToken ( data . token ) ;
124136 setAuthId ( data . user . id ) ;
125- window . location . href = "/" ;
137+ const redirect =
138+ sessionStorage . getItem ( "postLoginRedirect" ) || redirectTo || "/" ;
139+
140+ sessionStorage . removeItem ( "postLoginRedirect" ) ;
141+ window . location . href = redirect ;
126142 }
127143 } catch ( error ) {
128144 console . error ( "Error parsing SSE data:" , error ) ;
@@ -134,7 +150,7 @@ export default function LoginPage() {
134150 } ;
135151
136152 return ( ) => eventSource . close ( ) ;
137- } , [ sessionId , login ] ) ;
153+ } , [ sessionId , login , redirectTo ] ) ;
138154
139155 const getAppStoreLink = ( ) => {
140156 if ( typeof navigator === 'undefined' ) return "https://play.google.com/store/apps/details?id=foundation.metastate.eid_wallet" ;
@@ -170,7 +186,7 @@ export default function LoginPage() {
170186 < div className = "text-lg sm:text-xl space-x-1" >
171187 { isMobile ? (
172188 < >
173- < span > Click the button below using your </ span >
189+ < span > Click the button below using you </ span >
174190 < a href = { getAppStoreLink ( ) } > < span className = "font-bold underline" > eID App</ span > </ a >
175191 < span > to login</ span >
176192 </ >
@@ -184,7 +200,7 @@ export default function LoginPage() {
184200 </ div >
185201
186202 { error && < div className = "w-full text-red-500" > { error } </ div > }
187-
203+
188204 { errorMessage && (
189205 < div className = "w-full mb-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg" >
190206 < p className = "font-semibold" > Authentication Error</ p >
0 commit comments