iap warning view

This commit is contained in:
Trey t
2022-12-21 10:19:03 -06:00
parent 340798c141
commit 49e3812659
9 changed files with 129 additions and 13 deletions

View File

@@ -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()),

View File

@@ -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<Void, Error> {
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:

View File

@@ -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

View File

@@ -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
)

View File

@@ -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())
}
}

View File

@@ -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))
}

View File

@@ -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)
}
)
}
}
}