privacy_settings_controller.dart 2.68 KB
import 'package:doublefeel_flutter/app/routes/app_pages.dart';
import 'package:doublefeel_flutter/core/constants/intent_keys.dart';
import 'package:doublefeel_flutter/core/network/api/user_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/user/user_models.dart';
import 'package:get/get.dart';

class PrivacySettingsController extends GetxController {
  PrivacySettingsController(this._userApi, this._userPreferencesStorage);

  final UserApi _userApi;
  final UserPreferencesStorage _userPreferencesStorage;

  final enableAddWithUCode = false.obs;
  final isUpdatingEnableAddWithUCode = false.obs;
  final isVip = false.obs;
  final showRealtimeStress = false.obs;
  late final Worker _preferencesWorker;

  @override
  void onInit() {
    _syncFromPreferences(_userPreferencesStorage.preferences.value);
    _preferencesWorker = ever<UserPreferences>(
      _userPreferencesStorage.preferences,
      _syncFromPreferences,
    );
    super.onInit();
  }

  @override
  void onClose() {
    _preferencesWorker.dispose();
    super.onClose();
  }

  void _syncFromPreferences(UserPreferences preferences) {
    enableAddWithUCode.value =
        preferences.meUserInfo?.enableAddWithUCode == 1;
    isVip.value = preferences.vipInfo?.isVip == true;
    showRealtimeStress.value =
        isVip.value && (preferences.showRealtimeStress ?? true);
  }

  Future<void> updateEnableAddWithUCode(bool enabled) async {
    if (isUpdatingEnableAddWithUCode.value) return;

    isUpdatingEnableAddWithUCode.value = true;
    try {
      final result = await _userApi.updateOwnerUserInfo(
        enableAddWithUcode: enabled ? 1 : 0,
      );
      if (result is AppSuccess<UserInfoResponse>) {
        await _userPreferencesStorage.updateMeUserInfo(result.data);
        enableAddWithUCode.value = result.data.enableAddWithUCode == null
            ? enabled
            : result.data.enableAddWithUCode == 1;
      }
    } finally {
      isUpdatingEnableAddWithUCode.value = false;
    }
  }

  Future<void> updateShowRealtimeStress(bool enabled) async {
    final isVip = _userPreferencesStorage.preferences.value.vipInfo?.isVip ==
        true;
    if (!isVip && enabled) {
      await Get.toNamed(Routes.PURCHASE, arguments: {
        IntentKeys.channelType: '隐私设置-显示实时压力',
      });
      _syncFromPreferences(_userPreferencesStorage.preferences.value);
      return;
    }

    await _userPreferencesStorage.updateShowRealtimeStress(enabled);
  }

  void executeBackLogic() {
    Get.back();
  }
}