login_bloc.dart 5.09 KB
import 'package:common_utils/common_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:wow_english/common/extension/string_extension.dart';
import 'package:wow_english/common/request/dao/user_dao.dart';
import 'package:wow_english/common/request/exception.dart';
import 'package:wow_english/common/request/request.dart';
import 'package:wow_english/models/user_entity.dart';
import 'package:wow_english/utils/loading.dart';

part 'login_event.dart';
part 'login_state.dart';

enum LoginType {
  ///密码登陆
  pwd,

  ///验证码登陆
  sms,
}

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  bool _canLogin = false;

  ///是否可以发送验证码
  bool _canSendSms = false;

  ///是否阅读协议
  bool _agreement = false;

  ///登陆方式
  //LoginType _loginType = LoginType.sms;
  bool _isSmsLoginType = true;

  final TextEditingController phoneNumController = TextEditingController();
  final TextEditingController checkNumController = TextEditingController();

  bool get canLogin => _canLogin;

  bool get agreement => _agreement;

  //LoginType get loginType => _loginType;

  bool get isSmsLoginType => _isSmsLoginType;

  bool get canSendSms => _canSendSms;

  LoginBloc() : super(LoginInitial()) {
    on<RequestLoginEvent>(_requestLoginApi);
    on<ChangeLoginTypeEvent>(_changeLoginType);
    on<PhoneNumChangeEvent>(_changePhoneNumber);
    on<AgreementChangeEvent>(_agreementTypeChange);
    on<CheckFieldChangeEvent>(_checkFiledChange);
    on<RequestSmsCodeEvent>(_requestSmsCodeApi);
  }

  ///请求登陆
  void _requestLoginApi(RequestLoginEvent event, Emitter<LoginState> emitter) async {
    var phoneNumber = phoneNumController.text;
    if (phoneNumber.isEmpty) {
      EasyLoading.showToast('号码不能为空');
      return;
    }

    var checkNumber = checkNumController.text;
    if (checkNumber.isEmpty) {
      var text = _isSmsLoginType ? '密码' : '验证码';
      EasyLoading.showToast('$text不能为空');
      return;
    }
    var checkKey = _isSmsLoginType ? 'smsCode' : 'password';
    var type = _isSmsLoginType ? 'sms_code' : 'pwd';


    try {
      request(() => null);

      await loading(() async {
        var user = await UserDao.login(phoneNumber, type, checkKey, checkNumber);
        if (kDebugMode) {
          print('UserEntity?=$user');
        }
        emitter.call(LoginResultChangeState(user!));
      });
    } catch (e) {
      if (kDebugMode) {
        print(e);
      }
      EasyLoading.showToast('登陆失败${(e as ApiException?)?.message?.prefixColon}');
    }
  }

  ///请求验证码
  void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter<LoginState> emitter) async {
    final phoneNumber = phoneNumController.text;
    if (!RegexUtil.isMobileExact(phoneNumber)) {
      EasyLoading.showToast('请检查手机号');
      return;
    }
    try {
      await loading(() async {
        await UserDao.sendCode(phoneNumber);
      });
      emitter(SmsCodeRequestState());
    } catch (e) {
      if (kDebugMode) {
        print(e);
      }
      EasyLoading.showToast('获取验证码失败${(e as ApiException?)?.message?.prefixColon}');
    }
  }

  ///切换登陆方式
  void _changeLoginType(ChangeLoginTypeEvent event, Emitter<LoginState> emitter) async {
    if (_isSmsLoginType) {
      _isSmsLoginType = false;
    } else {
      _isSmsLoginType = true;
    }
    checkNumController.clear();
    if (_loginStateChange()) {
      emitter(LoginEventChangeState());
    }
    emitter(LoginTypeChangeState());
  }

  ///手机号输入
  void _changePhoneNumber(PhoneNumChangeEvent event, Emitter<LoginState> emitter) async {
    if (phoneNumController.text.isNotEmpty) {
      if (!_canSendSms) {
        _canSendSms = true;
        emitter(SmsSendTypeChangeState());
      }
      if (_loginStateChange()) {
        emitter(LoginEventChangeState());
      }
    } else {
      if (_canSendSms) {
        _canSendSms = false;
        emitter(SmsSendTypeChangeState());
      }
      if (_loginStateChange()) {
        emitter(LoginEventChangeState());
      }
    }
  }

  ///验证码/密码输入变化
  void _checkFiledChange(CheckFieldChangeEvent event, Emitter<LoginState> emitter) async {
    if (_loginStateChange()) {
      emitter(LoginEventChangeState());
    }
  }

  ///是否阅读协议
  void _agreementTypeChange(AgreementChangeEvent event, Emitter<LoginState> emitter) async {
    _agreement = !_agreement;
    emitter(AgreementTypeChangeState());
    if (_loginStateChange()) {
      emitter(LoginEventChangeState());
    }
  }

  ///登陆状态判断
  bool _loginStateChange() {
    if (_agreement) {
      if (phoneNumController.text.isNotEmpty && checkNumController.text.isNotEmpty) {
        if (!_canLogin) {
          _canLogin = true;
          return true;
        }
      } else {
        if (_canLogin) {
          _canLogin = false;
          return true;
        }
      }
    } else {
      if (_canLogin) {
        _canLogin = false;
        return true;
      }
    }
    return false;
  }
}