Shuffle/app/lib/features/auth/presentation/auth_routes.dart
cschlaefke 87c0d7d1ec feat(auth): add password reset (forgot password, recovery link, new password)
ForgotPasswordScreen with neutral reaction (F12), CheckEmail reset mode on
its own path, recovery link handling and ResetPasswordScreen with the
recovery guard held until the user confirms the success message. Carries
the from parameter between login, register and forgot password. Removes
the route placeholders.

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 09:47:03 +01:00

60 lines
2.2 KiB
Dart

import 'package:go_router/go_router.dart';
import 'package:shuffle/core/routing/app_routes.dart';
import 'package:shuffle/features/auth/presentation/check_email/check_email_screen.dart';
import 'package:shuffle/features/auth/presentation/email_link/email_link_screen.dart';
import 'package:shuffle/features/auth/presentation/forgot_password/forgot_password_screen.dart';
import 'package:shuffle/features/auth/presentation/login/login_screen.dart';
import 'package:shuffle/features/auth/presentation/register/register_screen.dart';
import 'package:shuffle/features/auth/presentation/reset_password/reset_password_screen.dart';
/// Routes of the auth pages (Spec #1 § 5.3).
final List<RouteBase> authRoutes = [
GoRoute(
path: AppRoutes.login,
builder: (context, state) =>
LoginScreen(from: state.uri.queryParameters[AppRoutes.fromParam]),
),
GoRoute(
path: AppRoutes.register,
builder: (context, state) =>
RegisterScreen(from: state.uri.queryParameters[AppRoutes.fromParam]),
routes: [
GoRoute(
path: 'check-email',
builder: (context, state) {
// The address travels as `extra`, never in the URL. go_router would
// persist `extra` in the browser history; the router's
// `VolatileExtraCodec` prevents that. After a web reload it is gone;
// the screen then asks for it.
final extra = state.extra;
return CheckEmailScreen(email: extra is String ? extra : null);
},
),
],
),
GoRoute(
path: AppRoutes.forgotPassword,
builder: (context, state) => ForgotPasswordScreen(
from: state.uri.queryParameters[AppRoutes.fromParam],
),
routes: [
GoRoute(
path: 'check-email',
// The mode is part of the path, so it survives a web reload.
builder: (context, state) =>
const CheckEmailScreen(mode: CheckEmailMode.reset),
),
],
),
GoRoute(
path: AppRoutes.authConfirm,
builder: (context, state) => EmailLinkScreen(
tokenHash: state.uri.queryParameters['token_hash'],
type: state.uri.queryParameters['type'],
),
),
GoRoute(
path: AppRoutes.resetPassword,
builder: (context, state) => const ResetPasswordScreen(),
),
];