Skip to content

Commit 22db5e7

Browse files
committed
IOS-5365 Integrate membership data fetching refactoring for non-blocking startup
Change MembershipStatusStorage to use noCache: false at startup to prevent blocking app launch with network calls. Add membershipTiersUpdate event handler to process async tier updates from middleware. Cache membership and tiers separately for efficient rebuilding.
1 parent d70b49e commit 22db5e7

File tree

1 file changed

+44
-11
lines changed

1 file changed

+44
-11
lines changed

Anytype/Sources/ServiceLayer/MembershipStatusStorage/MembershipStatusStorage.swift

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import ProtobufMessages
33
import Combine
44
import Services
5+
import AnytypeCore
56

67

78
@MainActor
@@ -24,15 +25,18 @@ final class MembershipStatusStorage: MembershipStatusStorageProtocol {
2425
var statusPublisher: AnyPublisher<MembershipStatus, Never> { $_status.eraseToAnyPublisher() }
2526
var currentStatus: MembershipStatus { _status }
2627
@Published private var _status: MembershipStatus = .empty
27-
28+
29+
private var _currentMembership: Anytype_Model_Membership?
30+
private var _cachedTiers: [MembershipTier] = []
31+
2832
private var subscription: AnyCancellable?
2933

3034
nonisolated init() { }
3135

3236
func startSubscription() async {
33-
_status = (try? await membershipService.getMembership(noCache: true)) ?? .empty
37+
_status = (try? await membershipService.getMembership(noCache: false)) ?? .empty
3438
AnytypeAnalytics.instance().setMembershipTier(tier: _status.tier)
35-
39+
3640
setupSubscription()
3741
}
3842

@@ -56,17 +60,46 @@ final class MembershipStatusStorage: MembershipStatusStorageProtocol {
5660
for event in events.middlewareEvents {
5761
switch event.value {
5862
case .membershipUpdate(let update):
59-
Task {
60-
let allTiers = try await membershipService.getTiers()
61-
62-
_status = try builder.buildMembershipStatus(membership: update.data, allTiers: allTiers)
63-
_status.tier.flatMap { AnytypeAnalytics.instance().logChangePlan(tier: $0) }
64-
65-
AnytypeAnalytics.instance().setMembershipTier(tier: _status.tier)
66-
}
63+
handleMembershipUpdate(update)
64+
case .membershipTiersUpdate(let update):
65+
handleMembershipTiersUpdate(update)
6766
default:
6867
break
6968
}
7069
}
7170
}
71+
72+
private func handleMembershipUpdate(_ update: Anytype_Event.Membership.Update) {
73+
Task {
74+
_currentMembership = update.data
75+
76+
rebuildStatusIfReady()
77+
78+
if let tier = _cachedTiers.first(where: { $0.id.id == update.data.tier }) {
79+
AnytypeAnalytics.instance().logChangePlan(tier: tier)
80+
}
81+
}
82+
}
83+
84+
private func handleMembershipTiersUpdate(_ update: Anytype_Event.Membership.TiersUpdate) {
85+
Task {
86+
let filteredTiers = update.tiers
87+
.filter { FeatureFlags.membershipTestTiers || !$0.isTest }
88+
89+
_cachedTiers = await filteredTiers.asyncMap { await builder.buildMembershipTier(tier: $0) }.compactMap { $0 }
90+
91+
rebuildStatusIfReady()
92+
}
93+
}
94+
95+
private func rebuildStatusIfReady() {
96+
guard let membership = _currentMembership, !_cachedTiers.isEmpty else { return }
97+
98+
guard let newStatus = try? builder.buildMembershipStatus(membership: membership, allTiers: _cachedTiers) else {
99+
return
100+
}
101+
102+
_status = newStatus
103+
AnytypeAnalytics.instance().setMembershipTier(tier: _status.tier)
104+
}
72105
}

0 commit comments

Comments
 (0)