wechat_auth_cubit.dart 3.53 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:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fluwx/fluwx.dart';
import 'package:shared_preferences/shared_preferences.dart';

class WechatAuthState extends Equatable {
  final String ip;
  final String? result;

  final String? sessionCode;
  final String? userCode;
  final String? classCode;
  final int? userType;
  final String? stuId;

  const WechatAuthState({
    this.ip = Constant.localServerHost,
    this.result,
    this.sessionCode,
    this.userCode,
    this.classCode,
    this.userType,
    this.stuId,
  });

  WechatAuthState copyWith({
    String? ip,
    String? result,
    String? sessionCode,
    String? userCode,
    String? classCode,
    int? userType,
    String? stuId,
  }) {
    return WechatAuthState(
      ip: ip ?? this.ip,
      result: result ?? this.result,
      sessionCode: sessionCode ?? this.sessionCode,
      userCode: userCode ?? this.userCode,
      classCode: classCode ?? this.classCode,
      userType: userType ?? this.userType,
      stuId: stuId ?? this.stuId,
    );
  }

  @override
  List<Object?> get props => [ip, result, sessionCode, userCode, classCode, userType, stuId];
}

class WechatAuthCubit extends Cubit<WechatAuthState> {
  late final WechatAuthRepository _wechatAuthRepository;
  late final Fluwx _fluwx;
  late final TextEditingController _textEditingController;

  TextEditingController get textEditingController => _textEditingController;

  WechatAuthCubit(super.initialState) {
    _fluwx = getIt.get<Fluwx>();
    _fluwx.addSubscriber(_responseListener);

    _textEditingController = TextEditingController()..text = Constant.h5Server;

    _wechatAuthRepository = getIt<WechatAuthRepository>();
  }

  void _responseListener(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': state.ip,
          'sessionCode': sessionCode,
          'userCode': userCode,
          'classCode': classCode,
          'userType': userType,
          'stuId': stuId,
        },
      );
    }
  }

  void auth() async {
    emit(state.copyWith(ip: _textEditingController.text));

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

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

  void goIndex() {
    router.go('/web');
  }

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