diff --git a/Sources/AutoPresentationClient/Condition.swift b/Sources/AutoPresentationClient/Condition.swift new file mode 100644 index 0000000..f545729 --- /dev/null +++ b/Sources/AutoPresentationClient/Condition.swift @@ -0,0 +1,31 @@ +import DuckCore + +extension AutoPresentation { + public struct FeatureCondition: Sendable { + public var isEligibleForPresentation: @Sendable ( + _ event: AutoPresentation.Event?, + _ placement: Placement?, + _ userInfo: UserInfo? + ) -> Bool + + public var increment: @Sendable () async -> Void + public var logEvent: @Sendable (Event) async -> Void + public var reset: @Sendable () async -> Void + + public init( + isEligibleForPresentation: @escaping @Sendable ( + _ event: AutoPresentation.Event?, + _ placement: Placement?, + _ userInfo: AutoPresentation.UserInfo? + ) -> Bool, + increment: @escaping @Sendable () async -> Void, + logEvent: @escaping @Sendable (AutoPresentation.Event) async -> Void, + reset: @escaping @Sendable () async -> Void + ) { + self.isEligibleForPresentation = isEligibleForPresentation + self.increment = increment + self.logEvent = logEvent + self.reset = reset + } + } +} diff --git a/Sources/AutoPresentationClient/Interface.swift b/Sources/AutoPresentationClient/Interface.swift index 7f1882b..41414b6 100644 --- a/Sources/AutoPresentationClient/Interface.swift +++ b/Sources/AutoPresentationClient/Interface.swift @@ -16,9 +16,10 @@ public struct AutoPresentationClient: Sendable { public var isEligibleForPresentation: @Sendable ( _ _: AutoPresentation.Feature, + _ event: AutoPresentation.Event?, _ placement: Placement?, _ userInfo: AutoPresentation.UserInfo? - ) async -> Bool = { _, _, _ in false } + ) async -> Bool = { _, _, _, _ in false } public var increment: @Sendable ( _ _: AutoPresentation.Feature @@ -32,11 +33,12 @@ public struct AutoPresentationClient: Sendable { public var reset: @Sendable () async -> Void public func featureToPresent( + _ event: AutoPresentation.Event?, _ placement: Placement?, _ userInfo: AutoPresentation.UserInfo? ) async -> AutoPresentation.Feature? { for feature in availableFeatures() { - guard await isEligibleForPresentation(feature, placement, userInfo) else { + guard await isEligibleForPresentation(feature, event, placement, userInfo) else { continue } return feature @@ -45,4 +47,3 @@ public struct AutoPresentationClient: Sendable { return nil } } - diff --git a/Sources/AutoPresentationClient/Live.swift b/Sources/AutoPresentationClient/Live.swift index 598fdaa..7e8d227 100644 --- a/Sources/AutoPresentationClient/Live.swift +++ b/Sources/AutoPresentationClient/Live.swift @@ -19,7 +19,7 @@ extension AutoPresentationClient { impl.availableFeatures }, isEligibleForPresentation: { - impl.isEligibleForPresentation($0, placement: $1, userInfo: $2) + impl.isEligibleForPresentation($0, event: $1, placement: $2, userInfo: $3) }, increment: { await impl.increment($0) @@ -55,6 +55,7 @@ private final class AutoPresentationClientImpl { func isEligibleForPresentation( _ feature: AutoPresentation.Feature, + event: AutoPresentation.Event?, placement: Placement?, userInfo: [AutoPresentation.UserInfoKey: Any]? ) -> Bool { @@ -96,6 +97,7 @@ private final class AutoPresentationClientImpl { } let isEligibleForPresentation = condition.isEligibleForPresentation( + event, placement, userInfo ) diff --git a/Sources/AutoPresentationClient/Model.swift b/Sources/AutoPresentationClient/Model.swift index 8df5e40..a12edda 100644 --- a/Sources/AutoPresentationClient/Model.swift +++ b/Sources/AutoPresentationClient/Model.swift @@ -1,4 +1,3 @@ -import DuckCore @_exported import Tagged public enum AutoPresentation { @@ -12,30 +11,9 @@ public enum AutoPresentation { public typealias UserInfoKey = Tagged public typealias UserInfo = [UserInfoKey: Any] +} - public struct FeatureCondition: Sendable { - public var isEligibleForPresentation: @Sendable ( - _ for: Placement?, - _ userInfo: UserInfo? - ) -> Bool - - public var increment: @Sendable () async -> Void - public var logEvent: @Sendable (Event) async -> Void - public var reset: @Sendable () async -> Void - - public init( - isEligibleForPresentation: @escaping @Sendable ( - _ for: Placement?, - _ userInfo: UserInfo? - ) -> Bool, - increment: @escaping @Sendable () async -> Void, - logEvent: @escaping @Sendable (Event) async -> Void, - reset: @escaping @Sendable () async -> Void - ) { - self.isEligibleForPresentation = isEligibleForPresentation - self.increment = increment - self.logEvent = logEvent - self.reset = reset - } - } +extension AutoPresentation.Event { + public static var newSession: Self { "start_session" } + public static var sceneDidBecomeActive: Self { "scene_become_active" } } diff --git a/Sources/AutoPresentationClient/TestValue.swift b/Sources/AutoPresentationClient/TestValue.swift index 17cd790..0076b0d 100644 --- a/Sources/AutoPresentationClient/TestValue.swift +++ b/Sources/AutoPresentationClient/TestValue.swift @@ -9,7 +9,7 @@ extension AutoPresentationClient: TestDependencyKey { extension AutoPresentationClient { public static let noop = Self( availableFeatures: { [] }, - isEligibleForPresentation: { _, _, _ in false }, + isEligibleForPresentation: { _, _, _, _ in false }, increment: { _ in }, logEvent: { _ in }, reset: {} diff --git a/Sources/AutoPresentationRateUs/Condition.swift b/Sources/AutoPresentationRateUs/Condition.swift index 9e59c7b..1f40283 100644 --- a/Sources/AutoPresentationRateUs/Condition.swift +++ b/Sources/AutoPresentationRateUs/Condition.swift @@ -15,7 +15,7 @@ extension AutoPresentation.FeatureCondition { return AutoPresentation.FeatureCondition( isEligibleForPresentation: { - impl.isEligibleForPresentation(for: $0, userInfo: $1) + impl.isEligibleForPresentation(event: $0, placement: $1, userInfo: $2) }, increment: { await impl.increment() @@ -44,14 +44,15 @@ private final class RateUsConditionImpl { // MARK: - Conformance func isEligibleForPresentation( - for placement: Placement?, + event: AutoPresentation.Event?, + placement: Placement?, userInfo: AutoPresentation.UserInfo? ) -> Bool { guard remoteSettings.isRateUsEnabled else { return false } - if placement == .newSession { + if event == .newSession { return isEligibleNewSessionWhenNeverPresented || isPresentationDelayExpired