From 49e3812659f974b86616da84acda9ae32a82a566 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 21 Dec 2022 10:19:03 -0600 Subject: [PATCH] iap warning view --- Feels.xcodeproj/project.pbxproj | 4 ++ Shared/FeelsApp.swift | 4 +- Shared/IAPManager.swift | 15 ++++++ Shared/Persisence/PersistenceHelper.swift | 7 ++- Shared/views/DayView/DayView.swift | 8 --- Shared/views/IAPWarningView.swift | 62 +++++++++++++++++++++++ Shared/views/MonthView/MonthView.swift | 22 +++++++- Shared/views/YearView/YearView.swift | 18 +++++++ en.lproj/Localizable.strings | 2 + 9 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 Shared/views/IAPWarningView.swift diff --git a/Feels.xcodeproj/project.pbxproj b/Feels.xcodeproj/project.pbxproj index a4e91eb..9402618 100644 --- a/Feels.xcodeproj/project.pbxproj +++ b/Feels.xcodeproj/project.pbxproj @@ -87,6 +87,7 @@ 1C658D7827C0744D003231EE /* PersistenceUPDATE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C658D7627C0744D003231EE /* PersistenceUPDATE.swift */; }; 1C683FCA2792281400745862 /* Stats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C683FC92792281400745862 /* Stats.swift */; }; 1C683FCB2792281400745862 /* Stats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C683FC92792281400745862 /* Stats.swift */; }; + 1C6EA85A2946F1A300C7D332 /* IAPWarningView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C6EA8592946F1A300C7D332 /* IAPWarningView.swift */; }; 1C718C7027F611C900A8F9FE /* DaysFilterClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C718C6F27F611C900A8F9FE /* DaysFilterClass.swift */; }; 1C718C7127F611C900A8F9FE /* DaysFilterClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C718C6F27F611C900A8F9FE /* DaysFilterClass.swift */; }; 1C718C7327F611E300A8F9FE /* StupidAssCustomWidgetObservableObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C718C7227F611E300A8F9FE /* StupidAssCustomWidgetObservableObject.swift */; }; @@ -257,6 +258,7 @@ 1C5F4977279C945E0092F1B4 /* UserDefaultsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsStore.swift; sourceTree = ""; }; 1C658D7627C0744D003231EE /* PersistenceUPDATE.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceUPDATE.swift; sourceTree = ""; }; 1C683FC92792281400745862 /* Stats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stats.swift; sourceTree = ""; }; + 1C6EA8592946F1A300C7D332 /* IAPWarningView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAPWarningView.swift; sourceTree = ""; }; 1C718C6F27F611C900A8F9FE /* DaysFilterClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaysFilterClass.swift; sourceTree = ""; }; 1C718C7227F611E300A8F9FE /* StupidAssCustomWidgetObservableObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StupidAssCustomWidgetObservableObject.swift; sourceTree = ""; }; 1C7352B827DD02760024B5D2 /* ImagePickerGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePickerGridView.swift; sourceTree = ""; }; @@ -538,6 +540,7 @@ 1C361F0B27C0356B00E832FC /* MainTabView.swift */, 1C4DAA7327CC263F00C25D2B /* MonthView */, 1CB4D09B2877A36400902A56 /* PurchaseButtonView.swift */, + 1C6EA8592946F1A300C7D332 /* IAPWarningView.swift */, 1C1B6E6827FD4E8F00181E70 /* SampleEntryView.swift */, 1C04489327C2CABF00D22444 /* SettingsView */, 1C04489527C2CB1A00D22444 /* Sharing */, @@ -918,6 +921,7 @@ 1C5F4976279C84090092F1B4 /* OnboardingData.swift in Sources */, 1CAD603427A5C1C800C520BD /* SmallRollUpHeaderView.swift in Sources */, 1CAD603A27A5C1C800C520BD /* BGView.swift in Sources */, + 1C6EA85A2946F1A300C7D332 /* IAPWarningView.swift in Sources */, 1C26190727960DC900FDC148 /* ChartViewItemBuildable.swift in Sources */, 1CD90B5D278C7EAD001C4FEA /* Random.swift in Sources */, 1C2618FE27960A4F00FDC148 /* YearViewModel.swift in Sources */, diff --git a/Shared/FeelsApp.swift b/Shared/FeelsApp.swift index 28c684d..3eecd4d 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/FeelsApp.swift @@ -24,12 +24,14 @@ struct FeelsApp: App { BGTask.runFillInMissingDatesTask(task: task as! BGProcessingTask) } UIApplication.shared.applicationIconBadgeNumber = 0 +// PersistenceController.shared.clearDB() + PersistenceController.shared.populateMemory() } var body: some Scene { WindowGroup { // build these here so when tints and other things get updated the views / their data dont - // have to get redrawn + // have to get redrawn#imageLiteral(resourceName: "simulator_screenshot_0017B4DC-100B-42A3-A406-9019704AE275.png") MainTabView(dayView: DayView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: false)), monthView: MonthView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: true)), yearView: YearView(viewModel: YearViewModel()), diff --git a/Shared/IAPManager.swift b/Shared/IAPManager.swift index f4c2b55..8c19fad 100644 --- a/Shared/IAPManager.swift +++ b/Shared/IAPManager.swift @@ -19,6 +19,7 @@ public enum StoreError: Error { class IAPManager: ObservableObject { @Published private(set) var showIAP = false + @Published private(set) var showIAPWarning = false @Published private(set) var subscriptions = [Product: (status: [Product.SubscriptionInfo.Status], renewalInfo: RenewalInfo)?]() @AppStorage(UserDefaultsStore.Keys.firstLaunchDate.rawValue, store: GroupUserDefaults.groupDefaults) private var firstLaunchDate = Date() @@ -112,6 +113,7 @@ class IAPManager: ObservableObject { if let expireDate = expireDate { expireOnTimer = Timer.init(fire: expireDate, interval: 0, repeats: false, block: { _ in self.decideShowIAP() + self.decideShowIAPWarning() }) RunLoop.main.add(expireOnTimer!, forMode: .common) } else { @@ -130,6 +132,7 @@ class IAPManager: ObservableObject { await updateCustomerProductStatus() decideShowIAP() + decideShowIAPWarning() } } @@ -158,6 +161,16 @@ class IAPManager: ObservableObject { } } + func decideShowIAPWarning() { + DispatchQueue.main.async { + if self.currentSubscription != nil { + self.showIAPWarning = false + } else { + self.showIAPWarning = true + } + } + } + func listenForTransactions() -> Task { return Task.detached { //Iterate through any transactions that don't come from a direct call to `purchase()`. @@ -243,6 +256,7 @@ class IAPManager: ObservableObject { print("purchasedSubscriptions \(purchasedSubscriptions)") if !purchasedSubscriptions.isEmpty { self.showIAP = false + self.showIAPWarning = false } for sub in purchasedSubscriptions { @@ -280,6 +294,7 @@ class IAPManager: ObservableObject { await transaction.finish() decideShowIAP() + decideShowIAPWarning() return transaction case .userCancelled, .pending: diff --git a/Shared/Persisence/PersistenceHelper.swift b/Shared/Persisence/PersistenceHelper.swift index 857b311..8126691 100644 --- a/Shared/Persisence/PersistenceHelper.swift +++ b/Shared/Persisence/PersistenceHelper.swift @@ -26,10 +26,13 @@ extension PersistenceController { } func populateMemory() { - for idx in 1..<25 { + for idx in 1..<255 { let newItem = MoodEntry(context: viewContext) newItem.timestamp = Calendar.current.date(byAdding: .day, value: -idx, to: Date()) - newItem.moodValue = Int16(Mood.allValues.randomElement()!.rawValue) + newItem.moodValue = Int16.random(in: 2 ... 4) + if idx % 5 == 0 { + newItem.moodValue = Int16.random(in: 0 ... 4) + } newItem.canEdit = true newItem.canDelete = true diff --git a/Shared/views/DayView/DayView.swift b/Shared/views/DayView/DayView.swift index c4c6608..8fcb922 100644 --- a/Shared/views/DayView/DayView.swift +++ b/Shared/views/DayView/DayView.swift @@ -80,13 +80,6 @@ struct DayView: View { showUpdateEntryAlert = false }) } - - if iapManager.showIAP { - VStack { - Spacer() - PurchaseButtonView(height: 175, iapManager: iapManager) - } - } } .onAppear{ iapManager.decideShowIAP() @@ -173,7 +166,6 @@ struct DayView: View { } ) } - .disabled(iapManager.showIAP) .background( theme.currentTheme.secondaryBGColor ) diff --git a/Shared/views/IAPWarningView.swift b/Shared/views/IAPWarningView.swift new file mode 100644 index 0000000..722ae15 --- /dev/null +++ b/Shared/views/IAPWarningView.swift @@ -0,0 +1,62 @@ +// +// PurchaseButtonView.swift +// Feels +// +// Created by Trey Tartt on 7/7/22. +// + +import SwiftUI +import StoreKit + +struct IAPWarningView: View { + @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system + @AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = DefaultTextColor.textColor + @AppStorage(UserDefaultsStore.Keys.firstLaunchDate.rawValue, store: GroupUserDefaults.groupDefaults) private var firstLaunchDate = Date() + + var iapManager: IAPManager + + private let height: Float + private let showManageSubClosure: (() -> Void)? + @State private var showSettings = false + + public init(height: Float, iapManager: IAPManager, showManageSubClosure: (() -> Void)? = nil, showCountdownTimer: Bool = false) { + self.height = height + self.showManageSubClosure = showManageSubClosure + self.iapManager = iapManager + } + + var body: some View { + VStack { + Text(String(format: String(localized: "iap_warning_view_title"), iapManager.daysLeftBeforeIAP)) + .font(.body) + .frame(minWidth: 0, maxWidth: .infinity) + .background(theme.currentTheme.secondaryBGColor) + + Button(action: { + showSettings.toggle() + }, label: { + Text(String(localized: "iap_warning_view_buy_button")) + .foregroundColor(.white) + .bold() + .frame(maxWidth: .infinity) + .contentShape(Rectangle()) + }) + .frame(maxWidth: .infinity) + .frame(height: 50) + .background(RoundedRectangle(cornerRadius: 10).fill(DefaultMoodTint.color(forMood: .great))) + } +// .frame(height: CGFloat(height)) + .frame(minWidth: 0, maxWidth: .infinity) + .padding() + .background(theme.currentTheme.secondaryBGColor) + .sheet(isPresented: $showSettings) { + SettingsView() + } + } +} + +struct IAPWarningView_Previews: PreviewProvider { + static var previews: some View { + IAPWarningView(height: 175, iapManager: IAPManager()) + } +} diff --git a/Shared/views/MonthView/MonthView.swift b/Shared/views/MonthView/MonthView.swift index 657b246..bf069c7 100644 --- a/Shared/views/MonthView/MonthView.swift +++ b/Shared/views/MonthView/MonthView.swift @@ -27,7 +27,7 @@ struct MonthView: View { @State private var showingSheet = false @StateObject private var onboardingData = OnboardingDataDataManager.shared @StateObject private var filteredDays = DaysFilterClass.shared - + class StupidAssDetailViewObservableObject: ObservableObject { @Published var fuckingWrapped: MonthDetailView? = nil @Published var showFuckingSheet = false @@ -44,6 +44,7 @@ struct MonthView: View { ] @ObservedObject var viewModel: DayViewViewModel + @State private var iAPWarningViewHidden = false var body: some View { ZStack { @@ -72,6 +73,12 @@ struct MonthView: View { ) } .padding([.leading, .trailing]) + .background( + GeometryReader { proxy in + let offset = proxy.frame(in: .named("scroll")).minY + Color.clear.preference(key: ViewOffsetKey.self, value: offset) + } + ) } .disabled(iapManager.showIAP) } @@ -81,6 +88,13 @@ struct MonthView: View { Spacer() PurchaseButtonView(height: 175, iapManager: iapManager) } + } else if iapManager.showIAPWarning { + VStack { + Spacer() + if !iAPWarningViewHidden { + IAPWarningView(height: 75, iapManager: iapManager) + } + } } } .onAppear(perform: { @@ -101,6 +115,10 @@ struct MonthView: View { ShareSheet(photo: uiImage) } } + .onPreferenceChange(ViewOffsetKey.self) { value in + print(value) + iAPWarningViewHidden = value < 0 + } } @@ -230,7 +248,7 @@ extension MonthView { } } -struct HomeViewTwo_Previews: PreviewProvider { +struct MonthView_Previews: PreviewProvider { static var previews: some View { MonthView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: true)) } diff --git a/Shared/views/YearView/YearView.swift b/Shared/views/YearView/YearView.swift index beada34..180baba 100644 --- a/Shared/views/YearView/YearView.swift +++ b/Shared/views/YearView/YearView.swift @@ -25,6 +25,7 @@ struct YearView: View { @EnvironmentObject var iapManager: IAPManager @StateObject public var viewModel: YearViewModel @StateObject private var filteredDays = DaysFilterClass.shared + @State private var iAPWarningViewHidden = false //[ // 2001: [0: [], 1: [], 2: []], // 2002: [0: [], 1: [], 2: []] @@ -62,6 +63,13 @@ struct YearView: View { Spacer() PurchaseButtonView(height: 175, iapManager: iapManager) } + } else if iapManager.showIAPWarning { + VStack { + Spacer() + if !iAPWarningViewHidden { + IAPWarningView(height: 75, iapManager: iapManager) + } + } } } .onAppear(perform: { @@ -72,6 +80,10 @@ struct YearView: View { theme.currentTheme.bg .edgesIgnoringSafeArea(.all) ) + .onPreferenceChange(ViewOffsetKey.self) { value in + print(value) + iAPWarningViewHidden = value < 0 + } } private var monthsHeader: some View { @@ -135,6 +147,12 @@ struct YearView: View { .cornerRadius(10) } .padding([.top, .leading, .trailing]) + .background( + GeometryReader { proxy in + let offset = proxy.frame(in: .named("scroll")).minY + Color.clear.preference(key: ViewOffsetKey.self, value: offset) + } + ) } } } diff --git a/en.lproj/Localizable.strings b/en.lproj/Localizable.strings index 23c08a7..cfd5d7c 100644 --- a/en.lproj/Localizable.strings +++ b/en.lproj/Localizable.strings @@ -115,6 +115,8 @@ "purchase_view_current_subscription_expires_in" = "Trial expires in:"; "purchase_view_current_subscription_expired_on" = "Trial expired on:"; +"iap_warning_view_title" = "In %d day(s) this view will no longer scroll"; +"iap_warning_view_buy_button" = "Subscribe Now"; /* not used */ "onboarding_title_title" = "What would you like the reminder to say?"; "onboarding_title_type_your_own" = "-- or type your own--";