set_pwd_bloc.dart 5.02 KB
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:wow_english/common/request/dao/user_dao.dart';
import 'package:wow_english/common/request/exception.dart';
import 'package:wow_english/utils/loading.dart';

import '../set_pwd_page.dart';

part 'set_pwd_event.dart';
part 'set_pwd_state.dart';

class SetPwdBloc extends Bloc<SetPwdEvent, SetPwdState> {
  final String? phoneNumber;
  final String? smsCode;
  late final SetPwdPageType pageType;

  final TextEditingController passWordFirstController = TextEditingController();
  final TextEditingController passWordSecondController = TextEditingController();

  ///密码是否符合规则(第一个输入框)
  bool _passwordEnsure = false;

  ///密码是否超过16位(第一个输入框)
  bool _passwordLarger = false;

  ///是否显示Icon(第一个输入框)
  bool _showPwdIcon = false;

  ///是否显示Icon(第二个输入框)
  bool _showCheckPwdIcon = false;

  ///密码是否一致
  bool _passwordCheck = true;

  bool get passwordEnsure => _passwordEnsure;

  bool get passwordCheck => _passwordCheck;

  bool get passwordLarger => _passwordLarger;

  bool get showPwdIcon => _showPwdIcon;

  bool get showCheckPwdIcon => _showCheckPwdIcon;

  bool get ensure => _passwordCheck && _passwordEnsure;

  String get passwordText => passWordFirstController.text;

  SetPwdBloc(this.phoneNumber, this.smsCode, this.pageType) : super(SetPwdInitial()) {
    on<PwdEnsureEvent>(_pwdEnsureTextChange);
    on<PwdCheckEvent>(_pwdCheckTextChange);
    on<SetPasswordEvent>(_setPassword);
  }

  void _pwdCheckTextChange(PwdCheckEvent event, Emitter<SetPwdState> emitter) async {
    if (passWordSecondController.text.isEmpty) {
      _showCheckPwdIcon = false;
      emitter(PasswordCheckIconShowState());
    } else {
      if (!_showCheckPwdIcon) {
        _showCheckPwdIcon = true;
        emitter(PasswordCheckIconShowState());
      }
    }
    if (passWordFirstController.text == passWordSecondController.text) {
      _passwordCheck = true;
      emitter(SetCheckPwdState());
    } else {
      _passwordCheck = false;
      emitter(SetCheckPwdState());
    }
  }

  void _pwdEnsureTextChange(PwdEnsureEvent event, Emitter<SetPwdState> emitter) async {
    if (passWordFirstController.text.isEmpty) {
      if (_showPwdIcon) {
        _showPwdIcon = false;
        emitter(PasswordIconShowState());
      }
    } else {
      if (!_showPwdIcon) {
        _showPwdIcon = true;
        emitter(PasswordIconShowState());
      }
      if (passWordSecondController.text.isNotEmpty) {
        if (passWordFirstController.text == passWordSecondController.text) {
          _passwordCheck = true;
        } else {
          _passwordCheck = false;
        }
        emitter(SetCheckPwdState());
      }
      if (passWordFirstController.text.length >= 8 && passWordFirstController.text.length <= 16) {
        ///符合密码要求
        if (!_passwordEnsure) {
          _passwordEnsure = true;
          emitter(SetEnsurePwdState());
        }
        if (passWordSecondController.text.isNotEmpty) {
          if (passWordFirstController.text == passWordSecondController.text) {}
        }
        if (_passwordLarger) {
          _passwordLarger = false;
          emitter(PasswordLargeState());
        }
      } else {
        if (passWordFirstController.text.length > 16) {
          ///超过十六位
          if (!_passwordLarger) {
            _passwordLarger = true;
            emitter(PasswordLargeState());
          }
        } else {
          if (_passwordLarger) {
            _passwordLarger = false;
            emitter(PasswordLargeState());
          }
        }

        ///密码不符合要求
        if (_passwordEnsure) {
          _passwordEnsure = false;
          emitter(SetEnsurePwdState());
        }
      }
    }
  }

  /// 设置密码,调接口
  void _setPassword(SetPasswordEvent event, Emitter<SetPwdState> emitter) async {
    // var password = EncryptUtil.encodeMd5(passwordText);
    var password = passwordText;
    try {
      await loading(() async {
        switch (pageType) {
          case SetPwdPageType.initPwd:
            await UserDao.initPassword(password);
            break;
          case SetPwdPageType.changePwd:
            // 现在走同一个流程和接口
            /*await UserDao.changePassword(passwordText);
            break;*/
          case SetPwdPageType.resetPwd:
            if (phoneNumber == null || phoneNumber!.isEmpty) {
              throw ApiException(ApiException.customErrorCode, '手机号为空');
            }
            if (smsCode == null || smsCode!.isEmpty) {
              throw ApiException(ApiException.customErrorCode, '验证码为空');
            }
            await UserDao.resetPassword(phoneNumber!, password, smsCode!);
            break;
        }
      });
      emitter(PasswordSetSuccessState());
    } catch (e) {
      String msg;
      if (e is ApiException) {
        msg = e.message ?? '未知错误';
      } else {
        msg = e.toString();
      }
      emitter(PasswordSetFailedState(msg));
    }
  }
}