login_main_cubit.dart 2.88 KB
import 'package:appframe/config/constant.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/data/repositories/wechat_auth_repository.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';

import '../config/locator.dart';

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

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

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

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

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

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

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

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

  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('微信授权处理失败');
    }
  }

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

  void _responseListener(WeChatResponse response) async {
    if (response is WeChatAuthResponse) {
      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);

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