login_main_cubit.dart 3.83 KB
import 'package:appframe/config/constant.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/data/repositories/wechat_auth_repository.dart';
import 'package:appframe/services/im_service.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fluwx/fluwx.dart';
import 'package:shared_preferences/shared_preferences.dart';

class LoginMainState extends Equatable {
  final bool agreed;
  final bool showAgreed;
  final bool loading;

  const LoginMainState({
    this.agreed = false,
    this.showAgreed = false,
    this.loading = false,
  });

  @override
  List<Object?> get props => [
        agreed,
        showAgreed,
        loading,
      ];

  LoginMainState copyWith({
    bool? agreed,
    bool? showAgreed,
    bool? loading,
  }) {
    return LoginMainState(
      agreed: agreed ?? this.agreed,
      showAgreed: showAgreed ?? this.showAgreed,
      loading: loading ?? this.loading,
    );
  }
}

class LoginMainCubit extends Cubit<LoginMainState> {
  late final Fluwx _fluwx;
  late final WechatAuthRepository _wechatAuthRepository;
  late final ImService _imService;

  LoginMainCubit(super.initialState) {
    _fluwx = getIt.get<Fluwx>();
    _fluwx.addSubscriber(_responseListener);
    _wechatAuthRepository = getIt<WechatAuthRepository>();
    _imService = getIt.get<ImService>();
  }

  void toggleAgreed(bool value) {
    emit(state.copyWith(agreed: value));
  }

  void confirmAgreed() {
    emit(state.copyWith(agreed: true, showAgreed: false));
    wechatAuth();
  }

  void cancelAgreed() {
    emit(state.copyWith(showAgreed: false));
  }

  void wechatAuth() async {
    if (!state.agreed) {
      emit(state.copyWith(showAgreed: true));
      return;
    }

    var result = await _fluwx.authBy(
      which: NormalAuth(scope: 'snsapi_userinfo', state: 'wechat_sdk_test'),
    );

    if (!result) {
      throw Exception('微信授权处理失败');
    }

    // 控制显示加载框
    emit(state.copyWith(loading: true));
  }

  void goLoginPhone() {
    router.go('/loginPhone');
  }

  void _responseListener(WeChatResponse response) async {
    if (response is WeChatAuthResponse) {
      if (response.code == null || response.code == '') {
        return;
      }

      dynamic resultData = await _wechatAuthRepository.codeToSk(response.code!);

      var data = resultData['data'];
      var role = data['roles'][0];

      final sessionCode = data['sessionCode'];
      final userCode = data['userCode'];
      final classCode = role['classCode'];
      final userType = role['userType'];
      final stuId = role['stuId'];

      var sharedPreferences = getIt.get<SharedPreferences>();
      sharedPreferences.setString('auth_sessionCode', sessionCode);
      sharedPreferences.setString('auth_userCode', userCode);
      sharedPreferences.setString('auth_classCode', classCode);
      sharedPreferences.setInt('auth_userType', userType);
      sharedPreferences.setString('auth_stuId', stuId ?? '');
      sharedPreferences.setString('auth_ip', Constant.h5Server);

      if (Constant.needIM) {
        // IM登录, 正式使用时,需要从服务端获取用户签名
        var loginResult = await _imService.login(userCode);
        if (loginResult) {
          print("微信登录处,IM 登录成功");
          await _imService.registerPush();
        } else {
          print("微信登录处,IM 登录失败");
        }
      }

      router.go(
        '/web',
        extra: {
          'ip': Constant.h5Server,
          'sessionCode': sessionCode,
          'userCode': userCode,
          'classCode': classCode,
          'userType': userType,
          'stuId': stuId,
        },
      );
    }
  }

  @override
  Future<void> close() {
    _fluwx.removeSubscriber(_responseListener);
    return super.close();
  }
}