presentUpsell method

  1. @override
Future<String?> presentUpsell({
  1. required BuildContext context,
  2. required String trigger,
  3. PaywallEventHandlers? eventHandlers,
  4. Map<String, dynamic>? customPaywallTraits,
  5. bool? dontShowIfAlreadyEntitled,
  6. void onEntitled()?,
  7. void onPaywallUnavailable()?,
})
override

Presents view based on trigger

Implementation

@override
Future<String?> presentUpsell({
  required BuildContext context,
  required String trigger,
  PaywallEventHandlers? eventHandlers,
  Map<String, dynamic>? customPaywallTraits,
  bool? dontShowIfAlreadyEntitled,
  void Function()? onEntitled,
  void Function()? onPaywallUnavailable,
}) async {
  _fallbackContext = context;

  // Store current event handlers and presentation callbacks
  _currentEventHandlers = eventHandlers;
  _currentOnEntitled = onEntitled;
  _currentOnPaywallUnavailable = onPaywallUnavailable;

  try {
    final result = await methodChannel.invokeMethod<String?>(
      presentUpsellMethodName,
      {
        'trigger': trigger,
        'customPaywallTraits': _convertBooleansToMarkers(customPaywallTraits),
        'dontShowIfAlreadyEntitled': dontShowIfAlreadyEntitled,
      },
    );
    return result;
  } on PlatformException catch (e) {
    log('[Helium] Unexpected present upsell error: ${e.message}');
    _currentEventHandlers = null;
    _currentOnEntitled = null;
    _currentOnPaywallUnavailable = null;
    try {
      await methodChannel.invokeMethod<String?>(
        fallbackOpenEventMethodName,
        {
          'trigger': trigger,
          'viewType': 'presented',
          'paywallUnavailableReason': 'bridgingError',
        },
      );
    } catch (err) {
      log('[Helium] Failed to send fallback open event: $err');
    }
    _showFallbackSheet(trigger);
    // Helium paywall could not be shown; signal the caller regardless of
    // whether the Flutter fallback view is displayed.
    _safeInvokeCallback(onPaywallUnavailable, 'onPaywallUnavailable');
    return "Failed to present upsell: '${e.message}'.";
  }
}