import 'dart:async'; import 'package:aitrainer_app/bloc/account/account_bloc.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/customer.dart'; import 'package:aitrainer_app/repository/customer_repository.dart'; import 'package:aitrainer_app/repository/mautic_repository.dart'; import 'package:aitrainer_app/repository/split_test_respository.dart'; import 'package:aitrainer_app/repository/training_plan_repository.dart'; import 'package:aitrainer_app/repository/user_repository.dart'; import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/track.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; part 'login_event.dart'; part 'login_state.dart'; class LoginBloc extends Bloc with Trans { final AccountBloc accountBloc; final UserRepository userRepository; late CustomerRepository? customerRepository; final SplitTestRepository splitTestRepository = SplitTestRepository(); final BuildContext context; final bool isRegistration; bool dataPolicyAllowed = false; bool emailSubscription = false; bool obscure = true; Color testColor = Colors.green[800]!; bool emailCheckbox = true; LoginBloc( {required this.accountBloc, required this.userRepository, required this.context, required this.isRegistration, this.customerRepository}) : super(LoginInitial()) { this._init(); on(_onEmailChange); on(_onPasswordChange); on(_onSubmit); on(_onLoginFB); on(_onLoginGoogle); on(_onLoginApple); on(_onRegistrationSubmit); on(_onRegistrationFB); on(_onRegistrationGoogle); on(_onRegistrationApple); on(_onDataProtectionClicked); on(_onEmailSubscriptionClicked); on(_onPasswordChangeObscure); on(_onLoginSkip); } void _init() { String colorString = splitTestRepository.getSplitTestValue("registration_skip"); if (colorString == "red") { testColor = Colors.red[800]!; } String emailCheckboxString = splitTestRepository.getSplitTestValue("email_checkbox"); if (emailCheckboxString == "0") { emailCheckbox = false; } if (customerRepository == null) { customerRepository = CustomerRepository(); } } void _onEmailChange(LoginEmailChange event, Emitter emit) { emit(LoginLoading()); final String email = event.email; userRepository.setEmail(email); emit(LoginReady()); } void _onPasswordChange(LoginPasswordChange event, Emitter emit) { emit(LoginLoading()); final String password = event.password; userRepository.setPassword(password); emit(LoginReady()); } void _onSubmit(LoginSubmit event, Emitter emit) async { emit(LoginLoading()); try { await userRepository.getUser(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); Track().track(TrackingEvent.login, eventValue: "email"); Cache().setLoginType(LoginType.email); emit(LoginSuccess()); } on Exception catch (e) { print("Login error: $e" ); emit(LoginError(message: e.toString())); } } void _onLoginFB(LoginFB event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.fb); await userRepository.getUserByFB(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); Track().track(TrackingEvent.login, eventValue: "FB"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onLoginGoogle(LoginGoogle event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.google); await userRepository.getUserByGoogle(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); Track().track(TrackingEvent.login, eventValue: "Google"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onLoginApple(LoginApple event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.apple); await userRepository.getUserByApple(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); Track().track(TrackingEvent.login, eventValue: "Apple"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onRegistrationSubmit(RegistrationSubmit event, Emitter emit) async { emit(LoginLoading()); try { final String? validationError = this.validate(); if (validationError != null) { emit(LoginError(message: validationError)); } else { await userRepository.addUser(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); customerRepository!.customer!.emailSubscription = emailSubscription == true ? 1 : 0; await afterRegistration("email"); Cache().setLoginType(LoginType.email); emit(LoginSuccess()); } } on Exception catch (e) { emit(LoginError(message: e.toString())); return; } } void _onRegistrationFB(RegistrationFB event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.fb); await userRepository.addUserFB(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); customerRepository!.customer!.emailSubscription = emailSubscription == true ? 1 : 0; await afterRegistration("FB"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onRegistrationGoogle(RegistrationGoogle event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.google); await userRepository.addUserGoogle(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); customerRepository!.customer!.emailSubscription = emailSubscription == true ? 1 : 0; await afterRegistration("Google"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onRegistrationApple(RegistrationApple event, Emitter emit) async { emit(LoginLoading()); try { Cache().setLoginType(LoginType.apple); await userRepository.addUserApple(); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); customerRepository!.customer!.emailSubscription = emailSubscription == true ? 1 : 0; await afterRegistration("Apple"); emit(LoginSuccess()); } on Exception catch (e) { emit(LoginError(message: e.toString())); } } void _onDataProtectionClicked(DataProtectionClicked event, Emitter emit) async { emit(LoginLoading()); this.dataPolicyAllowed = !dataPolicyAllowed; emit(LoginReady()); } void _onEmailSubscriptionClicked(EmailSubscriptionClicked event, Emitter emit) async { emit(LoginLoading()); this.emailSubscription = !emailSubscription; emit(LoginReady()); } void _onPasswordChangeObscure(LoginPasswordChangeObscure event, Emitter emit) async { emit(LoginLoading()); this.obscure = !this.obscure; emit(LoginReady()); } void _onLoginSkip(LoginSkip event, Emitter emit) async { emit(LoginLoading()); Track().track(TrackingEvent.login_skip); Cache().startPage = "home"; emit(LoginSkipped()); } Future afterRegistration(String event) async { Customer tempCustomer = customerRepository!.customer!; customerRepository!.customer = Cache().userLoggedIn!; customerRepository!.customer!.fitnessLevel = tempCustomer.fitnessLevel; customerRepository!.customer!.goal = tempCustomer.goal; customerRepository!.customer!.sex = tempCustomer.sex; customerRepository!.customer!.dataPolicyAllowed = 1; customerRepository!.customer!.emailSubscription = 1; customerRepository!.customer!.syncedDate = DateTime.now(); customerRepository!.customer!.lang = AppLanguage().appLocal.languageCode; customerRepository!.setCustomerProperty("Weight", tempCustomer.getProperty("Weight")); customerRepository!.setCustomerProperty("Height", tempCustomer.getProperty("Height")); await customerRepository!.saveCustomer(); MauticRepository mauticRepository = MauticRepository(customerRepository: customerRepository!); await mauticRepository.sendMauticSubscription(); TrainingPlanRepository trainingPlanRepository = TrainingPlanRepository(); trainingPlanRepository.generateTrainingPlan(); Track().track(TrackingEvent.registration, eventValue: event); } String? emailValidation(String? email) { String? message = Common.emailValidation(email); return message; } String? passwordValidation(String? value) { String? message = Common.passwordValidation(value); if (message != null) { message = t(message); } return message; } String? validate() { String? error; error = emailValidation(userRepository.user.email); if (error != null) { return error; } error = passwordValidation(userRepository.user.password); if (error != null) { return error; } return error; } }