From e45bd0271c1ff34ca074e322370f4b466ebd64da Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 15:42:04 +0100 Subject: [PATCH 1/9] feat(presentation): create an enum with app storage keys --- .../Models/OnBoardingPresentationModel.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift diff --git a/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift new file mode 100644 index 0000000..424abae --- /dev/null +++ b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift @@ -0,0 +1,10 @@ +// +// OnBoardingPresentationModel.swift +// +// +// Created by Mathis Le Bonniec on 15/01/2024. +// + +enum OnBoardingAppStorage: String { + case hasOnBoardingBeenPresented +} From 262b7b5756f90d8bca955babdb4df22c45e4e0e1 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 15:48:19 +0100 Subject: [PATCH 2/9] refactor(OnBoardingKit): separate enum into a dedicated file --- Sources/OnBoardingKit/Models/OnBoardingKitModel.swift | 8 ++++++++ Sources/OnBoardingKit/Models/OnBoardingModel.swift | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Sources/OnBoardingKit/Models/OnBoardingKitModel.swift diff --git a/Sources/OnBoardingKit/Models/OnBoardingKitModel.swift b/Sources/OnBoardingKit/Models/OnBoardingKitModel.swift new file mode 100644 index 0000000..4816f34 --- /dev/null +++ b/Sources/OnBoardingKit/Models/OnBoardingKitModel.swift @@ -0,0 +1,8 @@ +// +// OnBoardingKitModel.swift +// +// +// Created by Mathis Le Bonniec on 15/01/2024. +// + +public enum OnBoardingKit {} diff --git a/Sources/OnBoardingKit/Models/OnBoardingModel.swift b/Sources/OnBoardingKit/Models/OnBoardingModel.swift index 56d169c..3897916 100644 --- a/Sources/OnBoardingKit/Models/OnBoardingModel.swift +++ b/Sources/OnBoardingKit/Models/OnBoardingModel.swift @@ -7,7 +7,7 @@ import SwiftUI -public enum OnBoardingKit { +extension OnBoardingKit { public struct Feature: Identifiable { public var id: UUID { UUID() } From aac65c4e2ede88f2417028a48febb46b9ddd71c4 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 15:48:32 +0100 Subject: [PATCH 3/9] feat(presentation): create a modifier to display the on boarding view only if needed --- .../Extensions/View+PresentOnBoarding.swift | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift diff --git a/Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift b/Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift new file mode 100644 index 0000000..6c9c1b2 --- /dev/null +++ b/Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift @@ -0,0 +1,66 @@ +// +// View+PresentOnBoarding.swift +// +// +// Created by Mathis Le Bonniec on 15/01/2024. +// + +import SwiftUI + +public struct OnBoardingPresentation: ViewModifier { + // MARK: Properties + public let onBoarding: OnBoarding + public let mode: Mode + public let action: () -> Void + public enum Mode { + case sheet, fullscreen + } + + // MARK: Reactive Properties + @State private var isPresented: Bool = false + @AppStorage(OnBoardingAppStorage.hasOnBoardingBeenPresented.rawValue) private var hasBeenPresented: Bool = true + + // MARK: Body + public func body(content: Content) -> some View { + switch mode { + case .sheet: + initialContent(content: content) + .sheet(isPresented: $isPresented) { + onBoardingView + .interactiveDismissDisabled() + } + case .fullscreen: + initialContent(content: content) + .fullScreenCover(isPresented: $isPresented) { + onBoardingView + } + } + } + + private var onBoardingView: OnBoardingView { + OnBoardingView(onBoarding) { + isPresented = false + action() + } + } + + private func initialContent(content: Content) -> some View { + content + .onAppear { + if !hasBeenPresented { + isPresented = true + } + } + } +} + +extension View { + public func presentOnBoarding( + onBoarding: OnBoarding, + mode: OnBoardingPresentation.Mode = .fullscreen, + action: @escaping () -> Void + ) -> some View { + self + .modifier(OnBoardingPresentation(onBoarding: onBoarding, mode: mode, action: action)) + } +} From 459916faad8c9ca09645a397652c9b547a9712a4 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 15:48:46 +0100 Subject: [PATCH 4/9] feat(reset): create a static method to reset the data store --- .../Models/OnBoardingPresentationModel.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift index 424abae..1204ba3 100644 --- a/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift +++ b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift @@ -5,6 +5,14 @@ // Created by Mathis Le Bonniec on 15/01/2024. // -enum OnBoardingAppStorage: String { +import Foundation + +extension OnBoardingKit { + static func resetDatastore() { + UserDefaults.standard.removeObject(forKey: OnBoardingAppStorage.hasOnBoardingBeenPresented.rawValue) + } +} + +internal enum OnBoardingAppStorage: String { case hasOnBoardingBeenPresented } From 8ce94d4a985c329ed009624ea1996dbca197dab8 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 15:59:13 +0100 Subject: [PATCH 5/9] fix(modifier): replace some default values --- .../PresentOnBoarding.swift} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename Sources/OnBoardingKit/{Extensions/View+PresentOnBoarding.swift => Modifiers/PresentOnBoarding.swift} (90%) diff --git a/Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift similarity index 90% rename from Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift rename to Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift index 6c9c1b2..00d65ea 100644 --- a/Sources/OnBoardingKit/Extensions/View+PresentOnBoarding.swift +++ b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift @@ -1,5 +1,5 @@ // -// View+PresentOnBoarding.swift +// PresentOnBoarding.swift // // // Created by Mathis Le Bonniec on 15/01/2024. @@ -18,7 +18,7 @@ public struct OnBoardingPresentation: ViewModifier { // MARK: Reactive Properties @State private var isPresented: Bool = false - @AppStorage(OnBoardingAppStorage.hasOnBoardingBeenPresented.rawValue) private var hasBeenPresented: Bool = true + @AppStorage(OnBoardingAppStorage.hasOnBoardingBeenPresented.rawValue) private var hasBeenPresented: Bool = false // MARK: Body public func body(content: Content) -> some View { @@ -56,9 +56,9 @@ public struct OnBoardingPresentation: ViewModifier { extension View { public func presentOnBoarding( - onBoarding: OnBoarding, + _ onBoarding: OnBoarding, mode: OnBoardingPresentation.Mode = .fullscreen, - action: @escaping () -> Void + action: @escaping () -> Void = {} ) -> some View { self .modifier(OnBoardingPresentation(onBoarding: onBoarding, mode: mode, action: action)) From f3465a969c26400fcb012d21cdf3b9c44a2921cf Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 16:02:42 +0100 Subject: [PATCH 6/9] fix(modifier): set app storage to false --- Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift index 00d65ea..72bc796 100644 --- a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift +++ b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift @@ -39,6 +39,7 @@ public struct OnBoardingPresentation: ViewModifier { private var onBoardingView: OnBoardingView { OnBoardingView(onBoarding) { + hasBeenPresented = false isPresented = false action() } From c6f89fc2fb939f8ae794c6b27782ef1f5f5f9e94 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 16:20:18 +0100 Subject: [PATCH 7/9] fix(cache): add public keyword to the resetDataStore static method --- Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift index 1204ba3..f44eace 100644 --- a/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift +++ b/Sources/OnBoardingKit/Models/OnBoardingPresentationModel.swift @@ -8,7 +8,7 @@ import Foundation extension OnBoardingKit { - static func resetDatastore() { + public static func resetDatastore() { UserDefaults.standard.removeObject(forKey: OnBoardingAppStorage.hasOnBoardingBeenPresented.rawValue) } } From 5eb4dcef9411ae575e83457a7fe457adafac1e87 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 16:42:43 +0100 Subject: [PATCH 8/9] fix(cache): replace storage value with the right value --- Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift index 72bc796..4ed061f 100644 --- a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift +++ b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift @@ -39,7 +39,7 @@ public struct OnBoardingPresentation: ViewModifier { private var onBoardingView: OnBoardingView { OnBoardingView(onBoarding) { - hasBeenPresented = false + hasBeenPresented = true isPresented = false action() } From f9ac184ad3f4c51313f60f2f0269a5757fe3cac2 Mon Sep 17 00:00:00 2001 From: Mathis Le Bonniec Date: Mon, 15 Jan 2024 16:45:33 +0100 Subject: [PATCH 9/9] feat(cache): now reset presentation without relaunching the application --- Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift index 4ed061f..2e1c513 100644 --- a/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift +++ b/Sources/OnBoardingKit/Modifiers/PresentOnBoarding.swift @@ -52,6 +52,11 @@ public struct OnBoardingPresentation: ViewModifier { isPresented = true } } + .onChange(of: hasBeenPresented) { + if !hasBeenPresented { + isPresented = true + } + } } }