diff --git a/Sources/SpeziOnboarding/OnboardingConsentView.swift b/Sources/SpeziOnboarding/OnboardingConsentView.swift index 98f1276..87b9870 100644 --- a/Sources/SpeziOnboarding/OnboardingConsentView.swift +++ b/Sources/SpeziOnboarding/OnboardingConsentView.swift @@ -21,6 +21,9 @@ import SwiftUI /// The `OnboardingConsentView` builds on top of the SpeziOnboarding ``ConsentDocument`` /// by providing a more developer-friendly, convenient API with additional functionalities like the share consent option. /// +/// If you want to use multiple `OnboardingConsentView`, you can provide each with an identifier (see below). +/// The identifier allows to distinguish the consent forms in the `Standard`. +/// /// ```swift /// OnboardingConsentView( /// markdown: { @@ -30,6 +33,7 @@ import SwiftUI /// // The action that should be performed once the user has provided their consent. /// }, /// title: "Consent", // Configure the title of the consent view +/// identifier: "MyFirstConsentForm", // Specify a unique identifier for the consent form, helpful for distinguishing consent forms when storing. /// exportConfiguration: .init(paperSize: .usLetter) // Configure the properties of the exported consent form /// ) /// ``` @@ -46,8 +50,9 @@ public struct OnboardingConsentView: View { private let markdown: () async -> Data private let action: () async -> Void private let title: LocalizedStringResource? + private let identifier: String private let exportConfiguration: ConsentDocument.ExportConfiguration - + @Environment(OnboardingDataSource.self) private var onboardingDataSource @State private var viewState: ConsentViewState = .base(.idle) @State private var willShowShareSheet = false @@ -90,7 +95,7 @@ public struct OnboardingConsentView: View { if !willShowShareSheet { Task { @MainActor in /// Stores the finished PDF in the Spezi `Standard`. - await onboardingDataSource.store(exportedConsentDocumented) + await onboardingDataSource.store(exportedConsentDocumented, identifier: identifier) await action() } } else { @@ -166,17 +171,20 @@ public struct OnboardingConsentView: View { /// - markdown: The markdown content provided as an UTF8 encoded `Data` instance that can be provided asynchronously. /// - action: The action that should be performed once the consent is given. /// - title: The title of the view displayed at the top. Can be `nil`, meaning no title is displayed. + /// - identifier: A unique identifier or "name" for the consent form, helpful for distinguishing consent forms when storing in the `Standard`. /// - exportConfiguration: Defines the properties of the exported consent form via ``ConsentDocument/ExportConfiguration``. public init( markdown: @escaping () async -> Data, action: @escaping () async -> Void, title: LocalizedStringResource? = LocalizationDefaults.consentFormTitle, + identifier: String = "DefaultConsentDocument", exportConfiguration: ConsentDocument.ExportConfiguration = .init() ) { self.markdown = markdown self.exportConfiguration = exportConfiguration self.title = title self.action = action + self.identifier = identifier } } diff --git a/Sources/SpeziOnboarding/OnboardingConstraint.swift b/Sources/SpeziOnboarding/OnboardingConstraint.swift index 1b142ca..452afe6 100644 --- a/Sources/SpeziOnboarding/OnboardingConstraint.swift +++ b/Sources/SpeziOnboarding/OnboardingConstraint.swift @@ -15,6 +15,8 @@ import Spezi public protocol OnboardingConstraint: Standard { /// Adds a new exported consent form represented as `PDFDocument` to the `Standard` conforming to ``OnboardingConstraint``. /// - /// - Parameter consent: The exported consent form represented as `PDFDocument` that should be added. - func store(consent: PDFDocument) async + /// - Parameters: + /// - consent: The exported consent form represented as `PDFDocument` that should be added. + /// - identifier: A 'String' identifying the consent form as specified in OnboardingConsentView. + func store(consent: PDFDocument, identifier: String) async } diff --git a/Sources/SpeziOnboarding/OnboardingDataSource.swift b/Sources/SpeziOnboarding/OnboardingDataSource.swift index 3bb18c4..ab6985b 100644 --- a/Sources/SpeziOnboarding/OnboardingDataSource.swift +++ b/Sources/SpeziOnboarding/OnboardingDataSource.swift @@ -43,9 +43,9 @@ public class OnboardingDataSource: Module, EnvironmentAccessible { /// Adds a new exported consent form represented as `PDFDocument` to the ``OnboardingDataSource``. /// /// - Parameter consent: The exported consent form represented as `PDFDocument` that should be added. - public func store(_ consent: PDFDocument) async { + public func store(_ consent: PDFDocument, identifier: String) async { Task { @MainActor in - await standard.store(consent: consent) + await standard.store(consent: consent, identifier: identifier) } } } diff --git a/Sources/SpeziOnboarding/SpeziOnboarding.docc/ObtainingUserConsent.md b/Sources/SpeziOnboarding/SpeziOnboarding.docc/ObtainingUserConsent.md index 27cb3e8..2cb0653 100644 --- a/Sources/SpeziOnboarding/SpeziOnboarding.docc/ObtainingUserConsent.md +++ b/Sources/SpeziOnboarding/SpeziOnboarding.docc/ObtainingUserConsent.md @@ -28,6 +28,7 @@ OnboardingConsentView( action: { // Action to perform once the user has given their consent }, + identifier: "MyFirstConsentForm", // Specify an optional unique identifier for the consent form, helpful for distinguishing consent forms when storing. exportConfiguration: .init(paperSize: .usLetter) // Configure the properties of the exported consent form ) ``` diff --git a/Tests/UITests/TestApp/ExampleStandard.swift b/Tests/UITests/TestApp/ExampleStandard.swift index f1791ed..737db57 100644 --- a/Tests/UITests/TestApp/ExampleStandard.swift +++ b/Tests/UITests/TestApp/ExampleStandard.swift @@ -14,19 +14,43 @@ import SwiftUI /// An example Standard used for the configuration. actor ExampleStandard: Standard, EnvironmentAccessible { - @Published @MainActor var consentData: PDFDocument = .init() + @Published @MainActor var firstConsentData: PDFDocument = .init() + @Published @MainActor var secondConsentData: PDFDocument = .init() + } extension ExampleStandard: OnboardingConstraint { - func store(consent: PDFDocument) async { + func store(consent: PDFDocument, identifier: String) async { await MainActor.run { - self.consentData = consent + if(identifier == "FirstConsentDocument") + { + self.firstConsentData = consent + } + if(identifier == "SecondConsentDocument") + { + self.secondConsentData = consent + } } try? await Task.sleep(for: .seconds(0.5)) } - func loadConsent() async throws -> PDFDocument { - await self.consentData + func loadConsentDocument(identifier: String) async throws -> PDFDocument? { + + if(identifier == "FirstConsentDocument") + { + return await self.firstConsentData + } + if(identifier == "SecondConsentDocument") + { + return await self.secondConsentData + } + + // In case an invalid identifier is provided, return nil. + // The OnboardingConsentMarkdownRenderingView checks if the document + // is nil, and if so, displays an error. + return nil } + + } diff --git a/Tests/UITests/TestApp/OnboardingTestsView.swift b/Tests/UITests/TestApp/OnboardingTestsView.swift index 34dac37..6e500b1 100644 --- a/Tests/UITests/TestApp/OnboardingTestsView.swift +++ b/Tests/UITests/TestApp/OnboardingTestsView.swift @@ -23,8 +23,10 @@ struct OnboardingTestsView: View { ) OnboardingWelcomeTestView() OnboardingSequentialTestView() - OnboardingConsentMarkdownTestView() - OnboardingConsentMarkdownRenderingView() + OnboardingFirstConsentMarkdownTestView() + OnboardingFirstConsentMarkdownRenderingView() + OnboardingSecondConsentMarkdownTestView() + OnboardingSecondConsentMarkdownRenderingView() OnboardingTestViewNotIdentifiable(text: "Leland").onboardingIdentifier("a") OnboardingTestViewNotIdentifiable(text: "Stanford").onboardingIdentifier("b") OnboardingCustomToggleTestView(showConditionalView: $showConditionalView) diff --git a/Tests/UITests/TestApp/Views/OnboardingConsentMarkdownRenderingView.swift b/Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownRenderingView.swift similarity index 81% rename from Tests/UITests/TestApp/Views/OnboardingConsentMarkdownRenderingView.swift rename to Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownRenderingView.swift index bb63f9b..51bcf9b 100644 --- a/Tests/UITests/TestApp/Views/OnboardingConsentMarkdownRenderingView.swift +++ b/Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownRenderingView.swift @@ -12,11 +12,12 @@ import SpeziViews import SwiftUI -struct OnboardingConsentMarkdownRenderingView: View { +struct OnboardingFirstConsentMarkdownRenderingView: View { @Environment(OnboardingNavigationPath.self) private var path @Environment(ExampleStandard.self) private var standard @State var exportedConsent: PDFDocument? - + + private var documentIdentifier = "FirstConsentDocument" var body: some View { VStack { @@ -25,7 +26,7 @@ struct OnboardingConsentMarkdownRenderingView: View { .fill(Color.red) .frame(width: 200, height: 200) .overlay( - Text("Consent PDF rendering doesn't exist") + Text("First Consent PDF rendering doesn't exist") .foregroundColor(.white) .multilineTextAlignment(.center) .padding() @@ -35,7 +36,7 @@ struct OnboardingConsentMarkdownRenderingView: View { .fill(Color.green) .frame(width: 200, height: 200) .overlay( - Text("Consent PDF rendering exists") + Text("First Consent PDF rendering exists") .foregroundColor(.white) .multilineTextAlignment(.center) .padding() @@ -54,9 +55,9 @@ struct OnboardingConsentMarkdownRenderingView: View { .navigationBarTitleDisplayMode(.inline) #endif .task { - self.exportedConsent = try? await standard.loadConsent() + self.exportedConsent = try? await standard.loadConsentDocument(identifier: documentIdentifier) // Reset OnboardingDataSource - await standard.store(consent: .init()) + await standard.store(consent: .init(), identifier: documentIdentifier) } } } @@ -68,7 +69,7 @@ struct OnboardingConsentMarkdownRenderingView_Previews: PreviewProvider { static var previews: some View { - OnboardingStack(startAtStep: OnboardingConsentMarkdownRenderingView.self) { + OnboardingStack(startAtStep: OnboardingFirstConsentMarkdownRenderingView.self) { for onboardingView in OnboardingFlow.previewSimulatorViews { onboardingView .environment(standard) diff --git a/Tests/UITests/TestApp/Views/OnboardingConsentMarkdownTestView.swift b/Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownTestView.swift similarity index 65% rename from Tests/UITests/TestApp/Views/OnboardingConsentMarkdownTestView.swift rename to Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownTestView.swift index 69da0aa..c31f617 100644 --- a/Tests/UITests/TestApp/Views/OnboardingConsentMarkdownTestView.swift +++ b/Tests/UITests/TestApp/Views/OnboardingFirstConsentMarkdownTestView.swift @@ -11,18 +11,22 @@ import SpeziViews import SwiftUI -struct OnboardingConsentMarkdownTestView: View { +struct OnboardingFirstConsentMarkdownTestView: View { @Environment(OnboardingNavigationPath.self) private var path + private var documentIdentifier = "FirstConsentDocument" + var body: some View { OnboardingConsentView( markdown: { - Data("This is a *markdown* **example**".utf8) + Data("This is the first *markdown* **example**".utf8) }, action: { path.nextStep() }, + title: "First Consent", + identifier: documentIdentifier, exportConfiguration: .init(paperSize: .dinA4, includingTimestamp: true) ) } @@ -30,9 +34,9 @@ struct OnboardingConsentMarkdownTestView: View { #if DEBUG -struct OnboardingConsentMarkdownTestView_Previews: PreviewProvider { +struct OnboardingFirstConsentMarkdownTestView_Previews: PreviewProvider { static var previews: some View { - OnboardingStack(startAtStep: OnboardingConsentMarkdownTestView.self) { + OnboardingStack(startAtStep: OnboardingFirstConsentMarkdownTestView.self) { for onboardingView in OnboardingFlow.previewSimulatorViews { onboardingView } diff --git a/Tests/UITests/TestApp/Views/OnboardingFlow+PreviewSimulator.swift b/Tests/UITests/TestApp/Views/OnboardingFlow+PreviewSimulator.swift index 74c3209..4745a4e 100644 --- a/Tests/UITests/TestApp/Views/OnboardingFlow+PreviewSimulator.swift +++ b/Tests/UITests/TestApp/Views/OnboardingFlow+PreviewSimulator.swift @@ -16,8 +16,10 @@ enum OnboardingFlow { OnboardingStartTestView(showConditionalView: .constant(true)), OnboardingWelcomeTestView(), OnboardingSequentialTestView(), - OnboardingConsentMarkdownTestView(), - OnboardingConsentMarkdownRenderingView(), + OnboardingFirstConsentMarkdownTestView(), + OnboardingFirstConsentMarkdownRenderingView(), + OnboardingSecondConsentMarkdownTestView(), + OnboardingSecondConsentMarkdownRenderingView(), OnboardingCustomTestView1(exampleArgument: "test"), OnboardingCustomTestView2(), OnboardingConditionalTestView() diff --git a/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownRenderingView.swift b/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownRenderingView.swift new file mode 100644 index 0000000..054aeaa --- /dev/null +++ b/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownRenderingView.swift @@ -0,0 +1,80 @@ +// +// This source file is part of the Stanford Spezi open-source project +// +// SPDX-FileCopyrightText: 2022 Stanford University and the project authors (see CONTRIBUTORS.md) +// +// SPDX-License-Identifier: MIT +// + +import PDFKit +import SpeziOnboarding +import SpeziViews +import SwiftUI + + +struct OnboardingSecondConsentMarkdownRenderingView: View { + @Environment(OnboardingNavigationPath.self) private var path + @Environment(ExampleStandard.self) private var standard + @State var exportedConsent: PDFDocument? + + private var documentIdentifier = "SecondConsentDocument" + + var body: some View { + VStack { + if (exportedConsent?.pageCount ?? 0) == 0 { + Circle() + .fill(Color.red) + .frame(width: 200, height: 200) + .overlay( + Text("Second Consent PDF rendering doesn't exist") + .foregroundColor(.white) + .multilineTextAlignment(.center) + .padding() + ) + } else { + Circle() + .fill(Color.green) + .frame(width: 200, height: 200) + .overlay( + Text("Second Consent PDF rendering exists") + .foregroundColor(.white) + .multilineTextAlignment(.center) + .padding() + ) + } + + Button { + path.nextStep() + } label: { + Text("Next") + } + .buttonStyle(.borderedProminent) + } + .padding() + #if !os(macOS) + .navigationBarTitleDisplayMode(.inline) + #endif + .task { + self.exportedConsent = try? await standard.loadConsentDocument(identifier: documentIdentifier) + // Reset OnboardingDataSource + await standard.store(consent: .init(), identifier: documentIdentifier) + } + } +} + + +#if DEBUG +struct OnboardingSecondConsentMarkdownRenderingView_Previews: PreviewProvider { + static var standard: OnboardingDataSource = .init() + + + static var previews: some View { + OnboardingStack(startAtStep: OnboardingSecondConsentMarkdownRenderingView.self) { + for onboardingView in OnboardingFlow.previewSimulatorViews { + onboardingView + .environment(standard) + } + } + } +} +#endif diff --git a/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownTestView.swift b/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownTestView.swift new file mode 100644 index 0000000..77bf354 --- /dev/null +++ b/Tests/UITests/TestApp/Views/OnboardingSecondConsentMarkdownTestView.swift @@ -0,0 +1,46 @@ +// +// This source file is part of the Stanford Spezi open-source project +// +// SPDX-FileCopyrightText: 2022 Stanford University and the project authors (see CONTRIBUTORS.md) +// +// SPDX-License-Identifier: MIT +// + +import SpeziOnboarding +import SpeziViews +import SwiftUI + + +struct OnboardingSecondConsentMarkdownTestView: View { + @Environment(OnboardingNavigationPath.self) private var path + + private var documentIdentifier = "SecondConsentDocument" + + + var body: some View { + OnboardingConsentView( + markdown: { + Data("This is the second *markdown* **example**".utf8) + }, + action: { + path.nextStep() + }, + title: "Second Consent", + identifier: documentIdentifier, + exportConfiguration: .init(paperSize: .dinA4, includingTimestamp: true) + ) + } +} + + +#if DEBUG +struct OnboardingSecondConsentMarkdownTestView_Previews: PreviewProvider { + static var previews: some View { + OnboardingStack(startAtStep: OnboardingSecondConsentMarkdownTestView.self) { + for onboardingView in OnboardingFlow.previewSimulatorViews { + onboardingView + } + } + } +} +#endif diff --git a/Tests/UITests/TestApp/Views/OnboardingStartTestView.swift b/Tests/UITests/TestApp/Views/OnboardingStartTestView.swift index f8e283a..eb12257 100644 --- a/Tests/UITests/TestApp/Views/OnboardingStartTestView.swift +++ b/Tests/UITests/TestApp/Views/OnboardingStartTestView.swift @@ -31,15 +31,27 @@ struct OnboardingStartTestView: View { } Button { - path.append(OnboardingConsentMarkdownTestView.self) + path.append(OnboardingFirstConsentMarkdownTestView.self) } label: { - Text("Consent View (Markdown)") + Text("First Consent View (Markdown)") } Button { - path.append(OnboardingConsentMarkdownRenderingView.self) + path.append(OnboardingFirstConsentMarkdownRenderingView.self) } label: { - Text("Rendered Consent View (Markdown)") + Text("First Rendered Consent View (Markdown)") + } + + Button { + path.append(OnboardingSecondConsentMarkdownTestView.self) + } label: { + Text("Second Consent View (Markdown)") + } + + Button { + path.append(OnboardingSecondConsentMarkdownRenderingView.self) + } label: { + Text("Second Rendered Consent View (Markdown)") } Button { diff --git a/Tests/UITests/TestAppUITests/SpeziOnboardingTests.swift b/Tests/UITests/TestAppUITests/SpeziOnboardingTests.swift index 0cc1e14..46055cb 100644 --- a/Tests/UITests/TestAppUITests/SpeziOnboardingTests.swift +++ b/Tests/UITests/TestAppUITests/SpeziOnboardingTests.swift @@ -43,7 +43,7 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le // Check if on consent (markdown) view XCTAssert(app.staticTexts["Consent"].waitForExistence(timeout: 2)) - XCTAssert(app.staticTexts["This is a markdown example"].waitForExistence(timeout: 2)) + XCTAssert(app.staticTexts["This is the first markdown example"].waitForExistence(timeout: 2)) #if targetEnvironment(simulator) && (arch(i386) || arch(x86_64)) throw XCTSkip("PKCanvas view-related tests are currently skipped on Intel-based iOS simulators due to a metal bug on the simulator.") @@ -163,7 +163,7 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le app.buttons["Consent View (Markdown)"].tap() XCTAssert(app.staticTexts["Consent"].waitForExistence(timeout: 2)) - XCTAssert(app.staticTexts["This is a markdown example"].waitForExistence(timeout: 2)) + XCTAssert(app.staticTexts["This is the first markdown example"].waitForExistence(timeout: 2)) XCTAssertFalse(app.staticTexts["Leland Stanford"].waitForExistence(timeout: 2)) XCTAssertFalse(app.staticTexts["X"].waitForExistence(timeout: 2)) @@ -221,7 +221,7 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le app.buttons["Consent View (Markdown)"].tap() XCTAssert(app.staticTexts["Consent"].waitForExistence(timeout: 2)) - XCTAssert(app.staticTexts["This is a markdown example"].waitForExistence(timeout: 2)) + XCTAssert(app.staticTexts["This is the first markdown example"].waitForExistence(timeout: 2)) XCTAssertFalse(app.staticTexts["Leland Stanford"].waitForExistence(timeout: 2)) XCTAssertFalse(app.staticTexts["X"].waitForExistence(timeout: 2)) @@ -263,11 +263,11 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le app.launch() - XCTAssert(app.buttons["Consent View (Markdown)"].waitForExistence(timeout: 2)) - app.buttons["Consent View (Markdown)"].tap() + XCTAssert(app.buttons["First Consent View (Markdown)"].waitForExistence(timeout: 2)) + app.buttons["First Consent View (Markdown)"].tap() - XCTAssert(app.staticTexts["Consent"].waitForExistence(timeout: 2)) - XCTAssert(app.staticTexts["This is a markdown example"].waitForExistence(timeout: 2)) + XCTAssert(app.staticTexts["First Consent"].waitForExistence(timeout: 2)) + XCTAssert(app.staticTexts["This is the first markdown example"].waitForExistence(timeout: 2)) XCTAssert(app.staticTexts["First Name"].waitForExistence(timeout: 2)) try app.textFields["Enter your first name ..."].enter(value: "Leland") @@ -347,7 +347,7 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le #endif // Check if PDF contains consent title, name, and markdown message - for searchString in ["Spezi Consent", "This is a markdown example", "Leland Stanford"] { + for searchString in ["Spezi Consent", "This is the first markdown example", "Leland Stanford"] { let predicate = NSPredicate(format: "label CONTAINS[c] %@", searchString) XCTAssert(fileView.otherElements.containing(predicate).firstMatch.waitForExistence(timeout: 2)) } @@ -434,8 +434,8 @@ final class OnboardingTests: XCTestCase { // swiftlint:disable:this type_body_le } private func hitConsentButton(_ app: XCUIApplication) { - if app.staticTexts["This is a markdown example"].isHittable { - app.staticTexts["This is a markdown example"].swipeUp() + if app.staticTexts["This is the first markdown example"].isHittable { + app.staticTexts["This is the first markdown example"].swipeUp() } else { print("Can not scroll down.") } diff --git a/Tests/UITests/UITests.xcodeproj/project.pbxproj b/Tests/UITests/UITests.xcodeproj/project.pbxproj index 97e7633..00aac77 100644 --- a/Tests/UITests/UITests.xcodeproj/project.pbxproj +++ b/Tests/UITests/UITests.xcodeproj/project.pbxproj @@ -12,10 +12,9 @@ 2F61BDCB29DDE76D00D71D33 /* SpeziOnboardingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F61BDCA29DDE76D00D71D33 /* SpeziOnboardingTests.swift */; }; 2F6D139A28F5F386007C25D6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2F6D139928F5F386007C25D6 /* Assets.xcassets */; }; 2FA7382C290ADFAA007ACEB9 /* TestApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA7382B290ADFAA007ACEB9 /* TestApp.swift */; }; - 61D77B542BC83F0100E3165F /* OnboardingCustomToggleTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D77B532BC83F0100E3165F /* OnboardingCustomToggleTestView.swift */; }; 61040A1D2BAFA2F600EDD4EC /* OnboardingIdentifiableTestViewCustom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61040A1B2BAFA2F600EDD4EC /* OnboardingIdentifiableTestViewCustom.swift */; }; + 61D77B542BC83F0100E3165F /* OnboardingCustomToggleTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D77B532BC83F0100E3165F /* OnboardingCustomToggleTestView.swift */; }; 61F1697E2BCA888600D1622B /* OnboardingTestViewNotIdentifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1697D2BCA888600D1622B /* OnboardingTestViewNotIdentifiable.swift */; }; - 970D444B2A6F031200756FE2 /* OnboardingConsentMarkdownTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970D444A2A6F031200756FE2 /* OnboardingConsentMarkdownTestView.swift */; }; 970D444F2A6F048A00756FE2 /* OnboardingWelcomeTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970D444E2A6F048A00756FE2 /* OnboardingWelcomeTestView.swift */; }; 970D44512A6F04ED00756FE2 /* OnboardingSequentialTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970D44502A6F04ED00756FE2 /* OnboardingSequentialTestView.swift */; }; 970D44532A6F0B1900756FE2 /* OnboardingStartTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970D44522A6F0B1900756FE2 /* OnboardingStartTestView.swift */; }; @@ -26,8 +25,11 @@ 97C6AF772ACC86B70060155B /* ExampleStandard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C6AF762ACC86B70060155B /* ExampleStandard.swift */; }; 97C6AF792ACC88270060155B /* TestAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C6AF782ACC88270060155B /* TestAppDelegate.swift */; }; 97C6AF7B2ACC89000060155B /* XCTestExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = 97C6AF7A2ACC89000060155B /* XCTestExtensions */; }; - 97C6AF7D2ACC92CB0060155B /* OnboardingConsentMarkdownRenderingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C6AF7C2ACC92CB0060155B /* OnboardingConsentMarkdownRenderingView.swift */; }; 97C6AF7F2ACC94450060155B /* OnboardingFlow+PreviewSimulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C6AF7E2ACC94450060155B /* OnboardingFlow+PreviewSimulator.swift */; }; + C4997D732C22F86300C8EE72 /* OnboardingSecondConsentMarkdownRenderingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4997D6F2C22F86300C8EE72 /* OnboardingSecondConsentMarkdownRenderingView.swift */; }; + C4997D742C22F86300C8EE72 /* OnboardingFirstConsentMarkdownTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4997D702C22F86300C8EE72 /* OnboardingFirstConsentMarkdownTestView.swift */; }; + C4997D752C22F86300C8EE72 /* OnboardingSecondConsentMarkdownTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4997D712C22F86300C8EE72 /* OnboardingSecondConsentMarkdownTestView.swift */; }; + C4997D762C22F86300C8EE72 /* OnboardingFirstConsentMarkdownRenderingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4997D722C22F86300C8EE72 /* OnboardingFirstConsentMarkdownRenderingView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -49,10 +51,9 @@ 2F6D13AC28F5F386007C25D6 /* TestAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 2FA7382B290ADFAA007ACEB9 /* TestApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestApp.swift; sourceTree = ""; }; 2FB0758A299DDB9000C0B37F /* TestApp.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestApp.xctestplan; sourceTree = ""; }; - 61D77B532BC83F0100E3165F /* OnboardingCustomToggleTestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingCustomToggleTestView.swift; sourceTree = ""; }; 61040A1B2BAFA2F600EDD4EC /* OnboardingIdentifiableTestViewCustom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingIdentifiableTestViewCustom.swift; sourceTree = ""; }; + 61D77B532BC83F0100E3165F /* OnboardingCustomToggleTestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingCustomToggleTestView.swift; sourceTree = ""; }; 61F1697D2BCA888600D1622B /* OnboardingTestViewNotIdentifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTestViewNotIdentifiable.swift; sourceTree = ""; }; - 970D444A2A6F031200756FE2 /* OnboardingConsentMarkdownTestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingConsentMarkdownTestView.swift; sourceTree = ""; }; 970D444E2A6F048A00756FE2 /* OnboardingWelcomeTestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingWelcomeTestView.swift; sourceTree = ""; }; 970D44502A6F04ED00756FE2 /* OnboardingSequentialTestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingSequentialTestView.swift; sourceTree = ""; }; 970D44522A6F0B1900756FE2 /* OnboardingStartTestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStartTestView.swift; sourceTree = ""; }; @@ -62,8 +63,11 @@ 97A8FF302A74607F008CD91A /* CustomToggleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomToggleView.swift; sourceTree = ""; }; 97C6AF762ACC86B70060155B /* ExampleStandard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleStandard.swift; sourceTree = ""; }; 97C6AF782ACC88270060155B /* TestAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAppDelegate.swift; sourceTree = ""; }; - 97C6AF7C2ACC92CB0060155B /* OnboardingConsentMarkdownRenderingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingConsentMarkdownRenderingView.swift; sourceTree = ""; }; 97C6AF7E2ACC94450060155B /* OnboardingFlow+PreviewSimulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OnboardingFlow+PreviewSimulator.swift"; sourceTree = ""; }; + C4997D6F2C22F86300C8EE72 /* OnboardingSecondConsentMarkdownRenderingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingSecondConsentMarkdownRenderingView.swift; sourceTree = ""; }; + C4997D702C22F86300C8EE72 /* OnboardingFirstConsentMarkdownTestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingFirstConsentMarkdownTestView.swift; sourceTree = ""; }; + C4997D712C22F86300C8EE72 /* OnboardingSecondConsentMarkdownTestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingSecondConsentMarkdownTestView.swift; sourceTree = ""; }; + C4997D722C22F86300C8EE72 /* OnboardingFirstConsentMarkdownRenderingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingFirstConsentMarkdownRenderingView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -144,9 +148,11 @@ 970D44522A6F0B1900756FE2 /* OnboardingStartTestView.swift */, 970D444E2A6F048A00756FE2 /* OnboardingWelcomeTestView.swift */, 970D44502A6F04ED00756FE2 /* OnboardingSequentialTestView.swift */, - 970D444A2A6F031200756FE2 /* OnboardingConsentMarkdownTestView.swift */, - 97C6AF7C2ACC92CB0060155B /* OnboardingConsentMarkdownRenderingView.swift */, 97A8FF2B2A74449F008CD91A /* OnboardingCustomTestView1.swift */, + C4997D702C22F86300C8EE72 /* OnboardingFirstConsentMarkdownTestView.swift */, + C4997D722C22F86300C8EE72 /* OnboardingFirstConsentMarkdownRenderingView.swift */, + C4997D712C22F86300C8EE72 /* OnboardingSecondConsentMarkdownTestView.swift */, + C4997D6F2C22F86300C8EE72 /* OnboardingSecondConsentMarkdownRenderingView.swift */, 97A8FF2D2A7444FC008CD91A /* OnboardingCustomTestView2.swift */, 970D44542A6F119600756FE2 /* OnboardingConditionalTestView.swift */, 97C6AF7E2ACC94450060155B /* OnboardingFlow+PreviewSimulator.swift */, @@ -295,22 +301,24 @@ buildActionMask = 2147483647; files = ( 97C6AF792ACC88270060155B /* TestAppDelegate.swift in Sources */, + C4997D752C22F86300C8EE72 /* OnboardingSecondConsentMarkdownTestView.swift in Sources */, 61F1697E2BCA888600D1622B /* OnboardingTestViewNotIdentifiable.swift in Sources */, + C4997D742C22F86300C8EE72 /* OnboardingFirstConsentMarkdownTestView.swift in Sources */, + C4997D732C22F86300C8EE72 /* OnboardingSecondConsentMarkdownRenderingView.swift in Sources */, 970D44552A6F119600756FE2 /* OnboardingConditionalTestView.swift in Sources */, 97C6AF772ACC86B70060155B /* ExampleStandard.swift in Sources */, 970D44532A6F0B1900756FE2 /* OnboardingStartTestView.swift in Sources */, 970D44512A6F04ED00756FE2 /* OnboardingSequentialTestView.swift in Sources */, 61D77B542BC83F0100E3165F /* OnboardingCustomToggleTestView.swift in Sources */, + C4997D762C22F86300C8EE72 /* OnboardingFirstConsentMarkdownRenderingView.swift in Sources */, 97A8FF2C2A74449F008CD91A /* OnboardingCustomTestView1.swift in Sources */, 2FA7382C290ADFAA007ACEB9 /* TestApp.swift in Sources */, 97A8FF2E2A7444FC008CD91A /* OnboardingCustomTestView2.swift in Sources */, 2F61BDC929DD3CC000D71D33 /* OnboardingTestsView.swift in Sources */, 61040A1D2BAFA2F600EDD4EC /* OnboardingIdentifiableTestViewCustom.swift in Sources */, 97C6AF7F2ACC94450060155B /* OnboardingFlow+PreviewSimulator.swift in Sources */, - 97C6AF7D2ACC92CB0060155B /* OnboardingConsentMarkdownRenderingView.swift in Sources */, 970D444F2A6F048A00756FE2 /* OnboardingWelcomeTestView.swift in Sources */, 97A8FF312A74607F008CD91A /* CustomToggleView.swift in Sources */, - 970D444B2A6F031200756FE2 /* OnboardingConsentMarkdownTestView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };