From 15f721c117770260423514b306822591288e7062 Mon Sep 17 00:00:00 2001 From: ogaclejapan Date: Sun, 18 Aug 2024 16:40:39 +0900 Subject: [PATCH] Add preview clients Provides the ability to preview specific queries and mutations for composable previews. --- .../compose/tooling/MutationPreviewClient.kt | 51 +++++++++++++ .../compose/tooling/QueryPreviewClient.kt | 74 +++++++++++++++++++ .../query/compose/tooling/SwrPreviewClient.kt | 35 +++++++++ 3 files changed, 160 insertions(+) create mode 100644 soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/MutationPreviewClient.kt create mode 100644 soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/QueryPreviewClient.kt create mode 100644 soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/SwrPreviewClient.kt diff --git a/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/MutationPreviewClient.kt b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/MutationPreviewClient.kt new file mode 100644 index 0000000..7be9604 --- /dev/null +++ b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/MutationPreviewClient.kt @@ -0,0 +1,51 @@ +// Copyright 2024 Soil Contributors +// SPDX-License-Identifier: Apache-2.0 + +package soil.query.compose.tooling + +import androidx.compose.runtime.Stable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import soil.query.MutationClient +import soil.query.MutationCommand +import soil.query.MutationKey +import soil.query.MutationOptions +import soil.query.MutationRef +import soil.query.MutationState +import soil.query.core.UniqueId + +/** + * Usage: + * ```kotlin + * val client = MutationPreviewClient( + * previewData = mapOf( + * MyMutationId to MutationState.success("data"), + * .. + * ) + * ) + * ``` + */ +@Stable +class MutationPreviewClient( + private val previewData: Map>, + override val defaultMutationOptions: MutationOptions = MutationOptions +) : MutationClient { + + @Suppress("UNCHECKED_CAST") + override fun getMutation(key: MutationKey): MutationRef { + val state = previewData[key.id] as? MutationState ?: MutationState.initial() + val options = key.onConfigureOptions()?.invoke(defaultMutationOptions) ?: defaultMutationOptions + return SnapshotMutation(key, options, MutableStateFlow(state)) + } + + private class SnapshotMutation( + override val key: MutationKey, + override val options: MutationOptions, + override val state: StateFlow> + ) : MutationRef { + override fun launchIn(scope: CoroutineScope): Job = Job() + override suspend fun send(command: MutationCommand) = Unit + } +} diff --git a/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/QueryPreviewClient.kt b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/QueryPreviewClient.kt new file mode 100644 index 0000000..04f39f9 --- /dev/null +++ b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/QueryPreviewClient.kt @@ -0,0 +1,74 @@ +// Copyright 2024 Soil Contributors +// SPDX-License-Identifier: Apache-2.0 + +package soil.query.compose.tooling + +import androidx.compose.runtime.Stable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import soil.query.InfiniteQueryKey +import soil.query.InfiniteQueryRef +import soil.query.QueryChunks +import soil.query.QueryClient +import soil.query.QueryCommand +import soil.query.QueryKey +import soil.query.QueryOptions +import soil.query.QueryRef +import soil.query.QueryState +import soil.query.core.UniqueId + +/** + * Usage: + * ```kotlin + * val client = QueryPreviewClient( + * previewData = mapOf( + * MyQueryId to QueryState.success("data"), + * .. + * ) + * ) + * ``` + */ +@Stable +class QueryPreviewClient( + private val previewData: Map>, + override val defaultQueryOptions: QueryOptions = QueryOptions +) : QueryClient { + + @Suppress("UNCHECKED_CAST") + override fun getQuery(key: QueryKey): QueryRef { + val state = previewData[key.id] as? QueryState ?: QueryState.initial() + val options = key.onConfigureOptions()?.invoke(defaultQueryOptions) ?: defaultQueryOptions + return SnapshotQuery(key, options, MutableStateFlow(state)) + } + + @Suppress("UNCHECKED_CAST") + override fun getInfiniteQuery(key: InfiniteQueryKey): InfiniteQueryRef { + val state = previewData[key.id] as? QueryState> ?: QueryState.initial() + val options = key.onConfigureOptions()?.invoke(defaultQueryOptions) ?: defaultQueryOptions + return SnapshotInfiniteQuery(key, options, MutableStateFlow(state)) + } + + override fun prefetchQuery(key: QueryKey): Job = Job() + + override fun prefetchInfiniteQuery(key: InfiniteQueryKey): Job = Job() + + private class SnapshotQuery( + override val key: QueryKey, + override val options: QueryOptions, + override val state: StateFlow> + ) : QueryRef { + override fun launchIn(scope: CoroutineScope): Job = Job() + override suspend fun send(command: QueryCommand) = Unit + } + + private class SnapshotInfiniteQuery( + override val key: InfiniteQueryKey, + override val options: QueryOptions, + override val state: StateFlow>> + ) : InfiniteQueryRef { + override fun launchIn(scope: CoroutineScope): Job = Job() + override suspend fun send(command: QueryCommand>) = Unit + } +} diff --git a/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/SwrPreviewClient.kt b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/SwrPreviewClient.kt new file mode 100644 index 0000000..9ec770b --- /dev/null +++ b/soil-query-compose/src/commonMain/kotlin/soil/query/compose/tooling/SwrPreviewClient.kt @@ -0,0 +1,35 @@ +// Copyright 2024 Soil Contributors +// SPDX-License-Identifier: Apache-2.0 + +package soil.query.compose.tooling + +import androidx.compose.runtime.Stable +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import soil.query.MutationClient +import soil.query.QueryClient +import soil.query.QueryEffect +import soil.query.SwrClient +import soil.query.core.ErrorRecord + +/** + * Provides the ability to preview specific queries and mutations for composable previews. + * + * ``` + * val client = SwrPreviewClient(..) + * SwrClientProvider(client = client) { + * // Composable previews + * } + * ``` + */ +@Stable +class SwrPreviewClient( + queryPreviewClient: QueryPreviewClient = QueryPreviewClient(emptyMap()), + mutationPreviewClient: MutationPreviewClient = MutationPreviewClient(emptyMap()), + override val errorRelay: Flow = flow { } +) : SwrClient, QueryClient by queryPreviewClient, MutationClient by mutationPreviewClient { + override fun perform(sideEffects: QueryEffect): Job = Job() + override fun onMount(id: String) = Unit + override fun onUnmount(id: String) = Unit +}