Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions packages/core/src/releases/releasesStore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -20,6 +21,7 @@ vi.mock('../utils/listenQuery', () => ({
let consoleErrorSpy: ReturnType<typeof vi.spyOn>

describe('releasesStore', () => {
const source = sourceFor({projectId: 'test', dataset: 'test'})
let instance: SanityInstance
const mockClient = {} as SanityClient

Expand Down Expand Up @@ -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))

Expand All @@ -72,7 +74,7 @@ describe('releasesStore', () => {
const releasesSubject = new Subject<ReleaseDocument[]>()
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
Expand Down Expand Up @@ -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))

Expand All @@ -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()
Expand All @@ -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)
Expand Down
24 changes: 9 additions & 15 deletions packages/react/src/hooks/releases/useActiveReleases.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -30,10 +26,8 @@ type UseActiveReleases = {
* const activeReleases = useActiveReleases()
* ```
*/
export const useActiveReleases: UseActiveReleases = createStateSourceHook({
getState: getActiveReleasesState as (instance: SanityInstance) => StateSource<ReleaseDocument[]>,
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)
}
Loading