From cee5e6c6d6483794b7200c7dbd15ff21351d405b Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Mon, 6 Oct 2025 15:39:08 +0330 Subject: [PATCH] Add forgot password, reset password, and verify OTP providers and view models - Implemented `ForgotPasswordViewModel`, `ResetPasswordViewModel`, and `VerifyOtpViewModel` for handling respective functionalities. - Created provider functions for lazy loading of these view models in the app. - Updated routing to utilize the new providers for managing state in the forgot password flow. - Refactored UI components to integrate with the new view models, ensuring proper state management and user feedback during operations. --- .../providers/forgot_password_provider.dart | 16 ++ .../providers/reset_password_provider.dart | 16 ++ lib/core/providers/verify_otp_provider.dart | 15 ++ lib/core/routes/app_routes.dart | 17 +- lib/core/routes/app_routes.g.dart | 21 +- lib/view_models/auth_view_model.dart | 206 +----------------- .../forgot_password_view_model.dart | 80 +++++++ .../reset_password_view_model.dart | 94 ++++++++ lib/view_models/verify_otp_view_model.dart | 94 ++++++++ .../pages/d_forget_password_create_page.dart | 26 ++- .../pages/forgot_password_create_screen.dart | 11 +- .../pages/m_forget_password_create_page.dart | 26 ++- .../pages/t_forget_password_create_page.dart | 26 ++- .../pages/d_forget_password_otp_page.dart | 27 ++- .../pages/forgot_password_otp_screen.dart | 11 +- .../pages/m_forget_password_otp_page.dart | 27 ++- .../pages/t_forget_password_otp_page.dart | 27 ++- .../pages/d_forgot_apssword_page.dart | 18 +- .../pages/m_forgot_password_page.dart | 18 +- .../pages/t_forgot_password_page.dart | 18 +- lib/views/profile/pages/d_profile_page.dart | 2 + lib/views/profile/pages/m_profile_page.dart | 2 + lib/views/profile/pages/t_profile_page.dart | 2 + 23 files changed, 490 insertions(+), 310 deletions(-) create mode 100644 lib/core/providers/forgot_password_provider.dart create mode 100644 lib/core/providers/reset_password_provider.dart create mode 100644 lib/core/providers/verify_otp_provider.dart create mode 100644 lib/view_models/forgot_password_view_model.dart create mode 100644 lib/view_models/reset_password_view_model.dart create mode 100644 lib/view_models/verify_otp_view_model.dart diff --git a/lib/core/providers/forgot_password_provider.dart b/lib/core/providers/forgot_password_provider.dart new file mode 100644 index 0000000..5881905 --- /dev/null +++ b/lib/core/providers/forgot_password_provider.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../data/repositories/auth_repository.dart'; +import '../../view_models/forgot_password_view_model.dart'; + +/// Lazy ForgotPasswordViewModel provider +Widget forgotPasswordProvider({required Widget child}) { + return ChangeNotifierProvider( + create: + (context) => ForgotPasswordViewModel( + authRepository: context.read(), + ), + child: child, + ); +} diff --git a/lib/core/providers/reset_password_provider.dart b/lib/core/providers/reset_password_provider.dart new file mode 100644 index 0000000..0e1792a --- /dev/null +++ b/lib/core/providers/reset_password_provider.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../data/repositories/auth_repository.dart'; +import '../../view_models/reset_password_view_model.dart'; + +/// Lazy ResetPasswordViewModel provider +Widget resetPasswordProvider({required Widget child}) { + return ChangeNotifierProvider( + create: + (context) => ResetPasswordViewModel( + authRepository: context.read(), + ), + child: child, + ); +} diff --git a/lib/core/providers/verify_otp_provider.dart b/lib/core/providers/verify_otp_provider.dart new file mode 100644 index 0000000..040b66c --- /dev/null +++ b/lib/core/providers/verify_otp_provider.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../data/repositories/auth_repository.dart'; +import '../../view_models/verify_otp_view_model.dart'; + +/// Lazy VerifyOtpViewModel provider +Widget verifyOtpProvider({required Widget child}) { + return ChangeNotifierProvider( + create: + (context) => + VerifyOtpViewModel(authRepository: context.read()), + child: child, + ); +} diff --git a/lib/core/routes/app_routes.dart b/lib/core/routes/app_routes.dart index 6552747..b1dae20 100644 --- a/lib/core/routes/app_routes.dart +++ b/lib/core/routes/app_routes.dart @@ -18,12 +18,15 @@ import '../../views/splash/pages/splash_screen.dart'; import '../../views/tenders/pages/tenders_screen.dart'; import '../../views/your_tenders/pages/your_tenders_screen.dart'; import '../providers/final_completion_provider.dart'; +import '../providers/forgot_password_provider.dart'; import '../providers/home_provider.dart'; import '../providers/liked_tenders_provider.dart'; import '../providers/notification_provider.dart'; import '../providers/profile_provider.dart'; +import '../providers/reset_password_provider.dart'; import '../providers/tender_detail_provider.dart'; import '../providers/tenders_provider.dart'; +import '../providers/verify_otp_provider.dart'; import '../providers/your_tenders_provider.dart'; import 'app_shell/app_shell_screen.dart'; @@ -275,28 +278,32 @@ class ForgotPasswordRouteData extends GoRouteData @override Widget build(BuildContext context, GoRouterState state) { - return const ForgotPasswordScreen(); + return forgotPasswordProvider(child: const ForgotPasswordScreen()); } } @TypedGoRoute(path: '/forgot-password-otp') class ForgotPasswordOtpRouteData extends GoRouteData with _$ForgotPasswordOtpRouteData { - const ForgotPasswordOtpRouteData(); + final String email; + const ForgotPasswordOtpRouteData({required this.email}); @override Widget build(BuildContext context, GoRouterState state) { - return const ForgotPasswordOtpScreen(); + return verifyOtpProvider(child: ForgotPasswordOtpScreen(email: email)); } } @TypedGoRoute(path: '/forgot-password-create') class ForgotPasswordCreateRouteData extends GoRouteData with _$ForgotPasswordCreateRouteData { - const ForgotPasswordCreateRouteData(); + final String resetToken; + const ForgotPasswordCreateRouteData({required this.resetToken}); @override Widget build(BuildContext context, GoRouterState state) { - return const ForgotPasswordCreateScreen(); + return resetPasswordProvider( + child: ForgotPasswordCreateScreen(resetToken: resetToken), + ); } } diff --git a/lib/core/routes/app_routes.g.dart b/lib/core/routes/app_routes.g.dart index d3d2e7c..2000a07 100644 --- a/lib/core/routes/app_routes.g.dart +++ b/lib/core/routes/app_routes.g.dart @@ -415,10 +415,15 @@ RouteBase get $forgotPasswordOtpRouteData => GoRouteData.$route( mixin _$ForgotPasswordOtpRouteData on GoRouteData { static ForgotPasswordOtpRouteData _fromState(GoRouterState state) => - const ForgotPasswordOtpRouteData(); + ForgotPasswordOtpRouteData(email: state.uri.queryParameters['email']!); + + ForgotPasswordOtpRouteData get _self => this as ForgotPasswordOtpRouteData; @override - String get location => GoRouteData.$location('/forgot-password-otp'); + String get location => GoRouteData.$location( + '/forgot-password-otp', + queryParams: {'email': _self.email}, + ); @override void go(BuildContext context) => context.go(location); @@ -442,10 +447,18 @@ RouteBase get $forgotPasswordCreateRouteData => GoRouteData.$route( mixin _$ForgotPasswordCreateRouteData on GoRouteData { static ForgotPasswordCreateRouteData _fromState(GoRouterState state) => - const ForgotPasswordCreateRouteData(); + ForgotPasswordCreateRouteData( + resetToken: state.uri.queryParameters['reset-token']!, + ); + + ForgotPasswordCreateRouteData get _self => + this as ForgotPasswordCreateRouteData; @override - String get location => GoRouteData.$location('/forgot-password-create'); + String get location => GoRouteData.$location( + '/forgot-password-create', + queryParams: {'reset-token': _self.resetToken}, + ); @override void go(BuildContext context) => context.go(location); diff --git a/lib/view_models/auth_view_model.dart b/lib/view_models/auth_view_model.dart index d194a40..55f063b 100644 --- a/lib/view_models/auth_view_model.dart +++ b/lib/view_models/auth_view_model.dart @@ -1,15 +1,10 @@ import 'package:flutter/material.dart'; import 'package:tm_app/data/services/model/customer/customer.dart'; -import 'package:tm_app/data/services/model/forgot_password_response/forgot_password_response_model.dart'; -import 'package:tm_app/data/services/model/verify_otp_response/verify_otp_response_model.dart'; -import '../core/utils/error_utils.dart'; import '../core/utils/logger.dart'; import '../core/utils/result.dart'; import '../data/repositories/auth_repository.dart'; import '../data/services/model/login_response/login_response_model.dart'; -import '../data/services/model/reset_password_response/reset_password_response.dart'; -import '../views/forget_password_create/strings/forgot_password_create_strings.dart'; class AuthViewModel with ChangeNotifier { final AuthRepository _authRepository; @@ -18,101 +13,37 @@ class AuthViewModel with ChangeNotifier { : _authRepository = authRepository { usernameController.addListener(_onTextChanged); passwordController.addListener(_onTextChanged); - emailController.addListener(_onTextChanged); - otpController.addListener(_onTextChanged); - newPasswordController.addListener(_onTextChanged); } final TextEditingController usernameController = TextEditingController(); final TextEditingController passwordController = TextEditingController(); - final TextEditingController emailController = TextEditingController(); - final TextEditingController newPasswordController = TextEditingController(); - final TextEditingController otpController = TextEditingController(); final FocusNode usernameFocus = FocusNode(); final FocusNode passwordFocus = FocusNode(); - final FocusNode emailFocus = FocusNode(); - final FocusNode newPasswordFocus = FocusNode(); - final FocusNode otpFocus = FocusNode(); bool _obscurePassword = true; bool get obscurePassword => _obscurePassword; - bool _obscureForgotPassword = true; - bool get obscureForgotPassword => _obscureForgotPassword; - bool get isLoginEnabled => usernameController.text.isNotEmpty && passwordController.text.isNotEmpty; // Auth state bool _isLoading = false; bool _isLoggedIn = false; - bool _isResetPasswordLoading = false; String? _errorMessage; - String? _resetPasswordErrorMessage; - bool _resetPasswordSuccess = false; Customer? _loggedInUser; String? successMessage; - String? _successMessageOtp; - String? _forgotPasswordMessage; - bool _isLoadingForgot = false; - bool _isLoadingOtp = false; - String? _errorMessageForget; - String? _errorMessageOtp; - bool _verifyOtpSuccess = false; bool get isLoading => _isLoading; bool get isLoggedIn => _isLoggedIn; - bool get isLoadingForgot => _isLoadingForgot; - bool get isLoadingOtp => _isLoadingOtp; - bool get isResetPasswordLoading => _isResetPasswordLoading; String? get errorMessage => _errorMessage; - String? get errorMessageForget => _errorMessageForget; - String? get resetPasswordErrorMessage => _resetPasswordErrorMessage; - String? get errorMessageOtp => _errorMessageOtp; - String? get successMessageOtp => _successMessageOtp; - bool get verifyOtpSuccess => _verifyOtpSuccess; Customer? get loggedInUser => _loggedInUser; - String? get forgotPasswordMessage => _forgotPasswordMessage; - String? resetToken; - bool get resetPasswordSuccess => _resetPasswordSuccess; void togglePasswordVisibility() { _obscurePassword = !_obscurePassword; notifyListeners(); } - void toggleForgotPasswordVisibility() { - _obscureForgotPassword = !_obscureForgotPassword; - notifyListeners(); - } - - bool get isEmailValid { - final email = emailController.text.trim(); - final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); - return emailRegex.hasMatch(email); - } - - bool get isOtpValid { - final otp = otpController.text.trim(); - return otp.length == 6; - } - - bool get canSubmitOtpPage { - return isOtpValid; - } - - bool get isNewPasswordValid { - final password = newPasswordController.text.trim(); - - final hasMinLength = password.length >= 5; - final hasUppercase = RegExp(r'[A-Z]').hasMatch(password); - final hasLowercase = RegExp(r'[a-z]').hasMatch(password); - final hasSpecialChar = RegExp(r'[!@#\$%&\*\^]').hasMatch(password); - - return hasMinLength && hasUppercase && hasLowercase && hasSpecialChar; - } - void _onTextChanged() { notifyListeners(); } @@ -153,120 +84,10 @@ class AuthViewModel with ChangeNotifier { AppLogger().error('❌ Failed to local logout: $e'); } _loggedInUser = null; + _isLoggedIn = false; notifyListeners(); } - Future forgotPassword() async { - _isLoadingForgot = true; - _errorMessageForget = null; - successMessage = null; - notifyListeners(); - - final result = await _authRepository.forgotPassword( - email: emailController.text.trim(), - ); - - switch (result) { - case Ok(): - _isLoadingForgot = false; - successMessage = result.value.message; - - notifyListeners(); - - break; - - case Error(): - _isLoadingForgot = false; - _errorMessageForget = result.error.toString(); - notifyListeners(); - - Future.microtask(() { - _errorMessageForget = null; - }); - break; - } - } - - void clearMessages() { - successMessage = null; - _errorMessage = null; - notifyListeners(); - } - - Future verifyOtp() async { - _isLoadingOtp = true; - _errorMessageOtp = null; - _verifyOtpSuccess = false; - notifyListeners(); - - final result = await _authRepository.verifyOtp( - code: otpController.text.trim(), - email: emailController.text.trim(), - ); - - switch (result) { - case Ok(): - _isLoadingOtp = false; - resetToken = result.value.data.token; - _successMessageOtp = result.value.message; - _verifyOtpSuccess = true; - notifyListeners(); - - break; - - case Error(): - _isLoadingOtp = false; - _errorMessageOtp = result.error.toString(); - _verifyOtpSuccess = false; - notifyListeners(); - break; - } - - _errorMessageOtp = null; - _successMessageOtp = null; - notifyListeners(); - } - - void clearOtpFlow() { - _errorMessageOtp = null; - _successMessageOtp = null; - _isLoadingOtp = false; - _verifyOtpSuccess = false; - // Intentionally do not clear resetToken - otpController.clear(); - notifyListeners(); - } - - Future resetPassword() async { - _isResetPasswordLoading = true; - _resetPasswordErrorMessage = null; - _resetPasswordSuccess = false; - notifyListeners(); - if (resetToken != null) { - final result = await _authRepository.resetPassword( - newPassword: newPasswordController.text.trim(), - token: resetToken!, - ); - switch (result) { - case Ok(): - _resetPasswordSuccess = true; - break; - case Error(): - _resetPasswordErrorMessage = ErrorUtils.getErrorMessage(result.error); - _resetPasswordSuccess = false; - break; - } - _isResetPasswordLoading = false; - _resetPasswordErrorMessage = null; - notifyListeners(); - } else { - _resetPasswordErrorMessage = - ForgotPasswordCreateStrings.passwordResetFailed; - _isResetPasswordLoading = false; - notifyListeners(); - } - } - Future checkIsLoggedIn() async { final result = await _authRepository.checkIsLoggedIn(); @@ -282,18 +103,13 @@ class AuthViewModel with ChangeNotifier { notifyListeners(); } - void clearResetPasswordSuccess() { - _resetPasswordSuccess = false; - - notifyListeners(); - } - - void clearResetFlow() { - _resetPasswordErrorMessage = null; - _resetPasswordSuccess = false; - _isResetPasswordLoading = false; - // Intentionally do not clear resetToken - newPasswordController.clear(); + void clearAuthFlow() { + _errorMessage = null; + successMessage = null; + usernameController.clear(); + passwordController.clear(); + _isLoggedIn = false; + _loggedInUser = null; notifyListeners(); } @@ -301,14 +117,8 @@ class AuthViewModel with ChangeNotifier { void dispose() { usernameController.dispose(); passwordController.dispose(); - emailController.dispose(); - newPasswordController.dispose(); - otpController.dispose(); usernameFocus.dispose(); passwordFocus.dispose(); - emailFocus.dispose(); - newPasswordFocus.dispose(); - otpFocus.dispose(); super.dispose(); } diff --git a/lib/view_models/forgot_password_view_model.dart b/lib/view_models/forgot_password_view_model.dart new file mode 100644 index 0000000..ad7fe45 --- /dev/null +++ b/lib/view_models/forgot_password_view_model.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +import '../core/utils/result.dart'; +import '../data/repositories/auth_repository.dart'; +import '../data/services/model/forgot_password_response/forgot_password_response_model.dart'; + +class ForgotPasswordViewModel with ChangeNotifier { + final AuthRepository _authRepository; + + ForgotPasswordViewModel({required AuthRepository authRepository}) + : _authRepository = authRepository { + emailController.addListener(_onTextChanged); + } + + final TextEditingController emailController = TextEditingController(); + + final FocusNode emailFocus = FocusNode(); + + bool _isLoading = false; + String? _errorMessage; + String? _successMessage; + + bool get isLoading => _isLoading; + String? get errorMessage => _errorMessage; + String? get successMessage => _successMessage; + + Future forgotPassword() async { + _isLoading = true; + _errorMessage = null; + _successMessage = null; + notifyListeners(); + + final result = await _authRepository.forgotPassword( + email: emailController.text.trim(), + ); + + switch (result) { + case Ok(): + _isLoading = false; + _successMessage = result.value.data?.message; + + notifyListeners(); + + break; + + case Error(): + _isLoading = false; + _errorMessage = result.error.toString(); + notifyListeners(); + + Future.microtask(() { + _errorMessage = null; + }); + break; + } + } + + bool get isEmailValid { + final email = emailController.text.trim(); + final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); + return emailRegex.hasMatch(email); + } + + void clearMessages() { + _successMessage = null; + _errorMessage = null; + notifyListeners(); + } + + void _onTextChanged() { + notifyListeners(); + } + + @override + void dispose() { + emailController.dispose(); + emailFocus.dispose(); + super.dispose(); + } +} diff --git a/lib/view_models/reset_password_view_model.dart b/lib/view_models/reset_password_view_model.dart new file mode 100644 index 0000000..ef59bd6 --- /dev/null +++ b/lib/view_models/reset_password_view_model.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; + +import '../core/utils/error_utils.dart'; +import '../core/utils/result.dart'; +import '../data/repositories/auth_repository.dart'; +import '../data/services/model/reset_password_response/reset_password_response.dart'; + +class ResetPasswordViewModel with ChangeNotifier { + final AuthRepository _authRepository; + + ResetPasswordViewModel({required AuthRepository authRepository}) + : _authRepository = authRepository { + newPasswordController.addListener(_onTextChanged); + } + + final TextEditingController newPasswordController = TextEditingController(); + final FocusNode newPasswordFocus = FocusNode(); + + bool _iLoading = false; + String? _errorMessage; + bool _successMessage = false; + bool _obscureNewPassword = true; + + bool get obscureNewPassword => _obscureNewPassword; + bool get isLoading => _iLoading; + String? get errorMessage => _errorMessage; + bool get successMessage => _successMessage; + + Future resetPassword({required String resetToken}) async { + _iLoading = true; + _errorMessage = null; + _successMessage = false; + notifyListeners(); + + final result = await _authRepository.resetPassword( + newPassword: newPasswordController.text.trim(), + token: resetToken, + ); + switch (result) { + case Ok(): + _successMessage = true; + break; + case Error(): + _errorMessage = ErrorUtils.getErrorMessage(result.error); + _successMessage = false; + break; + } + _iLoading = false; + _errorMessage = null; + notifyListeners(); + } + + void clearResetPasswordSuccess() { + _successMessage = false; + + notifyListeners(); + } + + void clearResetFlow() { + _errorMessage = null; + _successMessage = false; + _iLoading = false; + // Intentionally do not clear resetToken + newPasswordController.clear(); + notifyListeners(); + } + + bool get isNewPasswordValid { + final password = newPasswordController.text.trim(); + + final hasMinLength = password.length >= 5; + final hasUppercase = RegExp(r'[A-Z]').hasMatch(password); + final hasLowercase = RegExp(r'[a-z]').hasMatch(password); + final hasSpecialChar = RegExp(r'[!@#\$%&\*\^]').hasMatch(password); + + return hasMinLength && hasUppercase && hasLowercase && hasSpecialChar; + } + + void toggleForgotPasswordVisibility() { + _obscureNewPassword = !_obscureNewPassword; + notifyListeners(); + } + + void _onTextChanged() { + notifyListeners(); + } + + @override + void dispose() { + newPasswordController.dispose(); + newPasswordFocus.dispose(); + super.dispose(); + } +} diff --git a/lib/view_models/verify_otp_view_model.dart b/lib/view_models/verify_otp_view_model.dart new file mode 100644 index 0000000..be2d3c7 --- /dev/null +++ b/lib/view_models/verify_otp_view_model.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:tm_app/core/utils/result.dart'; + +import '../data/repositories/auth_repository.dart'; +import '../data/services/model/verify_otp_response/verify_otp_response_model.dart'; + +class VerifyOtpViewModel with ChangeNotifier { + final AuthRepository _authRepository; + + VerifyOtpViewModel({required AuthRepository authRepository}) + : _authRepository = authRepository { + otpController.addListener(_onTextChanged); + } + + final TextEditingController otpController = TextEditingController(); + + final FocusNode otpFocus = FocusNode(); + + bool _isLoading = false; + String? _errorMessage; + String? _successMessage; + bool _verifyOtpSuccess = false; + String? _resetToken; + + bool get isLoading => _isLoading; + String? get errorMessage => _errorMessage; + String? get successMessage => _successMessage; + bool get verifyOtpSuccess => _verifyOtpSuccess; + String? get resetToken => _resetToken; + + Future verifyOtp({required String email}) async { + _isLoading = true; + _errorMessage = null; + _verifyOtpSuccess = false; + notifyListeners(); + + final result = await _authRepository.verifyOtp( + code: otpController.text.trim(), + email: email, + ); + + switch (result) { + case Ok(): + _isLoading = false; + _resetToken = result.value.data.token; + _successMessage = result.value.message; + _verifyOtpSuccess = true; + notifyListeners(); + + break; + + case Error(): + _isLoading = false; + _errorMessage = result.error.toString(); + _verifyOtpSuccess = false; + notifyListeners(); + break; + } + + _errorMessage = null; + _successMessage = null; + notifyListeners(); + } + + void clearOtpFlow() { + _errorMessage = null; + _successMessage = null; + _isLoading = false; + _verifyOtpSuccess = false; + // Intentionally do not clear resetToken + otpController.clear(); + notifyListeners(); + } + + void _onTextChanged() { + notifyListeners(); + } + + bool get isOtpValid { + final otp = otpController.text.trim(); + return otp.length == 6; + } + + bool get canSubmitOtpPage { + return isOtpValid; + } + + @override + void dispose() { + otpController.dispose(); + otpFocus.dispose(); + super.dispose(); + } +} diff --git a/lib/views/forget_password_create/pages/d_forget_password_create_page.dart b/lib/views/forget_password_create/pages/d_forget_password_create_page.dart index da78088..7424ecf 100644 --- a/lib/views/forget_password_create/pages/d_forget_password_create_page.dart +++ b/lib/views/forget_password_create/pages/d_forget_password_create_page.dart @@ -9,12 +9,13 @@ import '../../../core/constants/assets.dart'; import '../../../core/routes/app_routes.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/reset_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; class DesktopForgotPasswordCreatePage extends StatefulWidget { - const DesktopForgotPasswordCreatePage({super.key}); + const DesktopForgotPasswordCreatePage({required this.resetToken, super.key}); + final String resetToken; @override State createState() => @@ -23,11 +24,11 @@ class DesktopForgotPasswordCreatePage extends StatefulWidget { class _DesktopForgotPasswordCreatePageState extends State { - late final AuthViewModel viewModel; + late final ResetPasswordViewModel viewModel; @override void initState() { - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); super.initState(); } @@ -39,10 +40,9 @@ class _DesktopForgotPasswordCreatePageState } void _viewModelListener() { - if (viewModel.resetPasswordErrorMessage != null) { - AppToast.error(context, viewModel.resetPasswordErrorMessage!); - } else if (viewModel.isResetPasswordLoading == false && - viewModel.resetPasswordSuccess) { + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (viewModel.isLoading == false && viewModel.successMessage) { AppToast.success( context, ForgotPasswordCreateStrings.passwordResetSuccess, @@ -60,7 +60,7 @@ class _DesktopForgotPasswordCreatePageState mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Consumer( + Consumer( builder: (context, viewModel, _) { return Expanded( child: Center( @@ -103,7 +103,7 @@ class _DesktopForgotPasswordCreatePageState label: ForgotPasswordCreateStrings.createNewPassword, iconPath: AssetsManager.passwordIcon, isPassword: true, - obscureText: viewModel.obscureForgotPassword, + obscureText: viewModel.obscureNewPassword, onToggleVisibility: viewModel.toggleForgotPasswordVisibility, ), @@ -156,7 +156,7 @@ class _DesktopForgotPasswordCreatePageState ), ), SizedBox(height: 80.0.h()), - viewModel.isResetPasswordLoading + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isNewPasswordValid, text: ForgotPasswordCreateStrings.resetLink, @@ -169,7 +169,9 @@ class _DesktopForgotPasswordCreatePageState onPressed: viewModel.isNewPasswordValid ? () async { - viewModel.resetPassword(); + viewModel.resetPassword( + resetToken: widget.resetToken, + ); } : null, ), diff --git a/lib/views/forget_password_create/pages/forgot_password_create_screen.dart b/lib/views/forget_password_create/pages/forgot_password_create_screen.dart index 301f9a8..c343e30 100644 --- a/lib/views/forget_password_create/pages/forgot_password_create_screen.dart +++ b/lib/views/forget_password_create/pages/forgot_password_create_screen.dart @@ -6,14 +6,15 @@ import 'package:tm_app/views/forget_password_create/pages/t_forget_password_crea import '../../shared/responsive_builder.dart'; class ForgotPasswordCreateScreen extends StatelessWidget { - const ForgotPasswordCreateScreen({super.key}); + const ForgotPasswordCreateScreen({required this.resetToken, super.key}); + final String resetToken; @override Widget build(BuildContext context) { - return const ResponsiveBuilder( - mobile: MobileForgotPasswordCreatePage(), - tablet: TabletForgotPasswordCreatePage(), - desktop: DesktopForgotPasswordCreatePage(), + return ResponsiveBuilder( + mobile: MobileForgotPasswordCreatePage(resetToken: resetToken), + tablet: TabletForgotPasswordCreatePage(resetToken: resetToken), + desktop: DesktopForgotPasswordCreatePage(resetToken: resetToken), ); } } diff --git a/lib/views/forget_password_create/pages/m_forget_password_create_page.dart b/lib/views/forget_password_create/pages/m_forget_password_create_page.dart index b474df1..a38c108 100644 --- a/lib/views/forget_password_create/pages/m_forget_password_create_page.dart +++ b/lib/views/forget_password_create/pages/m_forget_password_create_page.dart @@ -9,12 +9,13 @@ import 'package:tm_app/views/forget_password_create/strings/forgot_password_crea import '../../../core/constants/assets.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/reset_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; class MobileForgotPasswordCreatePage extends StatefulWidget { - const MobileForgotPasswordCreatePage({super.key}); + const MobileForgotPasswordCreatePage({required this.resetToken, super.key}); + final String resetToken; @override State createState() => @@ -23,11 +24,11 @@ class MobileForgotPasswordCreatePage extends StatefulWidget { class _MobileForgotPasswordCreatePageState extends State { - late final AuthViewModel viewModel; + late final ResetPasswordViewModel viewModel; @override void initState() { - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); super.initState(); } @@ -39,10 +40,9 @@ class _MobileForgotPasswordCreatePageState } void _viewModelListener() { - if (viewModel.resetPasswordErrorMessage != null) { - AppToast.error(context, viewModel.resetPasswordErrorMessage!); - } else if (viewModel.isResetPasswordLoading == false && - viewModel.resetPasswordSuccess) { + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (viewModel.isLoading == false && viewModel.successMessage) { AppToast.success( context, ForgotPasswordCreateStrings.passwordResetSuccess, @@ -61,7 +61,7 @@ class _MobileForgotPasswordCreatePageState child: Center( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Column( mainAxisSize: MainAxisSize.min, @@ -100,7 +100,7 @@ class _MobileForgotPasswordCreatePageState label: ForgotPasswordCreateStrings.createNewPassword, iconPath: AssetsManager.passwordIcon, isPassword: true, - obscureText: viewModel.obscureForgotPassword, + obscureText: viewModel.obscureNewPassword, onToggleVisibility: viewModel.toggleForgotPasswordVisibility, ), @@ -153,7 +153,7 @@ class _MobileForgotPasswordCreatePageState ), ), SizedBox(height: 80.0.h()), - viewModel.isResetPasswordLoading + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isNewPasswordValid, text: ForgotPasswordCreateStrings.resetLink, @@ -166,7 +166,9 @@ class _MobileForgotPasswordCreatePageState onPressed: viewModel.isNewPasswordValid ? () async { - viewModel.resetPassword(); + viewModel.resetPassword( + resetToken: widget.resetToken, + ); } : null, ), diff --git a/lib/views/forget_password_create/pages/t_forget_password_create_page.dart b/lib/views/forget_password_create/pages/t_forget_password_create_page.dart index 8c33af8..f6492e8 100644 --- a/lib/views/forget_password_create/pages/t_forget_password_create_page.dart +++ b/lib/views/forget_password_create/pages/t_forget_password_create_page.dart @@ -9,12 +9,13 @@ import '../../../core/constants/assets.dart'; import '../../../core/routes/app_routes.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/reset_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; class TabletForgotPasswordCreatePage extends StatefulWidget { - const TabletForgotPasswordCreatePage({super.key}); + const TabletForgotPasswordCreatePage({required this.resetToken, super.key}); + final String resetToken; @override State createState() => @@ -23,11 +24,11 @@ class TabletForgotPasswordCreatePage extends StatefulWidget { class _TabletForgotPasswordCreatePageState extends State { - late final AuthViewModel viewModel; + late final ResetPasswordViewModel viewModel; @override void initState() { - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); super.initState(); } @@ -39,10 +40,9 @@ class _TabletForgotPasswordCreatePageState } void _viewModelListener() { - if (viewModel.resetPasswordErrorMessage != null) { - AppToast.error(context, viewModel.resetPasswordErrorMessage!); - } else if (viewModel.isResetPasswordLoading == false && - viewModel.resetPasswordSuccess) { + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (viewModel.isLoading == false && viewModel.successMessage) { AppToast.success( context, ForgotPasswordCreateStrings.passwordResetSuccess, @@ -59,7 +59,7 @@ class _TabletForgotPasswordCreatePageState body: Center( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Center( child: SizedBox( @@ -101,7 +101,7 @@ class _TabletForgotPasswordCreatePageState label: ForgotPasswordCreateStrings.createNewPassword, iconPath: AssetsManager.passwordIcon, isPassword: true, - obscureText: viewModel.obscureForgotPassword, + obscureText: viewModel.obscureNewPassword, onToggleVisibility: viewModel.toggleForgotPasswordVisibility, ), @@ -154,7 +154,7 @@ class _TabletForgotPasswordCreatePageState ), ), SizedBox(height: 70.0.h()), - viewModel.isResetPasswordLoading + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isNewPasswordValid, text: ForgotPasswordCreateStrings.resetLink, @@ -168,7 +168,9 @@ class _TabletForgotPasswordCreatePageState onPressed: viewModel.isNewPasswordValid ? () async { - viewModel.resetPassword(); + viewModel.resetPassword( + resetToken: widget.resetToken, + ); } : null, ), diff --git a/lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart index 81e35d7..78db151 100644 --- a/lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart +++ b/lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart @@ -9,12 +9,13 @@ import '../../../core/constants/assets.dart'; import '../../../core/routes/app_routes.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/verify_otp_view_model.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; class DesktopForgotPasswordOtpPage extends StatefulWidget { - const DesktopForgotPasswordOtpPage({super.key}); + const DesktopForgotPasswordOtpPage({required this.email, super.key}); + final String email; @override State createState() => @@ -23,24 +24,26 @@ class DesktopForgotPasswordOtpPage extends StatefulWidget { class _DesktopForgotPasswordOtpPageState extends State { - late final AuthViewModel viewModel; + late final VerifyOtpViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } void _viewModelListener() { - if (viewModel.errorMessageOtp != null) { - AppToast.error(context, viewModel.errorMessageOtp!); - } else if (!viewModel.isLoadingOtp && + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (!viewModel.isLoading && viewModel.verifyOtpSuccess && viewModel.resetToken != null) { Router.neglect( context, - () => const ForgotPasswordCreateRouteData().pushReplacement(context), + () => ForgotPasswordCreateRouteData( + resetToken: viewModel.resetToken!, + ).pushReplacement(context), ); viewModel.clearOtpFlow(); } @@ -56,7 +59,7 @@ class _DesktopForgotPasswordOtpPageState Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.backgroundColor, - body: Consumer( + body: Consumer( builder: (context, viewModel, _) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -115,7 +118,7 @@ class _DesktopForgotPasswordOtpPageState ), ), SizedBox(height: 24.0.h()), - viewModel.isLoadingOtp + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isOtpValid, text: ForgotPasswordOtpStrings.resetLink, @@ -128,7 +131,9 @@ class _DesktopForgotPasswordOtpPageState onPressed: viewModel.canSubmitOtpPage ? () async { - await viewModel.verifyOtp(); + await viewModel.verifyOtp( + email: widget.email, + ); } : null, ), diff --git a/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart b/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart index 7b31369..7700120 100644 --- a/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart +++ b/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart @@ -7,15 +7,16 @@ import 'package:tm_app/views/forget_password_otp/pages/t_forget_password_otp_pag import '../../shared/responsive_builder.dart'; class ForgotPasswordOtpScreen extends StatelessWidget { - const ForgotPasswordOtpScreen({super.key}); + const ForgotPasswordOtpScreen({required this.email, super.key}); + final String email; @override Widget build(BuildContext context) { SizeConfig.init(context); - return const ResponsiveBuilder( - mobile: MobileForgotPasswordOtpPage(), - tablet: TabletForgotPasswordOtpPage(), - desktop: DesktopForgotPasswordOtpPage(), + return ResponsiveBuilder( + mobile: MobileForgotPasswordOtpPage(email: email), + tablet: TabletForgotPasswordOtpPage(email: email), + desktop: DesktopForgotPasswordOtpPage(email: email), ); } } diff --git a/lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart index 084353f..df56520 100644 --- a/lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart +++ b/lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart @@ -9,12 +9,13 @@ import 'package:tm_app/core/utils/size_config.dart'; import '../../../core/constants/assets.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/verify_otp_view_model.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; class MobileForgotPasswordOtpPage extends StatefulWidget { - const MobileForgotPasswordOtpPage({super.key}); + const MobileForgotPasswordOtpPage({required this.email, super.key}); + final String email; @override State createState() => @@ -23,22 +24,24 @@ class MobileForgotPasswordOtpPage extends StatefulWidget { class _MobileForgotPasswordOtpPageState extends State { - late final AuthViewModel viewModel; + late final VerifyOtpViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } void _viewModelListener() { - if (viewModel.errorMessageOtp != null) { - AppToast.error(context, viewModel.errorMessageOtp!); - } else if (!viewModel.isLoadingOtp && + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (!viewModel.isLoading && viewModel.verifyOtpSuccess && viewModel.resetToken != null) { - const ForgotPasswordCreateRouteData().pushReplacement(context); + ForgotPasswordCreateRouteData( + resetToken: viewModel.resetToken!, + ).pushReplacement(context); viewModel.clearOtpFlow(); } } @@ -57,7 +60,7 @@ class _MobileForgotPasswordOtpPageState child: Center( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Column( mainAxisSize: MainAxisSize.min, @@ -109,7 +112,7 @@ class _MobileForgotPasswordOtpPageState ), ), SizedBox(height: 24.0.h()), - viewModel.isLoadingOtp + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isOtpValid, text: ForgotPasswordOtpStrings.resetLink, @@ -122,7 +125,9 @@ class _MobileForgotPasswordOtpPageState onPressed: viewModel.canSubmitOtpPage ? () async { - await viewModel.verifyOtp(); + await viewModel.verifyOtp( + email: widget.email, + ); } : null, ), diff --git a/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart index ab1ea86..5e0ea56 100644 --- a/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart +++ b/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart @@ -9,12 +9,13 @@ import '../../../core/constants/assets.dart'; import '../../../core/routes/app_routes.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/verify_otp_view_model.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; class TabletForgotPasswordOtpPage extends StatefulWidget { - const TabletForgotPasswordOtpPage({super.key}); + const TabletForgotPasswordOtpPage({required this.email, super.key}); + final String email; @override State createState() => @@ -23,24 +24,26 @@ class TabletForgotPasswordOtpPage extends StatefulWidget { class _TabletForgotPasswordOtpPageState extends State { - late final AuthViewModel viewModel; + late final VerifyOtpViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } void _viewModelListener() { - if (viewModel.errorMessageOtp != null) { - AppToast.error(context, viewModel.errorMessageOtp!); - } else if (!viewModel.isLoadingOtp && + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); + } else if (!viewModel.isLoading && viewModel.verifyOtpSuccess && viewModel.resetToken != null) { Router.neglect( context, - () => const ForgotPasswordCreateRouteData().pushReplacement(context), + () => ForgotPasswordCreateRouteData( + resetToken: viewModel.resetToken!, + ).pushReplacement(context), ); viewModel.clearOtpFlow(); } @@ -59,7 +62,7 @@ class _TabletForgotPasswordOtpPageState body: Center( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Center( child: SizedBox( @@ -114,7 +117,7 @@ class _TabletForgotPasswordOtpPageState ), ), SizedBox(height: 70.0.h()), - viewModel.isLoadingOtp + viewModel.isLoading ? BaseButton( isEnabled: viewModel.isOtpValid, text: ForgotPasswordOtpStrings.resetLink, @@ -127,7 +130,9 @@ class _TabletForgotPasswordOtpPageState onPressed: viewModel.canSubmitOtpPage ? () async { - await viewModel.verifyOtp(); + await viewModel.verifyOtp( + email: widget.email, + ); } : null, ), diff --git a/lib/views/forgot_password/pages/d_forgot_apssword_page.dart b/lib/views/forgot_password/pages/d_forgot_apssword_page.dart index a241573..a78af16 100644 --- a/lib/views/forgot_password/pages/d_forgot_apssword_page.dart +++ b/lib/views/forgot_password/pages/d_forgot_apssword_page.dart @@ -7,7 +7,7 @@ import 'package:tm_app/core/utils/size_config.dart'; import '../../../core/constants/assets.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/Forgot_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; @@ -21,12 +21,12 @@ class DesktopForgotPasswordPage extends StatefulWidget { } class _DesktopForgotPasswordPageState extends State { - late final AuthViewModel viewModel; + late final ForgotPasswordViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } @@ -35,13 +35,15 @@ class _DesktopForgotPasswordPageState extends State { AppToast.success(context, viewModel.successMessage!); Router.neglect( context, - () => const ForgotPasswordOtpRouteData().pushReplacement(context), + () => ForgotPasswordOtpRouteData( + email: viewModel.emailController.text.trim(), + ).pushReplacement(context), ); viewModel.clearMessages(); } - if (viewModel.errorMessageForget != null) { - AppToast.error(context, viewModel.errorMessageForget!); + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); viewModel.clearMessages(); } } @@ -57,7 +59,7 @@ class _DesktopForgotPasswordPageState extends State { return Scaffold( backgroundColor: AppColors.backgroundColor, body: Center( - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -104,7 +106,7 @@ class _DesktopForgotPasswordPageState extends State { isPassword: false, ), SizedBox(height: 70.0.h()), - viewModel.isLoadingForgot + viewModel.isLoading ? const BaseButton( isEnabled: false, text: ForgotPasswordStrings.resetLink, diff --git a/lib/views/forgot_password/pages/m_forgot_password_page.dart b/lib/views/forgot_password/pages/m_forgot_password_page.dart index 12f8fbc..f85e8fa 100644 --- a/lib/views/forgot_password/pages/m_forgot_password_page.dart +++ b/lib/views/forgot_password/pages/m_forgot_password_page.dart @@ -6,8 +6,8 @@ import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/app_toast.dart'; import 'package:tm_app/core/utils/size_config.dart'; -import 'package:tm_app/view_models/auth_view_model.dart'; +import '../../../view_models/forgot_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; @@ -21,24 +21,26 @@ class MobileForgotPasswordPage extends StatefulWidget { } class _MobileForgotPasswordPageState extends State { - late final AuthViewModel viewModel; + late final ForgotPasswordViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } void _viewModelListener() { if (viewModel.successMessage != null) { AppToast.success(context, viewModel.successMessage!); - const ForgotPasswordOtpRouteData().pushReplacement(context); + ForgotPasswordOtpRouteData( + email: viewModel.emailController.text.trim(), + ).pushReplacement(context); viewModel.clearMessages(); } - if (viewModel.errorMessageForget != null) { - AppToast.error(context, viewModel.errorMessageForget!); + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); viewModel.clearMessages(); } } @@ -57,7 +59,7 @@ class _MobileForgotPasswordPageState extends State { child: Center( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Consumer( + child: Consumer( builder: (context, viewModel, _) { return Column( mainAxisSize: MainAxisSize.min, @@ -97,7 +99,7 @@ class _MobileForgotPasswordPageState extends State { isPassword: false, ), SizedBox(height: 24.0.h()), - viewModel.isLoadingForgot + viewModel.isLoading ? const BaseButton( isEnabled: false, text: ForgotPasswordStrings.resetLink, diff --git a/lib/views/forgot_password/pages/t_forgot_password_page.dart b/lib/views/forgot_password/pages/t_forgot_password_page.dart index 24a5a3d..9085557 100644 --- a/lib/views/forgot_password/pages/t_forgot_password_page.dart +++ b/lib/views/forgot_password/pages/t_forgot_password_page.dart @@ -7,7 +7,7 @@ import 'package:tm_app/core/utils/size_config.dart'; import '../../../core/constants/assets.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; -import '../../../view_models/auth_view_model.dart'; +import '../../../view_models/forgot_password_view_model.dart'; import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; @@ -21,12 +21,12 @@ class TabletForgotPasswordPage extends StatefulWidget { } class _TabletForgotPasswordPageState extends State { - late final AuthViewModel viewModel; + late final ForgotPasswordViewModel viewModel; @override void initState() { super.initState(); - viewModel = context.read(); + viewModel = context.read(); viewModel.addListener(_viewModelListener); } @@ -35,13 +35,15 @@ class _TabletForgotPasswordPageState extends State { AppToast.success(context, viewModel.successMessage!); Router.neglect( context, - () => const ForgotPasswordOtpRouteData().pushReplacement(context), + () => ForgotPasswordOtpRouteData( + email: viewModel.emailController.text.trim(), + ).pushReplacement(context), ); viewModel.clearMessages(); } - if (viewModel.errorMessageForget != null) { - AppToast.error(context, viewModel.errorMessageForget!); + if (viewModel.errorMessage != null) { + AppToast.error(context, viewModel.errorMessage!); viewModel.clearMessages(); } } @@ -55,7 +57,7 @@ class _TabletForgotPasswordPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - body: Consumer( + body: Consumer( builder: (context, viewModel, _) { return Center( child: SizedBox( @@ -98,7 +100,7 @@ class _TabletForgotPasswordPageState extends State { isPassword: false, ), SizedBox(height: 70.0.h()), - viewModel.isLoadingForgot + viewModel.isLoading ? const BaseButton( isEnabled: false, text: ForgotPasswordStrings.resetLink, diff --git a/lib/views/profile/pages/d_profile_page.dart b/lib/views/profile/pages/d_profile_page.dart index 07c5c35..379a350 100644 --- a/lib/views/profile/pages/d_profile_page.dart +++ b/lib/views/profile/pages/d_profile_page.dart @@ -9,6 +9,7 @@ import '../../../core/constants/common_strings.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; import '../../../core/utils/size_config.dart'; +import '../../../view_models/auth_view_model.dart'; import '../../shared/desktop_navigation_widget.dart'; import '../strings/profile_strings.dart'; import '../widgets/theme_toggle.dart'; @@ -35,6 +36,7 @@ class _DesktopProfilePageState extends State { AppToast.error(context, viewModel.errorMessage!); } if (viewModel.loggedOut) { + context.read().clearAuthFlow(); Router.neglect(context, () => const LoginScreenRoute().go(context)); } } diff --git a/lib/views/profile/pages/m_profile_page.dart b/lib/views/profile/pages/m_profile_page.dart index 7917b80..cb81837 100644 --- a/lib/views/profile/pages/m_profile_page.dart +++ b/lib/views/profile/pages/m_profile_page.dart @@ -10,6 +10,7 @@ import '../../../core/constants/common_strings.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; import '../../../core/utils/size_config.dart'; +import '../../../view_models/auth_view_model.dart'; import '../../shared/tender_app_bar.dart'; import '../strings/profile_strings.dart'; import '../widgets/title_description.dart'; @@ -36,6 +37,7 @@ class _MobileProfilePageState extends State { AppToast.error(context, viewModel.errorMessage!); } if (viewModel.loggedOut) { + context.read().clearAuthFlow(); Router.neglect(context, () => const LoginScreenRoute().go(context)); } } diff --git a/lib/views/profile/pages/t_profile_page.dart b/lib/views/profile/pages/t_profile_page.dart index 7ac20b3..c6a21ec 100644 --- a/lib/views/profile/pages/t_profile_page.dart +++ b/lib/views/profile/pages/t_profile_page.dart @@ -9,6 +9,7 @@ import 'package:tm_app/view_models/profile_view_model.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/app_toast.dart'; import '../../../core/utils/size_config.dart'; +import '../../../view_models/auth_view_model.dart'; import '../../shared/tablet_navigation_widget.dart'; import '../../shared/tender_app_bar.dart'; import '../strings/profile_strings.dart'; @@ -36,6 +37,7 @@ class _TabletProfilePageState extends State { AppToast.error(context, viewModel.errorMessage!); } if (viewModel.loggedOut) { + context.read().clearAuthFlow(); Router.neglect(context, () => const LoginScreenRoute().go(context)); } }