Skip to content

Commit

Permalink
iOS and Dart handleSuperwallEvent logic
Browse files Browse the repository at this point in the history
  • Loading branch information
super-bryan committed Jan 25, 2024
1 parent 833c9c4 commit bacc99c
Show file tree
Hide file tree
Showing 9 changed files with 445 additions and 278 deletions.
1 change: 1 addition & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ class _MyAppState extends State<MyApp> implements SuperwallDelegate {
@override
void handleSuperwallEvent(SuperwallEventInfo eventInfo) {
print("handleSuperwallEvent: $eventInfo");
print("[EVENTINFO] B");
}

@override
Expand Down
12 changes: 9 additions & 3 deletions lib/src/private/SuperwallDelegateProxy.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:flutter/services.dart';
import 'package:superwallkit_flutter/src/private/BridgingCreator.dart';
import 'package:superwallkit_flutter/src/public/PaywallInfo.dart';
import 'package:superwallkit_flutter/src/public/SubscriptionStatus.dart';
import 'package:superwallkit_flutter/src/public/SuperwallDelegate.dart';
import 'package:superwallkit_flutter/superwallkit_flutter.dart';

class SuperwallDelegateProxy extends BridgeIdInstantiable {
static const BridgeClass bridgeClass = "SuperwallDelegateProxyBridge";
Expand Down Expand Up @@ -45,6 +43,14 @@ class SuperwallDelegateProxy extends BridgeIdInstantiable {
delegate.subscriptionStatusDidChange(status);
}
break;
case 'handleSuperwallEvent':
final json = call.argument("eventInfo");
final event = json['event'];
final eventName = event['event'];
print("[EVENTINFO] A $eventName");

final eventInfo = SuperwallEventInfo.fromJson(json);
delegate.handleSuperwallEvent(eventInfo);
case 'paywallWillOpenURL':
final url = call.argument("url");
delegate.paywallWillOpenURL(Uri.parse(url));
Expand Down
74 changes: 74 additions & 0 deletions lib/src/public/PaywallPresentationRequestStatus.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import 'package:superwallkit_flutter/superwallkit_flutter.dart';

/// The status of the paywall request
class PaywallPresentationRequestStatus {
final PaywallPresentationRequestStatusType type;

PaywallPresentationRequestStatus._(this.type);

factory PaywallPresentationRequestStatus.fromJson(Map<String, dynamic> json) {
switch (json['status']) {
case 'presentation':
return PaywallPresentationRequestStatus._(PaywallPresentationRequestStatusType.presentation);
case 'noPresentation':
return PaywallPresentationRequestStatus._(PaywallPresentationRequestStatusType.noPresentation);
case 'timeout':
return PaywallPresentationRequestStatus._(PaywallPresentationRequestStatusType.timeout);
default:
throw ArgumentError('Invalid PaywallPresentationRequestStatus type');
}
}
}

enum PaywallPresentationRequestStatusType { presentation, noPresentation, timeout }

/// The reason to why the paywall couldn't present.
class PaywallPresentationRequestStatusReason {
final PaywallPresentationRequestStatusReasonType type;
final Experiment? experiment;

PaywallPresentationRequestStatusReason._({required this.type, this.experiment});

factory PaywallPresentationRequestStatusReason.fromJson(Map<String, dynamic> json) {
switch (json['reason']) {
case 'debuggerPresented':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.debuggerPresented);
case 'paywallAlreadyPresented':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.paywallAlreadyPresented);
case 'userIsSubscribed':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.userIsSubscribed);
case 'holdout':
return PaywallPresentationRequestStatusReason._(
type: PaywallPresentationRequestStatusReasonType.holdout,
experiment: Experiment(bridgeId: json['experimentBridgeId']),
);
case 'noRuleMatch':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.noRuleMatch);
case 'eventNotFound':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.eventNotFound);
case 'noPaywallViewController':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.noPaywallViewController);
case 'noPresenter':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.noPresenter);
case 'noConfig':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.noConfig);
case 'subscriptionStatusTimeout':
return PaywallPresentationRequestStatusReason._(type: PaywallPresentationRequestStatusReasonType.subscriptionStatusTimeout);
default:
throw ArgumentError('Invalid PaywallPresentationRequestStatusReason type');
}
}
}

