@@ -2,6 +2,7 @@ import Foundation
22import ProtobufMessages
33import Combine
44import 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