membership_detail_controller.dart 5.63 KB
import 'package:doublefeel_flutter/app/modules/login/views/email_login_contact_us_bottom_sheet.dart';
import 'package:doublefeel_flutter/core/logging/app_logger.dart';
import 'package:doublefeel_flutter/core/network/api/pay_api.dart';
import 'package:doublefeel_flutter/core/network/api/vip_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/util/app_toast.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/pay/apple_pay_order_response.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../../../routes/app_pages.dart';

class MembershipDetailController extends GetxController {
  MembershipDetailController(this._vipApi, this._payApi);

  final VipApi _vipApi;
  final PayApi _payApi;

  final UserPreferencesStorage _userPreferences =
      Get.find<UserPreferencesStorage>();
  final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();

  final isRestoring = false.obs;
  final scrollController = ScrollController();

  final isUnlocking = false.obs;
  Future<void> unlock() async {
    // isUnlocking.value = true;
    // try {
    //   final orderResult = await _payApi.createOrderByApple(123);
    //   if (orderResult is! AppSuccess<ApplePayOrderResponse>) return;

    //   final orderUuid = orderResult.data.orderInfo?.orderUuid?.trim();
    //   if (orderUuid == null || orderUuid.isEmpty) {
    //     AppToast.show(l10n.purchaseOrderInfoUnavailable);
    //     return;
    //   }

    //   final paymentResult = await _performApplePayment(
    //     productId: 'appleProductId',
    //     orderUuid: orderUuid,
    //   );
    //   await _handleApplePaymentResult(paymentResult);
    // } finally {
    //   isUnlocking.value = false;
    // }
  }

  Future<void> _handleApplePaymentResult(
    AppleProductPaymentResult? result,
  ) async {
    if (result?.success == true) {
      await _completeSuccessfulPurchase();
      return;
    }
    if (result?.success != false) return;

    AppToast.show(_applePaymentFailureMessage(result!));
  }

  String _applePaymentFailureMessage(AppleProductPaymentResult result) {
    final errorCode = result.errorCode;
    if (errorCode != null) {
      return _localizedApplePaymentErrorCode(errorCode);
    }

    final errorMessage = _nonEmpty(result.errorMessage);
    if (errorMessage == null) return l10n.purchaseApplePaymentFailed;
    return _localizedApplePaymentErrorMessage(errorMessage);
  }

  String _localizedApplePaymentErrorCode(int errorCode) {
    return switch (errorCode) {
      -1 => l10n.purchaseApplePaymentInvalidOrder,
      -2 => l10n.purchaseApplePaymentProductNotFound,
      -3 => l10n.purchaseApplePaymentCancelled,
      -4 => l10n.purchaseApplePaymentVerificationFailed,
      -5 => l10n.purchaseApplePaymentFailed,
      _ => l10n.purchaseApplePaymentFailed,
    };
  }

  String _localizedApplePaymentErrorMessage(String errorMessage) {
    if (errorMessage == 'missingUUID') {
      return l10n.purchaseApplePaymentInvalidOrder;
    }
    if (errorMessage == 'productNotFound') {
      return l10n.purchaseApplePaymentProductNotFound;
    }
    if (errorMessage == 'userCancelled') {
      return l10n.purchaseApplePaymentCancelled;
    }
    if (errorMessage == 'failedVerification') {
      return l10n.purchaseApplePaymentVerificationFailed;
    }
    if (errorMessage == 'unknown') {
      return l10n.purchaseApplePaymentFailed;
    }
    return errorMessage;
  }

  Future<void> _completeSuccessfulPurchase() async {
    try {
      await _refreshVipInfo();
    } finally {
      if (Get.arguments['from'] == 'onboarding') {
        Get.offAllNamed(AppRoutes.home);
      } else {
        Get.offNamed(Routes.PREMIUM_ACTIVATED);
      }
    }
  }

  Future<void> _refreshVipInfo() async {
    final result = await _vipApi.getVipInfo();
    if (result case AppSuccess(data: final vipInfo)) {
      await _userPreferences.updateVipInfo(
        UserPreferencesVipInfo.fromVipInfo(vipInfo),
      );
    }
  }

  Future<AppleProductPaymentResult?> _performApplePayment({
    required String productId,
    required String orderUuid,
  }) async {
    try {
      return await _platformHostApi.performApplePayment(productId, orderUuid);
    } catch (_) {
      return null;
    }
  }

  @override
  void onInit() {
    super.onInit();
    _refreshVipInfo();
  }

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

  String? _nonEmpty(String? value) {
    final trimmed = value?.trim();
    if (trimmed == null || trimmed.isEmpty) return null;
    return trimmed;
  }

  Future<void> restorePurchase() async {
    if (isRestoring.value || isUnlocking.value) return;

    isRestoring.value = true;
    try {
      final success = await _performRestore();
      if (success) {
        await _completeSuccessfulPurchase();
      }
    } finally {
      isRestoring.value = false;
    }
  }

  Future<bool> _performRestore() async {
    try {
      return await _platformHostApi.performRestore();
    } catch (_) {
      return false;
    }
  }

  void openContactUs() {
    feedbackCompat(pageName: 'Subscription page');
  }

  Future<void> manageSubscription() async {
    try {
      await _platformHostApi
          .nativeHandleUrl('https://apps.apple.com/account/subscriptions');
    } catch (e) {
      AppLogger.e('manageSubscription error: $e');
    }
  }
}