Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Customer Center] Add API call to get Customer Center config #3933

Open
wants to merge 4 commits into
base: integration/customer_support_workflow
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,4 @@ Tests/InstallationTests/XcodeDirectInstallation/XcodeDirectInstallation.xcodepro

# fastlane
fastlane/.env
.vscode/settings.json
47 changes: 44 additions & 3 deletions RevenueCat.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,11 @@
354895D4267AE4B4001DC5B1 /* AttributionKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354895D3267AE4B4001DC5B1 /* AttributionKey.swift */; };
354895D6267BEDE3001DC5B1 /* ReservedSubscriberAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354895D5267BEDE3001DC5B1 /* ReservedSubscriberAttributes.swift */; };
35549323269E298B005F9AE9 /* OfferingsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35549322269E298B005F9AE9 /* OfferingsFactory.swift */; };
358C756C2C332BE800ECCA12 /* PreferredLocalesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 358C756B2C332BE800ECCA12 /* PreferredLocalesProvider.swift */; };
3592E8862C2ED51700D7F91D /* CustomerCenterConfigCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3592E8852C2ED51700D7F91D /* CustomerCenterConfigCallback.swift */; };
3592E88A2C2ED54A00D7F91D /* CustomerCenterConfigData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3592E8882C2ED54A00D7F91D /* CustomerCenterConfigData.swift */; };
3592E88C2C2ED58900D7F91D /* GetCustomerCenterConfigOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3592E88B2C2ED58900D7F91D /* GetCustomerCenterConfigOperation.swift */; };
3592E88E2C2ED5B200D7F91D /* CustomerCenterConfigResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3592E88D2C2ED5B200D7F91D /* CustomerCenterConfigResponse.swift */; };
3592E8902C2ED5C100D7F91D /* CustomerCenterConfigAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3592E88F2C2ED5C100D7F91D /* CustomerCenterConfigAPI.swift */; };
359E8E3F26DEBEEB00B869F9 /* TrialOrIntroPriceEligibilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359E8E3E26DEBEEB00B869F9 /* TrialOrIntroPriceEligibilityChecker.swift */; };
35AAEB452BBB14D000A12548 /* DiagnosticsFileHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35AAEB442BBB14D000A12548 /* DiagnosticsFileHandler.swift */; };
35AAEB492BBB17B500A12548 /* DiagnosticsEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35AAEB482BBB17B500A12548 /* DiagnosticsEvent.swift */; };
Expand All @@ -212,6 +216,8 @@
35D83312262FBD4200E60AC5 /* MockETagManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35D83311262FBD4200E60AC5 /* MockETagManager.swift */; };
35E840CC270FB70D00899AE2 /* ManageSubscriptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35E840C5270FB47C00899AE2 /* ManageSubscriptionsHelper.swift */; };
35E840CE2710E2EB00899AE2 /* MockManageSubscriptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35E840CD2710E2EB00899AE2 /* MockManageSubscriptionsHelper.swift */; };
35F38B482C30104E00CD29FD /* BackendGetCustomerCenterConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F38B472C30104E00CD29FD /* BackendGetCustomerCenterConfigTests.swift */; };
35F38B4C2C32BC4500CD29FD /* PreferredLocalesProviderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F38B4A2C32BC3C00CD29FD /* PreferredLocalesProviderType.swift */; };
35F82BAB26A84E130051DF03 /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F82BAA26A84E130051DF03 /* Dictionary+Extensions.swift */; };
35F82BB226A98EC50051DF03 /* AttributionDataMigratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F82BB126A98EC50051DF03 /* AttributionDataMigratorTests.swift */; };
35F82BB426A9A74D0051DF03 /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F82BB326A9A74D0051DF03 /* HTTPClient.swift */; };
Expand Down Expand Up @@ -1137,7 +1143,11 @@
354895D5267BEDE3001DC5B1 /* ReservedSubscriberAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservedSubscriberAttributes.swift; sourceTree = "<group>"; };
35549322269E298B005F9AE9 /* OfferingsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfferingsFactory.swift; sourceTree = "<group>"; };
357C9BC022725CFA006BC624 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/iAd.framework; sourceTree = DEVELOPER_DIR; };
358C756B2C332BE800ECCA12 /* PreferredLocalesProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferredLocalesProvider.swift; sourceTree = "<group>"; };
3592E8852C2ED51700D7F91D /* CustomerCenterConfigCallback.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomerCenterConfigCallback.swift; sourceTree = "<group>"; };
3592E8882C2ED54A00D7F91D /* CustomerCenterConfigData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomerCenterConfigData.swift; sourceTree = "<group>"; };
3592E88B2C2ED58900D7F91D /* GetCustomerCenterConfigOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GetCustomerCenterConfigOperation.swift; path = Sources/Networking/Operations/GetCustomerCenterConfigOperation.swift; sourceTree = SOURCE_ROOT; };
3592E88D2C2ED5B200D7F91D /* CustomerCenterConfigResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomerCenterConfigResponse.swift; sourceTree = "<group>"; };
3592E88F2C2ED5C100D7F91D /* CustomerCenterConfigAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomerCenterConfigAPI.swift; sourceTree = "<group>"; };
3597020F24BF6A710010506E /* TransactionsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsFactory.swift; sourceTree = "<group>"; };
3597021124BF6AAC0010506E /* TransactionsFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsFactoryTests.swift; sourceTree = "<group>"; };
359E8E3E26DEBEEB00B869F9 /* TrialOrIntroPriceEligibilityChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrialOrIntroPriceEligibilityChecker.swift; sourceTree = "<group>"; };
Expand All @@ -1160,6 +1170,8 @@
35E1CE1F26E022C20008560A /* TrialOrIntroPriceEligibilityCheckerSK1Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrialOrIntroPriceEligibilityCheckerSK1Tests.swift; sourceTree = "<group>"; };
35E840C5270FB47C00899AE2 /* ManageSubscriptionsHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageSubscriptionsHelper.swift; sourceTree = "<group>"; };
35E840CD2710E2EB00899AE2 /* MockManageSubscriptionsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockManageSubscriptionsHelper.swift; sourceTree = "<group>"; };
35F38B472C30104E00CD29FD /* BackendGetCustomerCenterConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackendGetCustomerCenterConfigTests.swift; sourceTree = "<group>"; };
35F38B4A2C32BC3C00CD29FD /* PreferredLocalesProviderType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferredLocalesProviderType.swift; sourceTree = "<group>"; };
35F82BAA26A84E130051DF03 /* Dictionary+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+Extensions.swift"; sourceTree = "<group>"; };
35F82BB126A98EC50051DF03 /* AttributionDataMigratorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributionDataMigratorTests.swift; sourceTree = "<group>"; };
35F82BB326A9A74D0051DF03 /* HTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2118,6 +2130,7 @@
2DC5621724EC63420031F69B /* Sources */ = {
isa = PBXGroup;
children = (
3592E8892C2ED54A00D7F91D /* CustomerCenter */,
F5BE44412698580200254A30 /* Attribution */,
B3B5FBBD269E080A00104A0C /* Caching */,
F5714EA626D7A82E00635477 /* CodableExtensions */,
Expand Down Expand Up @@ -2193,7 +2206,7 @@
2DDA3E4524DB0B4500EDFE5B /* Misc */ = {
isa = PBXGroup;
children = (
358C75682C332BAE00ECCA12 /* Locale */,
35F38B492C32BC2800CD29FD /* Locale */,
57F3C0CA29B7A08F0004FD7E /* Codable */,
57F3C0CB29B7A0B10004FD7E /* Concurrency */,
352B7D7827BD919B002A47DD /* DangerousSettings.swift */,
Expand Down Expand Up @@ -2586,6 +2599,14 @@
path = Locale;
sourceTree = "<group>";
};
3592E8892C2ED54A00D7F91D /* CustomerCenter */ = {
isa = PBXGroup;
children = (
3592E8882C2ED54A00D7F91D /* CustomerCenterConfigData.swift */,
);
path = CustomerCenter;
sourceTree = "<group>";
};
35D159C72BC438C6004D8061 /* Networking */ = {
isa = PBXGroup;
children = (
Expand All @@ -2607,6 +2628,7 @@
B3C4AAD426B8911300E1B3C8 /* Backend.swift */,
B37815482857F1E7000A7B93 /* BackendConfiguration.swift */,
B34605D0279A6E600031CA74 /* CustomerAPI.swift */,
3592E88F2C2ED5C100D7F91D /* CustomerCenterConfigAPI.swift */,
B3781567285A79FC000A7B93 /* IdentityAPI.swift */,
B378156B285A9729000A7B93 /* OfferingsAPI.swift */,
57488BC529CB7BDC0000EE7E /* OfflineEntitlementsAPI.swift */,
Expand Down Expand Up @@ -2650,6 +2672,14 @@
path = Support;
sourceTree = "<group>";
};
35F38B492C32BC2800CD29FD /* Locale */ = {
isa = PBXGroup;
children = (
35F38B4A2C32BC3C00CD29FD /* PreferredLocalesProviderType.swift */,
);
path = Locale;
sourceTree = "<group>";
};
35F82BBB26A9BFA60051DF03 /* FoundationExtensions */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -3052,6 +3082,7 @@
57DB164F298C4327008F6707 /* BackendSignatureVerificationTests.swift */,
5796A38027D6B78500653165 /* BaseBackendTest.swift */,
35109DAA2BC6E436001030C8 /* BackendPostDiagnosticsTests.swift */,
35F38B472C30104E00CD29FD /* BackendGetCustomerCenterConfigTests.swift */,
);
path = Backend;
sourceTree = "<group>";
Expand All @@ -3077,6 +3108,7 @@
57D5412C27F63108004CC35C /* Responses */ = {
isa = PBXGroup;
children = (
3592E88D2C2ED5B200D7F91D /* CustomerCenterConfigResponse.swift */,
5774F9B52805E6CC00997128 /* CustomerInfoResponse.swift */,
5766C621282DAA700067D886 /* GetIntroEligibilityResponse.swift */,
57D5412D27F6311C004CC35C /* OfferingsResponse.swift */,
Expand Down Expand Up @@ -3509,6 +3541,7 @@
5766AAAF283D8CDC00FA6091 /* CacheFetchPolicy.swift */,
B34605A3279A6E380031CA74 /* CallbackCache.swift */,
B34605A4279A6E380031CA74 /* CallbackCacheStatus.swift */,
3592E8852C2ED51700D7F91D /* CustomerCenterConfigCallback.swift */,
B34605A7279A6E380031CA74 /* CustomerInfoCallback.swift */,
B34605A6279A6E380031CA74 /* LogInCallback.swift */,
B34605A5279A6E380031CA74 /* OfferingsCallback.swift */,
Expand All @@ -3521,6 +3554,7 @@
isa = PBXGroup;
children = (
B34605AE279A6E380031CA74 /* Handling */,
3592E88B2C2ED58900D7F91D /* GetCustomerCenterConfigOperation.swift */,
B34605B5279A6E380031CA74 /* GetCustomerInfoOperation.swift */,
B34605B4279A6E380031CA74 /* GetIntroEligibilityOperation.swift */,
B34605BA279A6E380031CA74 /* GetOfferingsOperation.swift */,
Expand Down Expand Up @@ -4474,8 +4508,11 @@
2DDF419D24F6F331005BC22D /* IntroEligibilityCalculator.swift in Sources */,
57536A2627851FFE00E2AE7F /* SK1StoreTransaction.swift in Sources */,
57DE807128074C23008D6C6F /* SK1Storefront.swift in Sources */,
3592E88C2C2ED58900D7F91D /* GetCustomerCenterConfigOperation.swift in Sources */,
3592E88E2C2ED5B200D7F91D /* CustomerCenterConfigResponse.swift in Sources */,
578D79742936A36B0042E434 /* LoggerType.swift in Sources */,
B34605EB279A766C0031CA74 /* OperationQueue+Extensions.swift in Sources */,
35F38B4C2C32BC4500CD29FD /* PreferredLocalesProviderType.swift in Sources */,
57E6C2C72975AAE1001AFE98 /* FileReader.swift in Sources */,
4F7DBFBD2A1E986C00A2F511 /* StoreKit2TransactionFetcher.swift in Sources */,
5766AB4728401B8400FA6091 /* PackageType.swift in Sources */,
Expand All @@ -4486,6 +4523,7 @@
4DBF1F362B4D572400D52354 /* LocalReceiptFetcher.swift in Sources */,
57488A7F29CA145B0000EE7E /* ProductEntitlementMappingResponse.swift in Sources */,
B34605BC279A6E380031CA74 /* CallbackCache.swift in Sources */,
3592E8862C2ED51700D7F91D /* CustomerCenterConfigCallback.swift in Sources */,
B3E26A4A26BE0A8E003ACCF3 /* Error+Extensions.swift in Sources */,
57EAE52D274468900060EB74 /* RawDataContainer.swift in Sources */,
B35042C426CDB79A00905B95 /* Purchases.swift in Sources */,
Expand All @@ -4498,6 +4536,7 @@
579415D529368AB200218FBC /* ReceiptStrings.swift in Sources */,
57A0FBF02749C0C2009E2FC3 /* Atomic.swift in Sources */,
4F98E9D32A465A4400DB6EAB /* TestStoreProduct.swift in Sources */,
3592E8902C2ED5C100D7F91D /* CustomerCenterConfigAPI.swift in Sources */,
2DC5623224EC63730031F69B /* TransactionsFactory.swift in Sources */,
579415D2293689DD00218FBC /* Codable+Extensions.swift in Sources */,
2DDF41B424F6F387005BC22D /* ASN1ContainerBuilder.swift in Sources */,
Expand All @@ -4520,6 +4559,7 @@
9A65E0762591977200DE00B0 /* IdentityStrings.swift in Sources */,
4F6ABC782A81595900250E63 /* PaywallCacheWarming.swift in Sources */,
F5714EAA26D7A85D00635477 /* PeriodType+Extensions.swift in Sources */,
3592E88A2C2ED54A00D7F91D /* CustomerCenterConfigData.swift in Sources */,
57045B3A29C51751001A5417 /* GetProductEntitlementMappingOperation.swift in Sources */,
4FC083292A4A35FB00A97089 /* Integer+Extensions.swift in Sources */,
F5BE447D269E4ADB00254A30 /* ASIdManagerProxy.swift in Sources */,
Expand Down Expand Up @@ -4720,6 +4760,7 @@
351B515426D44B0A00BD2BD7 /* MockStoreKit1Wrapper.swift in Sources */,
4F0BBAAC2A1D253D000E75AB /* OfflineCustomerInfoCreatorTests.swift in Sources */,
35F8B8FA26E02AE1003C3363 /* MockTrialOrIntroPriceEligibilityChecker.swift in Sources */,
35F38B482C30104E00CD29FD /* BackendGetCustomerCenterConfigTests.swift in Sources */,
35D83300262FAD8000E60AC5 /* ETagManagerTests.swift in Sources */,
57DDA7B329CBEFB30098B89D /* MockPurchasedProductsFetcher.swift in Sources */,
5796A39027D6BCD100653165 /* BackendGetIntroEligibilityTests.swift in Sources */,
Expand Down
63 changes: 0 additions & 63 deletions RevenueCatUI/CustomerCenter/Data/CustomerCenterConfigData.swift

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ enum CustomerCenterConfigTestData {

@available(iOS 14.0, *)
static let customerCenterData = CustomerCenterConfigData(
id: "customer_center_id",
paths: [
.init(
id: "1",
Expand Down Expand Up @@ -63,7 +62,18 @@ enum CustomerCenterConfigTestData {
))
)
],
title: "How can we help?"
screens: [
.init(
type: .management,
title: "Manage Subscription",
subtitle: "Manage your subscription details here"
),
.init(
type: .noActive,
title: "No Active Subscription",
subtitle: "You currently have no active subscriptions"
)
]
)

static let subscriptionInformation: SubscriptionInformation = .init(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,11 @@ import RevenueCat
}
}
}
@Published
var configuration: CustomerCenterConfigData?

var isLoaded: Bool {
return state != .notLoaded
return state != .notLoaded && configuration != nil
}

private var customerInfoFetcher: CustomerInfoFetcher
Expand Down Expand Up @@ -97,4 +99,12 @@ import RevenueCat
}
}

func loadCustomerCenterConfig() async {
do {
self.configuration = try await Purchases.shared.loadCustomerCenter()
} catch {
self.state = .error(error)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,8 @@ import RevenueCat
@MainActor
class ManageSubscriptionsViewModel: ObservableObject {

@Published
private(set) var subscriptionInformation: SubscriptionInformation?
@Published
private(set) var refundRequestStatusMessage: String?
@Published
private(set) var configuration: CustomerCenterConfigData?
let configuration: CustomerCenterConfigData

@Published
var showRestoreAlert: Bool = false
@Published
Expand All @@ -41,26 +37,30 @@ class ManageSubscriptionsViewModel: ObservableObject {
}
}
}

var isLoaded: Bool {
return state != .notLoaded
}

@Published
private(set) var subscriptionInformation: SubscriptionInformation?
@Published
private(set) var refundRequestStatusMessage: String?

private var purchasesProvider: ManageSubscriptionsPurchaseType

private var error: Error?

convenience init() {
self.init(purchasesProvider: ManageSubscriptionPurchases())
convenience init(configuration: CustomerCenterConfigData) {
self.init(configuration: configuration,
purchasesProvider: ManageSubscriptionPurchases())
}

// @PublicForExternalTesting
init(purchasesProvider: ManageSubscriptionsPurchaseType) {
init(configuration: CustomerCenterConfigData, purchasesProvider: ManageSubscriptionsPurchaseType) {
self.state = .notLoaded
self.configuration = configuration
self.purchasesProvider = purchasesProvider
}

// @PublicForExternalTesting
init(configuration: CustomerCenterConfigData,
subscriptionInformation: SubscriptionInformation) {
self.configuration = configuration
Expand All @@ -72,7 +72,6 @@ class ManageSubscriptionsViewModel: ObservableObject {
func loadScreen() async {
do {
try await loadSubscriptionInformation()
loadCustomerCenterConfig()
self.state = .success
} catch {
self.state = .error(error)
Expand Down Expand Up @@ -104,10 +103,6 @@ class ManageSubscriptionsViewModel: ObservableObject {
)
}

private func loadCustomerCenterConfig() {
self.configuration = CustomerCenterConfigTestData.customerCenterData
}

#if os(iOS) || targetEnvironment(macCatalyst)
func handleAction(for path: CustomerCenterConfigData.HelpPath) async {
switch path.type {
Expand Down
Loading