Skip to content

Commit d957621

Browse files
committed
refactor(auth): Revamp account linking flow
- Use nested routes for linking - Improve redirection logic - Remove query parameter context
1 parent c261e71 commit d957621

File tree

5 files changed

+59
-28
lines changed

5 files changed

+59
-28
lines changed

lib/authentication/view/authentication_page.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,9 @@ class AuthenticationPage extends StatelessWidget {
132132
? null
133133
: () {
134134
context.goNamed(
135-
Routes.requestCodeName,
136-
queryParameters: isLinkingContext
137-
? {'context': 'linking'}
138-
: const {},
135+
isLinkingContext
136+
? Routes.linkingRequestCodeName
137+
: Routes.requestCodeName,
139138
);
140139
},
141140
label: Text(l10n.authenticationEmailSignInButton),

lib/authentication/view/request_code_page.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ class _RequestCodeView extends StatelessWidget {
8585
} else if (state is AuthenticationCodeSentSuccess) {
8686
// Navigate to the code verification page on success, passing the email
8787
context.goNamed(
88-
Routes.verifyCodeName,
88+
isLinkingContext
89+
? Routes.linkingVerifyCodeName
90+
: Routes.verifyCodeName,
8991
pathParameters: {'email': state.email},
90-
queryParameters:
91-
isLinkingContext ? {'context': 'linking'} : const {},
9292
);
9393
}
9494
},

lib/router/router.dart

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,24 @@ GoRouter createRouter({
135135
appStatus == AppStatus.authenticated) {
136136
print(' Redirect Decision: User is $appStatus.');
137137

138-
final isLinkingContext =
139-
state.uri.queryParameters['context'] == 'linking';
138+
final isLinkingContextQueryPresent = state.uri.queryParameters['context'] == 'linking';
139+
final isLinkingPathSegmentPresent = currentLocation.contains('/linking/');
140+
141+
// Determine if the current location is part of any linking flow (either via query or path segment)
142+
final isAnyLinkingContext = isLinkingContextQueryPresent || isLinkingPathSegmentPresent;
140143

141144
// If an authenticated/anonymous user is on any authentication-related path:
142145
if (currentLocation.startsWith(authenticationPath)) {
143-
// Allow navigation within auth paths if the linking context is active
144-
if (isLinkingContext) {
146+
print(' Debug: Auth path detected. Current Location: $currentLocation');
147+
print(' Debug: URI Query Parameters: ${state.uri.queryParameters}');
148+
print(' Debug: isLinkingContextQueryPresent: $isLinkingContextQueryPresent');
149+
print(' Debug: isLinkingPathSegmentPresent: $isLinkingPathSegmentPresent');
150+
print(' Debug: isAnyLinkingContext evaluated to: $isAnyLinkingContext');
151+
152+
// Allow navigation within auth paths if any linking context is active
153+
if (isAnyLinkingContext) {
145154
print(
146-
' Action: $appStatus user on auth path ($currentLocation) with linking context. Allowing navigation.',
155+
' Action: $appStatus user on auth linking path ($currentLocation). Allowing navigation.',
147156
);
148157
return null;
149158
} else {
@@ -207,24 +216,41 @@ GoRouter createRouter({
207216
);
208217
},
209218
routes: [
219+
// Nested route for account linking flow (defined first for priority)
210220
GoRoute(
211-
path: Routes.requestCode, // Use new path
212-
name: Routes.requestCodeName, // Use new name
213-
builder: (context, state) {
214-
// Extract the linking context flag from 'extra', default to false.
215-
final isLinking = (state.extra as bool?) ?? false;
216-
return RequestCodePage(isLinkingContext: isLinking);
217-
},
221+
path: Routes.accountLinking, // This is 'linking'
222+
name: Routes.accountLinkingName, // Name for the linking segment
223+
builder: (context, state) => const SizedBox.shrink(), // Placeholder
224+
routes: [
225+
GoRoute(
226+
path: Routes.requestCode, // Path: /authentication/linking/request-code
227+
name: Routes.linkingRequestCodeName,
228+
builder: (context, state) =>
229+
const RequestCodePage(isLinkingContext: true),
230+
),
231+
GoRoute(
232+
path: '${Routes.verifyCode}/:email', // Path: /authentication/linking/verify-code/:email
233+
name: Routes.linkingVerifyCodeName,
234+
builder: (context, state) {
235+
final email = state.pathParameters['email']!;
236+
return EmailCodeVerificationPage(email: email);
237+
},
238+
),
239+
],
240+
),
241+
// Non-linking authentication routes (defined after linking routes)
242+
GoRoute(
243+
path: Routes.requestCode,
244+
name: Routes.requestCodeName,
245+
builder: (context, state) =>
246+
const RequestCodePage(isLinkingContext: false),
218247
),
219248
GoRoute(
220-
path:
221-
'${Routes.verifyCode}/:email', // Use new path with email parameter
222-
name: Routes.verifyCodeName, // Use new name
249+
path: '${Routes.verifyCode}/:email',
250+
name: Routes.verifyCodeName,
223251
builder: (context, state) {
224-
final email = state.pathParameters['email']!; // Extract email
225-
return EmailCodeVerificationPage(
226-
email: email,
227-
); // Use renamed page
252+
final email = state.pathParameters['email']!;
253+
return EmailCodeVerificationPage(email: email);
228254
},
229255
),
230256
],

lib/router/routes.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ abstract final class Routes {
5858
static const verifyCode = 'verify-code';
5959
static const verifyCodeName = 'verifyCode';
6060

61+
// Linking-specific authentication routes
62+
static const linkingRequestCode = 'linking/request-code';
63+
static const linkingRequestCodeName = 'linkingRequestCode';
64+
static const linkingVerifyCode = 'linking/verify-code';
65+
static const linkingVerifyCodeName = 'linkingVerifyCode';
66+
6167
// --- Settings Sub-Routes (relative to /account/settings) ---
6268
static const settingsAppearance = 'appearance';
6369
static const settingsAppearanceName = 'settingsAppearance';

pubspec.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,10 +1082,10 @@ packages:
10821082
dependency: transitive
10831083
description:
10841084
name: watcher
1085-
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
1085+
sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
10861086
url: "https://pub.dev"
10871087
source: hosted
1088-
version: "1.1.1"
1088+
version: "1.1.2"
10891089
web:
10901090
dependency: transitive
10911091
description:

0 commit comments

Comments
 (0)