|
|
|
@@ -0,0 +1,79 @@
|
|
|
|
|
import SwiftData
|
|
|
|
|
import SwiftUI
|
|
|
|
|
|
|
|
|
|
/// A preview modifier that provides an empty SwiftData model container for SwiftUI previews.
|
|
|
|
|
///
|
|
|
|
|
/// This modifier creates an in-memory SwiftData model container with no data, useful for testing and previewing views in their empty or initial state.
|
|
|
|
|
/// It's particularly helpful for testing empty state UI, loading states, or views that should gracefully handle no data.
|
|
|
|
|
///
|
|
|
|
|
/// ## Usage
|
|
|
|
|
/// Use the `.emptyContainer` trait on your preview:
|
|
|
|
|
///
|
|
|
|
|
/// ```swift
|
|
|
|
|
/// #Preview(traits: .emptyContainer) {
|
|
|
|
|
/// TaskGroupListView()
|
|
|
|
|
/// }
|
|
|
|
|
/// ```
|
|
|
|
|
///
|
|
|
|
|
/// This automatically provides an empty model container to the preview, allowing SwiftData queries to return empty results.
|
|
|
|
|
struct EmptyContainerModifier: PreviewModifier {
|
|
|
|
|
|
|
|
|
|
// MARK: Functions
|
|
|
|
|
|
|
|
|
|
/// Creates and configures a shared in-memory model container with no data.
|
|
|
|
|
///
|
|
|
|
|
/// This method is called once when the preview is loaded and creates an in-memory
|
|
|
|
|
/// SwiftData container with no persisted entities. The container is configured
|
|
|
|
|
/// to store data only in memory, ensuring previews don't affect any persistent storage.
|
|
|
|
|
///
|
|
|
|
|
/// - Returns: An empty `ModelContainer` configured for in-memory storage.
|
|
|
|
|
/// - Throws: An error if the model container cannot be created.
|
|
|
|
|
static func makeSharedContext() async throws -> ModelContainer {
|
|
|
|
|
try ModelContainer(
|
|
|
|
|
for: Todo.self,
|
|
|
|
|
configurations: .init(isStoredInMemoryOnly: true)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Applies the empty model container to the preview content.
|
|
|
|
|
///
|
|
|
|
|
/// This method is called by SwiftUI to apply the modifier to the preview.
|
|
|
|
|
/// It injects the empty model container into the SwiftUI environment, making it
|
|
|
|
|
/// available to any views that use `@Query` or `@Environment(\.modelContext)`.
|
|
|
|
|
/// Queries will return empty results, allowing you to test empty state behavior.
|
|
|
|
|
///
|
|
|
|
|
/// - Parameters:
|
|
|
|
|
/// - content: The preview content to modify.
|
|
|
|
|
/// - context: The empty model container.
|
|
|
|
|
/// - Returns: The content with the empty model container applied.
|
|
|
|
|
func body(
|
|
|
|
|
content: Content,
|
|
|
|
|
context: ModelContainer
|
|
|
|
|
) -> some View {
|
|
|
|
|
content.modelContainer(context)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MARK: - PreviewTrait
|
|
|
|
|
|
|
|
|
|
extension PreviewTrait where T == Preview.ViewTraits {
|
|
|
|
|
|
|
|
|
|
/// A preview trait that provides an empty model container.
|
|
|
|
|
///
|
|
|
|
|
/// Use this trait to test views in their empty state without any data.
|
|
|
|
|
/// This is particularly useful for testing empty state UI, placeholder content,
|
|
|
|
|
/// and ensuring views handle the absence of data gracefully.
|
|
|
|
|
///
|
|
|
|
|
/// ## Example
|
|
|
|
|
/// ```swift
|
|
|
|
|
/// #Preview("Empty State", traits: .emptyContainer) {
|
|
|
|
|
/// TaskGroupListView()
|
|
|
|
|
/// }
|
|
|
|
|
/// ```
|
|
|
|
|
///
|
|
|
|
|
/// The view will receive an empty SwiftData container, causing any `@Query`
|
|
|
|
|
/// properties to return empty collections.
|
|
|
|
|
static var emptyContainer: Self = .modifier(EmptyContainerModifier())
|
|
|
|
|
|
|
|
|
|
}
|