Fixed password and otp bugs

This commit is contained in:
llsajjad
2025-09-17 15:58:49 +03:30
parent 9970d3f296
commit 6a51c3656a
11 changed files with 352 additions and 136 deletions
@@ -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<DesktopForgotPasswordPage> createState() =>
_DesktopForgotPasswordPageState();
}
class _DesktopForgotPasswordPageState extends State<DesktopForgotPasswordPage> {
late final AuthViewModel viewModel;
@override
void initState() {
super.initState();
viewModel = context.read<AuthViewModel>();
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<AuthViewModel>(
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: () {
@@ -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<MobileForgotPasswordPage> createState() =>
_MobileForgotPasswordPageState();
}
class _MobileForgotPasswordPageState extends State<MobileForgotPasswordPage> {
late final AuthViewModel viewModel;
@override
void initState() {
super.initState();
viewModel = context.read<AuthViewModel>();
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<AuthViewModel>(
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);
@@ -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<TabletForgotPasswordPage> createState() =>
_TabletForgotPasswordPageState();
}
class _TabletForgotPasswordPageState extends State<TabletForgotPasswordPage> {
late final AuthViewModel viewModel;
@override
void initState() {
super.initState();
viewModel = context.read<AuthViewModel>();
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<AuthViewModel>(
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: () {