mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-09 22:57:21 +00:00
202 lines
6.2 KiB
Dart
202 lines
6.2 KiB
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/bloc/login_event.dart';
|
|
import 'package:syncrow_web/pages/auth/bloc/login_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<LoginEvent, LoginState> {
|
|
LoginBloc() : super(LoginInitial()) {
|
|
on<LoginButtonPressed>(_login);
|
|
}
|
|
|
|
|
|
final TextEditingController emailController = TextEditingController();
|
|
final TextEditingController passwordController = TextEditingController();
|
|
|
|
String fullName = '';
|
|
String email = '';
|
|
String forgetPasswordEmail = '';
|
|
String signUpPassword = '';
|
|
String newPassword = '';
|
|
String maskedEmail = '';
|
|
String otpCode = '';
|
|
|
|
final loginFormKey = GlobalKey<FormState>();
|
|
final signUpFormKey = GlobalKey<FormState>();
|
|
final checkEmailFormKey = GlobalKey<FormState>();
|
|
final createNewPasswordKey = GlobalKey<FormState>();
|
|
static Token token = Token.emptyConstructor();
|
|
static UserModel? user;
|
|
|
|
bool isPasswordVisible = false;
|
|
bool showValidationMessage = false;
|
|
|
|
|
|
/////////////////////////////////////VALIDATORS/////////////////////////////////////
|
|
String? passwordValidator(String? value) {
|
|
if (value != null) {
|
|
if (value.isEmpty) {
|
|
return 'Please enter your password';
|
|
}
|
|
if (value.isNotEmpty) {
|
|
if (!RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$')
|
|
.hasMatch(value)) {
|
|
return 'Password must contain at least:\n - one uppercase letter.\n - one lowercase letter.\n - one number. \n - special character';
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
String? fullNameValidator(String? value) {
|
|
if (value == null) return 'Full name is required';
|
|
|
|
final withoutExtraSpaces = value.replaceAll(RegExp(r"\s+"), ' ').trim();
|
|
|
|
if (withoutExtraSpaces.length < 2 || withoutExtraSpaces.length > 30) {
|
|
return 'Full name must be between 2 and 30 characters long';
|
|
}
|
|
|
|
// Test if it contains anything but alphanumeric spaces and single quote
|
|
|
|
if (RegExp(r"/[^ a-zA-Z0-9-\']/").hasMatch(withoutExtraSpaces)) {
|
|
return 'Only alphanumeric characters, space, dash and single quote are allowed';
|
|
}
|
|
|
|
final parts = withoutExtraSpaces.split(' ');
|
|
|
|
if (parts.length < 2) return 'Full name must contain first and last names';
|
|
|
|
if (parts.length > 3) return 'Full name can at most contain 3 parts';
|
|
|
|
if (parts.any((part) => part.length < 2 || part.length > 30)) {
|
|
return 'Full name parts must be between 2 and 30 characters long';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
String? reEnterPasswordCheck(String? value) {
|
|
passwordValidator(value);
|
|
if (signUpPassword == value) {
|
|
return null;
|
|
} else {
|
|
return 'Passwords do not match';
|
|
}
|
|
}
|
|
|
|
String? reEnterPasswordCheckForgetPass(String? value) {
|
|
passwordValidator(value);
|
|
if (newPassword == value) {
|
|
return null;
|
|
} else {
|
|
return 'Passwords do not match';
|
|
}
|
|
}
|
|
|
|
String? emailAddressValidator(String? value) {
|
|
if (value != null && value.isNotEmpty && value != "") {
|
|
if (checkValidityOfEmail(value)) {
|
|
return null;
|
|
} else {
|
|
return 'Please enter a valid email';
|
|
}
|
|
} else {
|
|
return 'Email address is required';
|
|
}
|
|
}
|
|
|
|
bool checkValidityOfEmail(String? email) {
|
|
if (email != null) {
|
|
return RegExp(
|
|
r"^[a-zA-Z0-9]+([.!#$%&'*+/=?^_`{|}~-]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([.-]?[a-zA-Z0-9]+)*\.[a-zA-Z0-9]{2,}$")
|
|
.hasMatch(email);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
String maskEmail(String email) {
|
|
final emailParts = email.split('@');
|
|
if (emailParts.length != 2) return email;
|
|
|
|
final localPart = emailParts[0];
|
|
final domainPart = emailParts[1];
|
|
|
|
if (localPart.length < 3) return email;
|
|
|
|
final start = localPart.substring(0, 2);
|
|
final end = localPart.substring(localPart.length - 1);
|
|
|
|
final maskedLocalPart = '$start******$end';
|
|
return '$maskedLocalPart@$domainPart';
|
|
}
|
|
|
|
_login(LoginButtonPressed event, Emitter<LoginState> emit) async {
|
|
emit(LoginLoading());
|
|
try {
|
|
if (event.username.isEmpty ||event.password.isEmpty) {
|
|
CustomSnackBar.displaySnackBar('Please enter your credentials');
|
|
emit(const LoginFailure(error: 'Something went wrong'));
|
|
return;
|
|
}
|
|
|
|
token = await AuthenticationAPI.loginWithEmail(
|
|
model: LoginWithEmailModel(
|
|
email: event.username,
|
|
password: event.password,
|
|
),
|
|
);
|
|
} catch (failure) {
|
|
emit( LoginFailure(error: failure.toString()));
|
|
return;
|
|
}
|
|
if (token.accessTokenIsNotEmpty) {
|
|
debugPrint('token: ${token.accessToken}');
|
|
FlutterSecureStorage storage = const FlutterSecureStorage();
|
|
await storage.write(key: Token.loginAccessTokenKey, value: token.accessToken);
|
|
|
|
const FlutterSecureStorage().write(
|
|
key: UserModel.userUuidKey,
|
|
value: Token.decodeToken(token.accessToken)['uuid'].toString()
|
|
);
|
|
|
|
user = UserModel.fromToken(token);
|
|
emailController.clear();
|
|
passwordController.clear();
|
|
emit(LoginSuccess());
|
|
} else {
|
|
emit(const LoginFailure(error: 'Something went wrong'));
|
|
}
|
|
}
|
|
|
|
// signUp() async {
|
|
// emit(LoginLoading());
|
|
// final response;
|
|
// try {
|
|
// List<String> 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'));
|
|
// }
|
|
// }
|
|
|
|
}
|