login_bloc.dart 4.58 KB
import 'dart:js';

import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';

import '../../../../common/request/api_response/api_response_entity.dart';
import '../../../../common/request/apis.dart';
import '../../../../common/request/request.dart';
import '../../../../common/request/request_client.dart';
import '../../../../models/user_entity.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';

    request(() async {
      var params = {'phoneNum': phoneNumber, 'type': type, checkKey: checkNumber};
      await requestClient.post(
        Apis.login,
        data: params,
        onResponse: (ApiResponse<UserEntity> response) {
          print('response=$response');
          // todo 持久化用户对象
          // todo 写入全局对象
          //emitter.call(LoginResultChangeState());
        },
        onError: (e) {
          EasyLoading.showToast('登陆失败:${e.message}');
          return true;
        },
      );
    });
  }

  ///请求验证码
  void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter<LoginState> emitter) async {

  }

  ///切换登陆方式
  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;
  }
}