privacy_settings_controller.dart 3.24 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_account_storage.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,
    this._userAccountStorage,
  );

  final UserApi _userApi;
  final UserPreferencesStorage _userPreferencesStorage;
  final UserAccountStorage _userAccountStorage;

  /// 页面文案是“禁止通过 ID 添加我”,因此该状态为 true 时表示禁止。
  final disableAddWithUCode = false.obs;
  final isUpdatingDisableAddWithUCode = 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) {
    disableAddWithUCode.value =
        preferences.meUserInfo?.enableAddWithUCode != 1;
    isVip.value = preferences.vipInfo?.isVip == true;
    final userId = preferences.meUserInfo?.id;
    showRealtimeStress.value = isVip.value &&
        (userId == null
            ? true
            : (_userAccountStorage.showRealtimeStress(userId) ?? true));
  }

  Future<void> updateDisableAddWithUCode(bool disabled) async {
    if (isUpdatingDisableAddWithUCode.value) return;

    isUpdatingDisableAddWithUCode.value = true;
    try {
      final result = await _userApi.updateOwnerUserInfo(
        enableAddWithUcode: disabled ? 0 : 1,
      );
      if (result is AppSuccess<UserInfoResponse>) {
        await _userPreferencesStorage.updateMeUserInfo(result.data);
        disableAddWithUCode.value = result.data.enableAddWithUCode == null
            ? disabled
            : result.data.enableAddWithUCode != 1;
      }
    } finally {
      isUpdatingDisableAddWithUCode.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;
    }

    final userId = _userPreferencesStorage.preferences.value.meUserInfo?.id;
    if (userId == null) return;
    await _userAccountStorage.updateShowRealtimeStress(userId, enabled);
    _syncFromPreferences(_userPreferencesStorage.preferences.value);
  }

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