diff --git a/assets/images/Password_invisible.svg b/assets/images/Password_invisible.svg
new file mode 100644
index 00000000..bb190eb3
--- /dev/null
+++ b/assets/images/Password_invisible.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/password_visible.svg b/assets/images/password_visible.svg
new file mode 100644
index 00000000..25c55434
--- /dev/null
+++ b/assets/images/password_visible.svg
@@ -0,0 +1,3 @@
+
diff --git a/lib/main.dart b/lib/main.dart
index 629a8725..6fbc2cb1 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,8 +1,7 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
-import 'package:syncrow_web/pages/auth/login/view/login_page.dart';
+import 'package:syncrow_web/pages/auth/view/login_page.dart';
import 'package:syncrow_web/services/locator.dart';
-
void main() {
WidgetsFlutterBinding.ensureInitialized();
initialSetup();
diff --git a/lib/pages/auth/login/bloc/login_bloc.dart b/lib/pages/auth/bloc/auth_bloc.dart
similarity index 59%
rename from lib/pages/auth/login/bloc/login_bloc.dart
rename to lib/pages/auth/bloc/auth_bloc.dart
index 080dfd01..f6931e7b 100644
--- a/lib/pages/auth/login/bloc/login_bloc.dart
+++ b/lib/pages/auth/bloc/auth_bloc.dart
@@ -1,28 +1,104 @@
+import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
-import 'package:syncrow_web/pages/auth/login/bloc/login_event.dart';
-import 'package:syncrow_web/pages/auth/login/bloc/login_state.dart';
-import 'package:syncrow_web/pages/auth/login/model/login_with_email_model.dart';
-import 'package:syncrow_web/pages/auth/login/model/token.dart';
-import 'package:syncrow_web/pages/auth/login/model/user_model.dart';
+import 'package:syncrow_web/pages/auth/bloc/auth_event.dart';
+import 'package:syncrow_web/pages/auth/bloc/auth_state.dart';
+import 'package:syncrow_web/pages/auth/model/login_with_email_model.dart';
+import 'package:syncrow_web/pages/auth/model/token.dart';
+import 'package:syncrow_web/pages/auth/model/user_model.dart';
import 'package:syncrow_web/services/auth_api.dart';
import 'package:syncrow_web/utils/snack_bar.dart';
-class LoginBloc extends Bloc {
- LoginBloc() : super(LoginInitial()) {
+class AuthBloc extends Bloc {
+ AuthBloc() : super(LoginInitial()) {
on(_login);
- on(checkBoxTgl);
+ on(checkBoxToggle);
+ on(changePassword);
+ on(_onStartTimer);
+ on(_onStopTimer);
+ on(_onUpdateTimer);
+ on(_passwordVisible);
+
}
- final TextEditingController emailController = TextEditingController();
- final TextEditingController passwordController = TextEditingController();
- final formKey = GlobalKey();
- bool isChecked = false;
- bool obscureText = true;
- _login(LoginButtonPressed event, Emitter emit) async {
+////////////////////////////// forget password //////////////////////////////////
+ final TextEditingController forgetEmailController = TextEditingController();
+ final TextEditingController forgetPasswordController = TextEditingController();
+ final TextEditingController forgetOtp = TextEditingController();
+ final forgetFormKey = GlobalKey();
+
+ Timer? _timer;
+ int _remainingTime = 0;
+
+ Future _onStartTimer(StartTimerEvent event, Emitter emit) async {
+ if (_validateInputs(emit)) return;
+ print("StartTimerEvent received");
+ if (_timer != null && _timer!.isActive) {
+ print("Timer is already active");
+ return;
+ }
+ _remainingTime = 60;
+ add(UpdateTimerEvent(
+ remainingTime: _remainingTime, isButtonEnabled: false));
+ print("Timer started, initial remaining time: $_remainingTime");
+ await AuthenticationAPI.sendOtp(email: forgetEmailController.text);
+ _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
+ _remainingTime--;
+ print("Timer tick, remaining time: $_remainingTime"); // Debug print
+ if (_remainingTime <= 0) {
+ _timer?.cancel();
+ add(const UpdateTimerEvent(remainingTime: 0, isButtonEnabled: true));
+ print("Timer finished"); // Debug print
+ } else {
+ add(UpdateTimerEvent(remainingTime: _remainingTime, isButtonEnabled: false));
+ }
+ });
+ }
+
+ void _onStopTimer(StopTimerEvent event, Emitter emit) {
+ _timer?.cancel();
+ emit(const TimerState(isButtonEnabled: true, remainingTime: 0));
+ }
+
+ Future changePassword(
+ ChangePasswordEvent event, Emitter emit) async {
+ try {
+ emit(LoadingForgetState());
+ await AuthenticationAPI.forgetPassword(
+ password: forgetPasswordController.text, email: forgetEmailController.text);
+ emit(SuccessForgetState());
+ } catch (failure) {
+ print(failure);
+ emit(FailureForgetState(error: failure.toString()));
+ }
+ }
+
+
+ void _onUpdateTimer(UpdateTimerEvent event, Emitter emit) {
+ emit(TimerState(
+ isButtonEnabled: event.isButtonEnabled,
+ remainingTime: event.remainingTime));
+ }
+
+ ///////////////////////////////////// login /////////////////////////////////////
+ final TextEditingController loginEmailController = TextEditingController();
+ final TextEditingController loginPasswordController = TextEditingController();
+ final loginFormKey = GlobalKey();
+ bool isChecked = false;
+ bool obscureText = false;
+
+ String newPassword = '';
+ String maskedEmail = '';
+ String otpCode = '';
+
+ static Token token = Token.emptyConstructor();
+ static UserModel? user;
+ bool showValidationMessage = false;
+
+ void _login(LoginButtonPressed event, Emitter emit) async {
emit(LoginLoading());
if(isChecked) {
try {
@@ -54,8 +130,8 @@ class LoginBloc extends Bloc {
value: Token.decodeToken(token.accessToken)['uuid'].toString()
);
user = UserModel.fromToken(token);
- emailController.clear();
- passwordController.clear();
+ loginEmailController.clear();
+ loginPasswordController.clear();
emit(LoginSuccess());
} else {
emit(const LoginFailure(error: 'Something went wrong'));
@@ -66,12 +142,17 @@ class LoginBloc extends Bloc {
}
}
- checkBoxTgl(CheckBoxEvent event, Emitter emit,){
+ checkBoxToggle(CheckBoxEvent event, Emitter emit,){
emit(LoginLoading());
isChecked = event.newValue!;
emit(LoginInitial());
}
+ void _passwordVisible(PasswordVisibleEvent event, Emitter emit) {
+ emit(LoginLoading());
+ obscureText = !event.newValue!;
+ emit(PasswordVisibleState());
+ }
void launchURL(String url) {
if (kDebugMode) {
@@ -80,16 +161,6 @@ class LoginBloc extends Bloc {
}
-
- String newPassword = '';
- String maskedEmail = '';
- String otpCode = '';
-
- static Token token = Token.emptyConstructor();
- static UserModel? user;
-
- bool showValidationMessage = false;
-
/////////////////////////////////////VALIDATORS/////////////////////////////////////
String? validatePassword(String? value) {
@@ -110,8 +181,23 @@ class LoginBloc extends Bloc {
return null;
}
+ String? validateCode(String? value) {
+ if (value == null || value.isEmpty) {
+ return 'Code is required';
+ }
+ return null;
+ }
-
+ bool _validateInputs(Emitter emit) {
+ emit(LoadingForgetState());
+ final nameError = validateEmail(forgetEmailController.text);
+ if (nameError != null) {
+ emit(FailureForgetState(error:nameError )) ;
+ // CustomSnackBar.displaySnackBar(nameError);
+ return true;
+ }
+ return false;
+ }
String? validateRegion(String? value) {
if (value == null || value.isEmpty) {
@@ -227,7 +313,6 @@ class LoginBloc extends Bloc {
return '$maskedLocalPart@$domainPart';
}
-
final List regions = [
'North America',
'South America',
@@ -238,31 +323,5 @@ class LoginBloc extends Bloc {
'Antarctica',
];
- // signUp() async {
- // emit(LoginLoading());
- // final response;
- // try {
- // List userFullName = fullName.split(' ');
- // response = await AuthenticationAPI.signUp(
- // model: SignUpModel(
- // email: email.toLowerCase(),
- // password: signUpPassword,
- // firstName: userFullName[0],
- // lastName: userFullName[1]),
- // );
- // } catch (failure) {
- // emit(AuthLoginError(message: failure.toString()));
- // return;
- // }
- // if (response) {
- // maskedEmail = maskEmail(email);
- // await sendOtp();
- // } else {
- // emit(AuthLoginError(message: 'Something went wrong'));
- // }
- // }
-
-
-
}
diff --git a/lib/pages/auth/bloc/auth_event.dart b/lib/pages/auth/bloc/auth_event.dart
new file mode 100644
index 00000000..cdcfc51e
--- /dev/null
+++ b/lib/pages/auth/bloc/auth_event.dart
@@ -0,0 +1,52 @@
+import 'package:equatable/equatable.dart';
+
+abstract class AuthEvent extends Equatable {
+ const AuthEvent();
+
+ @override
+ List