From 69a9b1114cb95a0cadca04f99b15890341c54d97 Mon Sep 17 00:00:00 2001 From: Magnus Holm Date: Thu, 25 Sep 2025 11:06:22 +0200 Subject: [PATCH] feat: use source in release store --- .../core/src/releases/releasesStore.test.ts | 12 ++++++---- .../src/hooks/releases/useActiveReleases.ts | 24 +++++++------------ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/core/src/releases/releasesStore.test.ts b/packages/core/src/releases/releasesStore.test.ts index 7015dff81..2cf93e6a6 100644 --- a/packages/core/src/releases/releasesStore.test.ts +++ b/packages/core/src/releases/releasesStore.test.ts @@ -3,6 +3,7 @@ import {of, Subject} from 'rxjs' import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest' import {getClientState} from '../client/clientStore' +import {sourceFor} from '../config/sanityConfig' import {createSanityInstance, type SanityInstance} from '../store/createSanityInstance' import {type StateSource} from '../store/createStateSourceAction' import {listenQuery} from '../utils/listenQuery' @@ -20,6 +21,7 @@ vi.mock('../utils/listenQuery', () => ({ let consoleErrorSpy: ReturnType describe('releasesStore', () => { + const source = sourceFor({projectId: 'test', dataset: 'test'}) let instance: SanityInstance const mockClient = {} as SanityClient @@ -58,7 +60,7 @@ describe('releasesStore', () => { vi.mocked(listenQuery).mockReturnValue(of(mockReleases)) - const state = getActiveReleasesState(instance, {}) + const state = getActiveReleasesState(instance, {source}) await new Promise((resolve) => setTimeout(resolve, 0)) @@ -72,7 +74,7 @@ describe('releasesStore', () => { const releasesSubject = new Subject() vi.mocked(listenQuery).mockReturnValue(releasesSubject.asObservable()) - const state = getActiveReleasesState(instance, {}) + const state = getActiveReleasesState(instance, {source}) // Initial state should be default expect(state.getCurrent()).toBeUndefined() // Default initial state @@ -116,7 +118,7 @@ describe('releasesStore', () => { // Configure listenQuery to return an empty array vi.mocked(listenQuery).mockReturnValue(of([])) - const state = getActiveReleasesState(instance, {}) + const state = getActiveReleasesState(instance, {source}) await new Promise((resolve) => setTimeout(resolve, 0)) @@ -127,7 +129,7 @@ describe('releasesStore', () => { it('should handle null/undefined from listenQuery by defaulting to empty array', async () => { // Test null case vi.mocked(listenQuery).mockReturnValue(of(null)) - const state = getActiveReleasesState(instance, {}) + const state = getActiveReleasesState(instance, {source}) await new Promise((resolve) => setTimeout(resolve, 0)) expect(state.getCurrent()).toEqual([]) expect(consoleErrorSpy).not.toHaveBeenCalled() @@ -146,7 +148,7 @@ describe('releasesStore', () => { vi.mocked(listenQuery).mockReturnValue(subject.asObservable()) // initialize the store - const state = getActiveReleasesState(instance, {}) + const state = getActiveReleasesState(instance, {source}) // Error the subject subject.error(error) diff --git a/packages/react/src/hooks/releases/useActiveReleases.ts b/packages/react/src/hooks/releases/useActiveReleases.ts index ced6eeb5b..a7bcc1d73 100644 --- a/packages/react/src/hooks/releases/useActiveReleases.ts +++ b/packages/react/src/hooks/releases/useActiveReleases.ts @@ -1,12 +1,8 @@ -import { - getActiveReleasesState, - type ReleaseDocument, - type SanityInstance, - type StateSource, -} from '@sanity/sdk' -import {filter, firstValueFrom} from 'rxjs' +import {getActiveReleasesState, type ReleaseDocument} from '@sanity/sdk' +import {useMemo} from 'react' -import {createStateSourceHook} from '../helpers/createStateSourceHook' +import {useSanityInstanceAndSource} from '../context/useSanityInstance' +import {useStoreState} from '../helpers/useStoreState' /** * @public @@ -30,10 +26,8 @@ type UseActiveReleases = { * const activeReleases = useActiveReleases() * ``` */ -export const useActiveReleases: UseActiveReleases = createStateSourceHook({ - getState: getActiveReleasesState as (instance: SanityInstance) => StateSource, - shouldSuspend: (instance: SanityInstance) => - getActiveReleasesState(instance, {}).getCurrent() === undefined, - suspender: (instance: SanityInstance) => - firstValueFrom(getActiveReleasesState(instance, {}).observable.pipe(filter(Boolean))), -}) +export const useActiveReleases: UseActiveReleases = () => { + const [instance, source] = useSanityInstanceAndSource({}) + const state = useMemo(() => getActiveReleasesState(instance, {source}), [instance, source]) + return useStoreState(state) +}