splash_controller.dart 2.84 KB
import 'package:doublefeel_flutter/core/services/raw_data_service/health_raw_data_core_service.dart';
import 'package:flutter/scheduler.dart';
import 'package:get/get.dart';

import '../../../routes/app_pages.dart';
import '../../../../core/network/api/user_api.dart';
import '../../../../core/network/api/vip_api.dart';
import '../../../../core/result/app_result.dart';
import '../../../../core/services/user_state_service.dart';
import '../../../../data/local/user_preferences_storage.dart';
import '../../../../data/models/local/user_preferences.dart';

/// Cold-start routing: restore session or open login.
class SplashController extends GetxController {
  SplashController(
    this._userPrefs,
    this._userApi,
    this._vipApi,
    this._userStateService,
  );

  final UserPreferencesStorage _userPrefs;
  final UserApi _userApi;
  final VipApi _vipApi;
  final UserStateService _userStateService;
  final HealthRawDataCoreService _healthRawDataCoreService =
      Get.find<HealthRawDataCoreService>();

  @override
  void onInit() {
    super.onInit();
    SchedulerBinding.instance.addPostFrameCallback((_) {
      _resolveInitialRoute();
    });
  }

  Future<void> _resolveInitialRoute() async {
    final token = _userPrefs.accessToken;
    if (token.isEmpty) {
      final splashDelay =
          Get.testMode ? Duration.zero : const Duration(milliseconds: 800);
      await Future<void>.delayed(splashDelay);
      Get.offAllNamed(AppRoutes.login);
      return;
    }

    final ok = await _refreshSession();
    if (ok) {
      await _userStateService.onLogin();
      try {
        _healthRawDataCoreService.startCoreCaculate();
      } catch (_) {}
      await Get.offAllNamed(AppRoutes.home);
    } else {
      Get.offAllNamed(AppRoutes.login);
    }
  }

  Future<bool> _refreshSession() async {
    final userResult = await _userApi.getUserInfo();
//     if (userResult is AppSuccess) {
//   final me = (userResult as AppSuccess).data;
//   print(me.nickname);
// }
    if (userResult is AppSuccess) {
      // UserInfoResponse? partner;
      // if ((me.pairId ?? 0) > 0) {
      //   final partnerResult = await _userApi.getPartnerUserInfo();
      //   if (partnerResult case AppSuccess(data: final boundData)) {
      //     partner = boundData.partnerUserInfo ?? boundData.userInfo;
      //   }
      // }

      UserPreferencesVipInfo? vipPrefs;
      final vipResult = await _vipApi.getVipInfo();
      if (vipResult case AppSuccess(data: final vip)) {
        vipPrefs = UserPreferencesVipInfo.fromVipInfo(vip);
      }

      // await _userPrefs.updateBothUserInfo(
      //   me: me,
      //   partner: partner,
      // );
      try {
        await _userPrefs.updateMeUserInfo((userResult as AppSuccess).data);
      } catch (_) {}
      if (vipPrefs != null) {
        await _userPrefs.updateVipInfo(vipPrefs);
      }
      return true;
    }
    return false;
  }
}