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 { LoginBloc() : super(LoginInitial()) { on(_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(); final signUpFormKey = GlobalKey(); final checkEmailFormKey = GlobalKey(); final createNewPasswordKey = GlobalKey(); static Token token = Token.emptyConstructor(); static UserModel? user; bool isPasswordVisible = false; bool showValidationMessage = false; void _onPress(LoginButtonPressed event, Emitter emit) async { emit(LoginLoading()); await Future.delayed(const Duration(seconds: 2)); if (event.username == 'admin' && event.password == 'password') { emit(LoginSuccess()); } else { emit(const LoginFailure(error: 'Invalid credentials')); } } /////////////////////////////////////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 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 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')); // } // } }