diff --git a/Sources/AppState/Application/Application+public.swift b/Sources/AppState/Application/Application+public.swift index 67695df..d1f0e1b 100644 --- a/Sources/AppState/Application/Application+public.swift +++ b/Sources/AppState/Application/Application+public.swift @@ -1,4 +1,7 @@ import Foundation +#if !os(Linux) && !os(Windows) +import SwiftUI +#endif // MARK: Application Functions @@ -293,6 +296,32 @@ public extension Application { } } +#if !os(Linux) && !os(Windows) +// MARK: - SwiftUI Preview Dependency Functions + +public extension Application { + /** + Use in SwiftUI previews to inject mock dependencies into the content view. + + - Parameters: + - dependencyOverrides: An array of `Application.override(_, with:)` outputs that you want to use for the preview. + - content: A closure that returns the View you want to preview. + + - Returns: A View with the overridden dependencies applied. + */ + @ViewBuilder + static func preview( + _ dependencyOverrides: DependencyOverride..., + content: @escaping () -> Content + ) -> some View { + ApplicationPreview( + dependencyOverrides: dependencyOverrides, + content: content + ) + } +} +#endif + // MARK: - State Functions public extension Application { diff --git a/Sources/AppState/Application/Types/Helper/Application+ApplicationPreview.swift b/Sources/AppState/Application/Types/Helper/Application+ApplicationPreview.swift new file mode 100644 index 0000000..35d6cf9 --- /dev/null +++ b/Sources/AppState/Application/Types/Helper/Application+ApplicationPreview.swift @@ -0,0 +1,22 @@ +#if !os(Linux) && !os(Windows) +import SwiftUI + +extension Application { + struct ApplicationPreview: View { + let dependencyOverrides: [DependencyOverride] + let content: () -> Content + + init( + dependencyOverrides: [DependencyOverride], + content: @escaping () -> Content + ) { + self.dependencyOverrides = dependencyOverrides + self.content = content + } + + var body: some View { + content() + } + } +} +#endif