diff --git a/lib/core/routes/app_routes.dart b/lib/core/routes/app_routes.dart index 778407b..c200dd7 100644 --- a/lib/core/routes/app_routes.dart +++ b/lib/core/routes/app_routes.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:tm_app/views/completion_of_documents/pages/m_completion_of_documents_page.dart'; import 'package:tm_app/views/detail/pages/detail_screen.dart'; +import 'package:tm_app/views/forget_password_create/pages/forgot_password_create_screen.dart'; import 'package:tm_app/views/forget_password_otp.dart/pages/forgot_password_otp_screen.dart'; import 'package:tm_app/views/home/pages/home_screen.dart'; import 'package:tm_app/views/liked_tenders/pages/liked_tenders_screen.dart'; @@ -243,3 +244,14 @@ class ForgotPasswordOtpRouteData extends GoRouteData return const ForgotPasswordOtpScreen(); } } + +@TypedGoRoute(path: '/forgot-password-create') +class ForgotPasswordCreateRouteData extends GoRouteData + with _$ForgotPasswordCreateRouteData { + const ForgotPasswordCreateRouteData(); + + @override + Widget build(BuildContext context, GoRouterState state) { + return const ForgotPasswordCreateScreen(); + } +} diff --git a/lib/core/routes/app_routes.g.dart b/lib/core/routes/app_routes.g.dart index 96e3482..d875f44 100644 --- a/lib/core/routes/app_routes.g.dart +++ b/lib/core/routes/app_routes.g.dart @@ -16,6 +16,7 @@ List get $appRoutes => [ $tenderDetailRouteData, $forgotPasswordRouteData, $forgotPasswordOtpRouteData, + $forgotPasswordCreateRouteData, ]; RouteBase get $loginScreenRoute => @@ -371,3 +372,30 @@ mixin _$ForgotPasswordOtpRouteData on GoRouteData { @override void replace(BuildContext context) => context.replace(location); } + +RouteBase get $forgotPasswordCreateRouteData => GoRouteData.$route( + path: '/forgot-password-create', + + factory: _$ForgotPasswordCreateRouteData._fromState, +); + +mixin _$ForgotPasswordCreateRouteData on GoRouteData { + static ForgotPasswordCreateRouteData _fromState(GoRouterState state) => + const ForgotPasswordCreateRouteData(); + + @override + String get location => GoRouteData.$location('/forgot-password-create'); + + @override + void go(BuildContext context) => context.go(location); + + @override + Future push(BuildContext context) => context.push(location); + + @override + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + @override + void replace(BuildContext context) => context.replace(location); +} diff --git a/lib/data/services/api/auth_api.dart b/lib/data/services/api/auth_api.dart index fdd8c5a..b86d499 100644 --- a/lib/data/services/api/auth_api.dart +++ b/lib/data/services/api/auth_api.dart @@ -2,5 +2,6 @@ class AuthApi { static const String login = '/api/v1/profile/login'; static const String logout = '/api/v1/profile/logout'; static const String forgotPassword = '/api/v1/profile/forgot-password'; + static const String forgotPasswordOtp = '/api/v1/profile/verify-otp'; static const String resetPassword = '/api/v1/profile/reset-password'; } diff --git a/lib/data/services/auth_service.dart b/lib/data/services/auth_service.dart index aa98185..3a62ee1 100644 --- a/lib/data/services/auth_service.dart +++ b/lib/data/services/auth_service.dart @@ -96,7 +96,7 @@ class AuthService { final data = jsonEncode({"code": code, "email": email}); final result = await _networkManager.makeRequest( - "/api/v1/profile/verify-otp", + AuthApi.forgotPasswordOtp, method: 'POST', (json) => VerifyOtpResponseModel.fromJson(json), data: data, diff --git a/lib/view_models/auth_view_model.dart b/lib/view_models/auth_view_model.dart index 43454b3..7601d44 100644 --- a/lib/view_models/auth_view_model.dart +++ b/lib/view_models/auth_view_model.dart @@ -1,8 +1,9 @@ +import 'dart:developer'; + 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 'package:tm_app/views/forget_password_create/pages/forgot_password_create_screen.dart'; import '../core/utils/result.dart'; import '../data/repositories/auth_repository.dart'; @@ -51,11 +52,20 @@ class AuthViewModel with ChangeNotifier { Customer? _loggedInUser; String? successMessage; String? _forgotPasswordMessage; + bool _isLoadingForgot = false; + bool _isLoadingOtp = false; + String? _errorMessageForget; + String? _errorMessageOtp; bool get isLoading => _isLoading; + 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; + Customer? get loggedInUser => _loggedInUser; String? get forgotPasswordMessage => _forgotPasswordMessage; String? resetToken; @@ -159,8 +169,8 @@ class AuthViewModel with ChangeNotifier { } Future forgotPassword(BuildContext context) async { - _isLoading = true; - _errorMessage = null; + _isLoadingForgot = true; + _errorMessageForget = null; successMessage = null; notifyListeners(); @@ -170,31 +180,35 @@ class AuthViewModel with ChangeNotifier { switch (result) { case Ok(): - _isLoading = false; + _isLoadingForgot = false; successMessage = result.value.message; notifyListeners(); + log('$successMessage'); - Future.microtask(() { - successMessage = null; - }); break; case Error(): - _isLoading = false; - _errorMessage = result.error.toString(); + _isLoadingForgot = false; + _errorMessageForget = result.error.toString(); notifyListeners(); Future.microtask(() { - _errorMessage = null; + _errorMessageForget = null; }); break; } } - Future verifyOtp(BuildContext context) async { - _isLoading = true; + void clearMessages() { + successMessage = null; _errorMessage = null; notifyListeners(); + } + + Future verifyOtp(BuildContext context) async { + _isLoadingOtp = true; + _errorMessageOtp = null; + notifyListeners(); final result = await _authRepository.verifyOtp( code: otpController.text.trim(), @@ -203,22 +217,19 @@ class AuthViewModel with ChangeNotifier { switch (result) { case Ok(): - _isLoading = false; + _isLoadingOtp = false; resetToken = result.value.data.token; - - Navigator.push( - context, - MaterialPageRoute(builder: (_) => const ForgotPasswordCreateScreen()), - ); break; case Error(): - _isLoading = false; - _errorMessage = result.error.toString(); + _isLoadingOtp = false; + _errorMessageOtp = result.error.toString(); break; } + notifyListeners(); - _errorMessage = null; + + _errorMessageOtp = null; notifyListeners(); } diff --git a/lib/views/forget_password_otp.dart/pages/d_forget_password_otp.dart_page.dart b/lib/views/forget_password_otp.dart/pages/d_forget_password_otp.dart_page.dart index ca5b90b..56d38c2 100644 --- a/lib/views/forget_password_otp.dart/pages/d_forget_password_otp.dart_page.dart +++ b/lib/views/forget_password_otp.dart/pages/d_forget_password_otp.dart_page.dart @@ -7,13 +7,53 @@ 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 '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; +import '../../forget_password_create/pages/forgot_password_create_screen.dart'; -class DesktopForgotPasswordOtpPage extends StatelessWidget { +class DesktopForgotPasswordOtpPage extends StatefulWidget { const DesktopForgotPasswordOtpPage({super.key}); + @override + State createState() => + _DesktopForgotPasswordOtpPageState(); +} + +class _DesktopForgotPasswordOtpPageState + extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.errorMessageOtp != null) { + AppToast.error(context, viewModel.errorMessageOtp!); + } + + if (viewModel.resetToken != null) { + Router.neglect( + context, + () => Navigator.push( + context, + MaterialPageRoute(builder: (_) => const ForgotPasswordCreateScreen()), + ), + ); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -26,7 +66,6 @@ class DesktopForgotPasswordOtpPage extends StatelessWidget { return Center( child: SizedBox( width: 364, - child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -62,9 +101,6 @@ class DesktopForgotPasswordOtpPage extends StatelessWidget { controller: viewModel.otpController, length: 5, pinAnimationType: PinAnimationType.scale, - onCompleted: (value) { - debugPrint('OTP: $value'); - }, defaultPinTheme: PinTheme( width: 50.0.w(), height: 50.0.h(), @@ -80,24 +116,22 @@ class DesktopForgotPasswordOtpPage extends StatelessWidget { ), ), SizedBox(height: 24.0.h()), - viewModel.isLoading + viewModel.isLoadingOtp ? const BaseButton( - isEnabled: false, - text: ForgotPasswordOtpStrings.resetLink, - onPressed: null, - ) + isEnabled: false, + text: ForgotPasswordOtpStrings.resetLink, + onPressed: null, + ) : BaseButton( - isEnabled: viewModel.canSubmitOtpPage, - text: ForgotPasswordOtpStrings.resetLink, - onPressed: - viewModel.canSubmitOtpPage - ? () async { + isEnabled: viewModel.canSubmitOtpPage, + text: ForgotPasswordOtpStrings.resetLink, + onPressed: viewModel.canSubmitOtpPage + ? () async { await viewModel.verifyOtp(context); } - : null, - ), + : null, + ), const SizedBox(height: 12.0), - TextButton( onPressed: () { context.pop(); diff --git a/lib/views/forget_password_otp.dart/pages/m_forget_password_otp.dart_page.dart b/lib/views/forget_password_otp.dart/pages/m_forget_password_otp.dart_page.dart index 3f18524..cff1604 100644 --- a/lib/views/forget_password_otp.dart/pages/m_forget_password_otp.dart_page.dart +++ b/lib/views/forget_password_otp.dart/pages/m_forget_password_otp.dart_page.dart @@ -3,17 +3,51 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:pinput/pinput.dart'; import 'package:provider/provider.dart'; +import 'package:tm_app/core/routes/app_routes.dart'; 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 '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; -class MobileForgotPasswordOtpPage extends StatelessWidget { +class MobileForgotPasswordOtpPage extends StatefulWidget { const MobileForgotPasswordOtpPage({super.key}); + @override + State createState() => + _MobileForgotPasswordOtpPageState(); +} + +class _MobileForgotPasswordOtpPageState + extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.errorMessageOtp != null) { + AppToast.error(context, viewModel.errorMessageOtp!); + } + + if (viewModel.resetToken != null) { + const ForgotPasswordCreateRouteData().push(context); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -58,9 +92,6 @@ class MobileForgotPasswordOtpPage extends StatelessWidget { controller: viewModel.otpController, length: 5, pinAnimationType: PinAnimationType.scale, - onCompleted: (value) { - debugPrint('OTP: $value'); - }, defaultPinTheme: PinTheme( width: 50.0.w(), height: 50.0.h(), @@ -76,7 +107,7 @@ class MobileForgotPasswordOtpPage extends StatelessWidget { ), ), SizedBox(height: 24.0.h()), - viewModel.isLoading + viewModel.isLoadingOtp ? const BaseButton( isEnabled: false, text: ForgotPasswordOtpStrings.resetLink, @@ -92,7 +123,6 @@ class MobileForgotPasswordOtpPage extends StatelessWidget { } : null, ), - TextButton( onPressed: () { context.pop(); diff --git a/lib/views/forget_password_otp.dart/pages/t_forget_password_otp.dart_page.dart b/lib/views/forget_password_otp.dart/pages/t_forget_password_otp.dart_page.dart index bcb183a..529dff5 100644 --- a/lib/views/forget_password_otp.dart/pages/t_forget_password_otp.dart_page.dart +++ b/lib/views/forget_password_otp.dart/pages/t_forget_password_otp.dart_page.dart @@ -7,13 +7,53 @@ 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 '../../shared/base_button.dart'; import '../strings/forgot_password_otp_strings.dart'; +import '../../forget_password_create/pages/forgot_password_create_screen.dart'; -class TabletForgotPasswordOtpPage extends StatelessWidget { +class TabletForgotPasswordOtpPage extends StatefulWidget { const TabletForgotPasswordOtpPage({super.key}); + @override + State createState() => + _TabletForgotPasswordOtpPageState(); +} + +class _TabletForgotPasswordOtpPageState + extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.errorMessageOtp != null) { + AppToast.error(context, viewModel.errorMessageOtp!); + } + + if (viewModel.resetToken != null) { + Router.neglect( + context, + () => Navigator.push( + context, + MaterialPageRoute(builder: (_) => const ForgotPasswordCreateScreen()), + ), + ); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -26,7 +66,6 @@ class TabletForgotPasswordOtpPage extends StatelessWidget { return Center( child: SizedBox( width: 364, - child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -62,9 +101,6 @@ class TabletForgotPasswordOtpPage extends StatelessWidget { controller: viewModel.otpController, length: 5, pinAnimationType: PinAnimationType.scale, - onCompleted: (value) { - debugPrint('OTP: $value'); - }, defaultPinTheme: PinTheme( width: 50.0.w(), height: 50.0.h(), @@ -80,24 +116,22 @@ class TabletForgotPasswordOtpPage extends StatelessWidget { ), ), SizedBox(height: 24.0.h()), - viewModel.isLoading + viewModel.isLoadingOtp ? const BaseButton( - isEnabled: false, - text: ForgotPasswordOtpStrings.resetLink, - onPressed: null, - ) + isEnabled: false, + text: ForgotPasswordOtpStrings.resetLink, + onPressed: null, + ) : BaseButton( - isEnabled: viewModel.canSubmitOtpPage, - text: ForgotPasswordOtpStrings.resetLink, - onPressed: - viewModel.canSubmitOtpPage - ? () async { + isEnabled: viewModel.canSubmitOtpPage, + text: ForgotPasswordOtpStrings.resetLink, + onPressed: viewModel.canSubmitOtpPage + ? () async { await viewModel.verifyOtp(context); } - : null, - ), + : null, + ), const SizedBox(height: 12.0), - TextButton( onPressed: () { context.pop(); 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 cd1a46c..69c2c05 100644 --- a/lib/views/forgot_password/pages/d_forgot_apssword_page.dart +++ b/lib/views/forgot_password/pages/d_forgot_apssword_page.dart @@ -12,9 +12,43 @@ import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; -class DesktopForgotPasswordPage extends StatelessWidget { +class DesktopForgotPasswordPage extends StatefulWidget { const DesktopForgotPasswordPage({super.key}); + @override + State createState() => + _DesktopForgotPasswordPageState(); +} + +class _DesktopForgotPasswordPageState extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.successMessage != null) { + AppToast.success(context, viewModel.successMessage!); + const ForgotPasswordOtpRouteData().push(context); + viewModel.clearMessages(); + } + + if (viewModel.errorMessageForget != null) { + AppToast.error(context, viewModel.errorMessageForget!); + viewModel.clearMessages(); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -22,17 +56,6 @@ class DesktopForgotPasswordPage extends StatelessWidget { body: Center( child: Consumer( builder: (context, viewModel, _) { - if (viewModel.successMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.success(context, viewModel.successMessage!); - const ForgotPasswordOtpRouteData().push(context); - }); - } else if (viewModel.errorMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.error(context, viewModel.errorMessage!); - }); - } - return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -78,22 +101,21 @@ class DesktopForgotPasswordPage extends StatelessWidget { isPassword: false, ), SizedBox(height: 70.0.h()), - viewModel.isLoading + viewModel.isLoadingForgot ? const BaseButton( - isEnabled: false, - text: ForgotPasswordStrings.resetLink, - onPressed: null, - ) + isEnabled: false, + text: ForgotPasswordStrings.resetLink, + onPressed: null, + ) : BaseButton( - isEnabled: viewModel.isEmailValid, - text: ForgotPasswordStrings.resetLink, - onPressed: - viewModel.isEmailValid - ? () async { + isEnabled: viewModel.isEmailValid, + text: ForgotPasswordStrings.resetLink, + onPressed: viewModel.isEmailValid + ? () async { await viewModel.forgotPassword(context); } - : null, - ), + : null, + ), const SizedBox(height: 12), TextButton( onPressed: () { 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 65498f7..b69a41e 100644 --- a/lib/views/forgot_password/pages/m_forgot_password_page.dart +++ b/lib/views/forgot_password/pages/m_forgot_password_page.dart @@ -12,9 +12,43 @@ import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; -class MobileForgotPasswordPage extends StatelessWidget { +class MobileForgotPasswordPage extends StatefulWidget { const MobileForgotPasswordPage({super.key}); + @override + State createState() => + _MobileForgotPasswordPageState(); +} + +class _MobileForgotPasswordPageState extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.successMessage != null) { + AppToast.success(context, viewModel.successMessage!); + const ForgotPasswordOtpRouteData().push(context); + viewModel.clearMessages(); + } + + if (viewModel.errorMessageForget != null) { + AppToast.error(context, viewModel.errorMessageForget!); + viewModel.clearMessages(); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -24,17 +58,6 @@ class MobileForgotPasswordPage extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: Consumer( builder: (context, viewModel, _) { - if (viewModel.successMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.success(context, viewModel.successMessage!); - const ForgotPasswordOtpRouteData().push(context); - }); - } else if (viewModel.errorMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.error(context, viewModel.errorMessage!); - }); - } - return Column( mainAxisSize: MainAxisSize.min, children: [ @@ -73,22 +96,21 @@ class MobileForgotPasswordPage extends StatelessWidget { isPassword: false, ), SizedBox(height: 24.0.h()), - viewModel.isLoading + viewModel.isLoadingForgot ? const BaseButton( - isEnabled: false, - text: ForgotPasswordStrings.resetLink, - onPressed: null, - ) + isEnabled: false, + text: ForgotPasswordStrings.resetLink, + onPressed: null, + ) : BaseButton( - isEnabled: viewModel.isEmailValid, - text: ForgotPasswordStrings.resetLink, - onPressed: - viewModel.isEmailValid - ? () async { + isEnabled: viewModel.isEmailValid, + text: ForgotPasswordStrings.resetLink, + onPressed: viewModel.isEmailValid + ? () async { await viewModel.forgotPassword(context); } - : null, - ), + : null, + ), TextButton( onPressed: () { Navigator.pop(context); 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 24a29dd..420f552 100644 --- a/lib/views/forgot_password/pages/t_forgot_password_page.dart +++ b/lib/views/forgot_password/pages/t_forgot_password_page.dart @@ -12,25 +12,48 @@ import '../../login/widgets/login_textfield.dart'; import '../../shared/base_button.dart'; import '../strings/forgot_password_strings.dart'; -class TabletForgotPasswordPage extends StatelessWidget { +class TabletForgotPasswordPage extends StatefulWidget { const TabletForgotPasswordPage({super.key}); + @override + State createState() => + _TabletForgotPasswordPageState(); +} + +class _TabletForgotPasswordPageState extends State { + late final AuthViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + } + + void _viewModelListener() { + if (viewModel.successMessage != null) { + AppToast.success(context, viewModel.successMessage!); + const ForgotPasswordOtpRouteData().push(context); + viewModel.clearMessages(); + } + + if (viewModel.errorMessageForget != null) { + AppToast.error(context, viewModel.errorMessageForget!); + viewModel.clearMessages(); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( body: Consumer( builder: (context, viewModel, _) { - if (viewModel.successMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.success(context, viewModel.successMessage!); - const ForgotPasswordOtpRouteData().push(context); - }); - } else if (viewModel.errorMessage != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - AppToast.error(context, viewModel.errorMessage!); - }); - } - return Center( child: SizedBox( width: 364, @@ -72,22 +95,21 @@ class TabletForgotPasswordPage extends StatelessWidget { isPassword: false, ), SizedBox(height: 24.0.h()), - viewModel.isLoading + viewModel.isLoadingForgot ? const BaseButton( - isEnabled: false, - text: ForgotPasswordStrings.resetLink, - onPressed: null, - ) + isEnabled: false, + text: ForgotPasswordStrings.resetLink, + onPressed: null, + ) : BaseButton( - isEnabled: viewModel.isEmailValid, - text: ForgotPasswordStrings.resetLink, - onPressed: - viewModel.isEmailValid - ? () async { + isEnabled: viewModel.isEmailValid, + text: ForgotPasswordStrings.resetLink, + onPressed: viewModel.isEmailValid + ? () async { await viewModel.forgotPassword(context); } - : null, - ), + : null, + ), const SizedBox(height: 12), TextButton( onPressed: () {