Add tests for 1.1.0 features
This commit is contained in:
@@ -8,38 +8,59 @@ final class ReviewPromptService {
|
||||
private let checkInCountKey = "reviewPromptCheckinCount"
|
||||
private let minCheckInsBetweenPrompts = 3
|
||||
private let minDaysBetweenPrompts = 90
|
||||
private let userDefaults: UserDefaults
|
||||
private let dateProvider: () -> Date
|
||||
private let reviewRequestHandler: () -> Void
|
||||
|
||||
private init() {}
|
||||
private init() {
|
||||
userDefaults = .standard
|
||||
dateProvider = Date.init
|
||||
reviewRequestHandler = ReviewPromptService.defaultReviewRequestHandler
|
||||
}
|
||||
|
||||
init(
|
||||
userDefaults: UserDefaults,
|
||||
dateProvider: @escaping () -> Date,
|
||||
reviewRequestHandler: @escaping () -> Void
|
||||
) {
|
||||
self.userDefaults = userDefaults
|
||||
self.dateProvider = dateProvider
|
||||
self.reviewRequestHandler = reviewRequestHandler
|
||||
}
|
||||
|
||||
func recordMonthlyCheckInCompleted() {
|
||||
let currentCount = UserDefaults.standard.integer(forKey: checkInCountKey)
|
||||
UserDefaults.standard.set(currentCount + 1, forKey: checkInCountKey)
|
||||
let currentCount = userDefaults.integer(forKey: checkInCountKey)
|
||||
userDefaults.set(currentCount + 1, forKey: checkInCountKey)
|
||||
requestReviewIfEligible()
|
||||
}
|
||||
|
||||
private func requestReviewIfEligible() {
|
||||
let now = Date()
|
||||
if let lastPrompt = UserDefaults.standard.object(forKey: lastPromptKey) as? Date {
|
||||
let now = dateProvider()
|
||||
if let lastPrompt = userDefaults.object(forKey: lastPromptKey) as? Date {
|
||||
let daysSince = now.timeIntervalSince(lastPrompt) / 86_400
|
||||
if daysSince < Double(minDaysBetweenPrompts) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let count = UserDefaults.standard.integer(forKey: checkInCountKey)
|
||||
let count = userDefaults.integer(forKey: checkInCountKey)
|
||||
guard count >= minCheckInsBetweenPrompts else { return }
|
||||
|
||||
requestReview()
|
||||
}
|
||||
|
||||
private func requestReview() {
|
||||
reviewRequestHandler()
|
||||
userDefaults.set(dateProvider(), forKey: lastPromptKey)
|
||||
userDefaults.set(0, forKey: checkInCountKey)
|
||||
}
|
||||
|
||||
private static func defaultReviewRequestHandler() {
|
||||
guard let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
|
||||
if #available(iOS 18.0, *) {
|
||||
AppStore.requestReview(in: scene)
|
||||
} else {
|
||||
SKStoreReviewController.requestReview(in: scene)
|
||||
}
|
||||
UserDefaults.standard.set(Date(), forKey: lastPromptKey)
|
||||
UserDefaults.standard.set(0, forKey: checkInCountKey)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user