enum PaywallPresentationRequestStatusReasonType {
debuggerPresented,
paywallAlreadyPresented,
userIsSubscribed,
holdout,
noRuleMatch,
eventNotFound,
noPaywallViewController,
noPresenter,
noConfig,
subscriptionStatusTimeout
}
24 changes: 19 additions & 5 deletions lib/src/public/RestoreType.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,27 @@ import 'package:superwallkit_flutter/src/public/StoreTransaction.dart';
/// An enum whose cases describe the type of restore that occurred.
class RestoreType {
final RestoreTypeCase type;
final StoreTransaction? transaction;
final StoreTransaction? storeTransaction;

const RestoreType._(this.type, {this.transaction});
RestoreType._({required this.type, this.storeTransaction});

// Static constants for each case
static RestoreType viaPurchase(StoreTransaction? transaction) => RestoreType._(RestoreTypeCase.viaPurchase, transaction: transaction);
static const RestoreType viaRestore = RestoreType._(RestoreTypeCase.viaRestore);
static RestoreType viaPurchase(StoreTransaction? storeTransaction) => RestoreType._(type: RestoreTypeCase.viaPurchase, storeTransaction: storeTransaction);
static RestoreType viaRestore = RestoreType._(type: RestoreTypeCase.viaRestore);

factory RestoreType.fromJson(Map<String, dynamic> json) {
switch (json['type']) {
case 'viaPurchase':
return RestoreType.viaPurchase(
json['storeTransaction'] != null
? StoreTransaction.fromJson(json['storeTransaction'])
: null,
);
case 'viaRestore':
return RestoreType.viaRestore;
default:
throw ArgumentError('Invalid RestoreType type');
}
}
}

enum RestoreTypeCase {
Expand Down
81 changes: 45 additions & 36 deletions lib/src/public/StoreTransaction.dart
Original file line number Diff line number Diff line change
@@ -1,41 +1,50 @@
/// A wrapper around a store transaction.
class StoreTransaction {
// TODO
// final String configRequestId;
// final String appSessionId;
// final DateTime? transactionDate;
// final String originalTransactionIdentifier;
// final StoreTransactionState state;
// final String? storeTransactionId;
// final StorePayment payment;
// final DateTime? originalTransactionDate;
// final String? webOrderLineItemID;
// final String? appBundleId;
// final String? subscriptionGroupId;
// final bool? isUpgraded;
// final DateTime? expirationDate;
// final String? offerId;
// final DateTime? revocationDate;
// final String? appAccountToken;
}
final String configRequestId;
final String appSessionId;
final DateTime? transactionDate;
final String originalTransactionIdentifier;
final String? storeTransactionId;
final DateTime? originalTransactionDate;
final String? webOrderLineItemID;
final String? appBundleId;
final String? subscriptionGroupId;
final bool? isUpgraded;
final DateTime? expirationDate;
final String? offerId;
final DateTime? revocationDate;

enum StoreTransactionState {
purchasing,
purchased,
failed,
restored,
deferred,
}
StoreTransaction({
required this.configRequestId,
required this.appSessionId,
this.transactionDate,
required this.originalTransactionIdentifier,
this.storeTransactionId,
this.originalTransactionDate,
this.webOrderLineItemID,
this.appBundleId,
this.subscriptionGroupId,
this.isUpgraded,
this.expirationDate,
this.offerId,
this.revocationDate,
});

/// The payment for the transaction.
class StorePayment {
// TODO
// /// The ID of a product being bought.
// final String productIdentifier;
//
// /// The number of items the user wants to purchase.
// final int quantity;
//
// /// The ID for the discount offer to apply to the payment.
// final String? discountIdentifier;
factory StoreTransaction.fromJson(Map<String, dynamic> json) {
return StoreTransaction(
configRequestId: json['configRequestId'],
appSessionId: json['appSessionId'],
transactionDate: json['transactionDate'] != null ? DateTime.parse(json['transactionDate']) : null,
originalTransactionIdentifier: json['originalTransactionIdentifier'],
storeTransactionId: json['storeTransactionId'],
originalTransactionDate: json['originalTransactionDate'] != null ? DateTime.parse(json['originalTransactionDate']) : null,
webOrderLineItemID: json['webOrderLineItemID'],
appBundleId: json['appBundleId'],
subscriptionGroupId: json['subscriptionGroupId'],
isUpgraded: json['isUpgraded'],
expirationDate: json['expirationDate'] != null ? DateTime.parse(json['expirationDate']) : null,
offerId: json['offerId'],
revocationDate: json['revocationDate'] != null ? DateTime.parse(json['revocationDate']) : null,
);
}
}
Loading

0 comments on commit bacc99c

Please sign in to comment.