validateDiscountCode method

Validates a discount code for the active customer.

Implementation

@override
Future<InappifySdkResult<ValidateDiscountCodeData>> validateDiscountCode(
  InappifyDiscountCodeRequest request,
) async {
  final cancelled = _preCancelled<ValidateDiscountCodeData>(
    'validateDiscountCode',
    request.cancellation,
  );
  if (cancelled != null) return cancelled;
  return _run<ValidateDiscountCodeData>(
    'validateDiscountCode',
    action: () async {
      final requestedIdentifier = request.offeringIdentifier;
      String? offeringIdentifier = requestedIdentifier;
      if (offeringIdentifier == null) {
        final currentRaw = await _bridge.call(
          'getCurrentOffering',
          positionalArguments: request.cancellation == null
              ? const <Object?>[]
              : const <Object?>[<String, Object?>{}],
          cancellation: request.cancellation,
          injectAbortSignal: request.cancellation != null,
        );
        final current = currentRaw == null
            ? null
            : InappifyWebPayloadCodec.offering(currentRaw);
        offeringIdentifier = current?.identifier;
      }
      if (offeringIdentifier == null || offeringIdentifier.trim().isEmpty) {
        throw const _WebSemanticException(
          code: InappifyFailureCode.invalidConfiguration,
        );
      }
      final raw = await _bridge.call(
        'validateDiscountCode',
        positionalArguments: <Object?>[
          request.discountCode,
          offeringIdentifier,
          if (request.cancellation != null) const <String, Object?>{},
        ],
        cancellation: request.cancellation,
        injectAbortSignal: request.cancellation != null,
      );
      final result = InappifyWebPayloadCodec.discountValidation(raw);
      if (requestedIdentifier != null &&
          result.offering != null &&
          result.offering!.identifier != requestedIdentifier) {
        throw const FormatException(
          'Web discount validation returned a different offering.',
        );
      }
      return result;
    },
    cancellation: request.cancellation,
  );
}