Skip to content

Commit e3650f5

Browse files
committed
feat: add support for source in useDocumentPreview
1 parent 03e702a commit e3650f5

File tree

5 files changed

+38
-17
lines changed

5 files changed

+38
-17
lines changed

packages/core/src/preview/getPreviewState.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {NEVER} from 'rxjs'
22
import {describe, it} from 'vitest'
33

4+
import {sourceFor} from '../config/sanityConfig'
45
import {createSanityInstance, type SanityInstance} from '../store/createSanityInstance'
56
import {type StoreState} from '../store/createStoreState'
67
import {insecureRandomId} from '../utils/ids'
@@ -18,7 +19,11 @@ vi.mock('./subscribeToStateAndFetchBatches.ts')
1819

1920
describe('getPreviewState', () => {
2021
let instance: SanityInstance
21-
const docHandle = {documentId: 'exampleId', documentType: 'exampleType'}
22+
const docHandle = {
23+
documentId: 'exampleId',
24+
documentType: 'exampleType',
25+
source: sourceFor({projectId: 'test', dataset: 'test'}),
26+
}
2227
let state: StoreState<PreviewStoreState & {extra?: unknown}>
2328

2429
beforeEach(() => {

packages/core/src/preview/getPreviewState.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {omit} from 'lodash-es'
22

3-
import {type DocumentHandle} from '../config/sanityConfig'
3+
import {type DocumentSource} from '../config/sanityConfig'
44
import {bindActionByDataset} from '../store/createActionBinder'
55
import {type SanityInstance} from '../store/createSanityInstance'
66
import {
@@ -20,7 +20,11 @@ import {STABLE_EMPTY_PREVIEW} from './util'
2020
/**
2121
* @beta
2222
*/
23-
export type GetPreviewStateOptions = DocumentHandle
23+
export type GetPreviewStateOptions = {
24+
documentId: string
25+
documentType: string
26+
source: DocumentSource
27+
}
2428

2529
/**
2630
* @beta

packages/core/src/preview/resolvePreview.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {of} from 'rxjs'
22
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'
33

4-
import {createDocumentHandle} from '../config/handles'
4+
import {sourceFor} from '../config/sanityConfig'
55
import {createSanityInstance, type SanityInstance} from '../store/createSanityInstance'
66
import {type StateSource} from '../store/createStateSourceAction'
77
import {getPreviewState} from './getPreviewState'
@@ -31,10 +31,11 @@ describe('resolvePreview', () => {
3131
})
3232

3333
it('resolves a preview and returns the first emitted value with results', async () => {
34-
const docHandle = createDocumentHandle({
34+
const docHandle = {
3535
documentId: 'doc123',
3636
documentType: 'movie',
37-
})
37+
source: sourceFor({projectId: 'p', dataset: 'd'}),
38+
}
3839

3940
const result = await resolvePreview(instance, docHandle)
4041

packages/core/src/preview/resolvePreview.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import {filter, firstValueFrom} from 'rxjs'
22

3-
import {type DocumentHandle} from '../config/sanityConfig'
43
import {bindActionByDataset} from '../store/createActionBinder'
5-
import {getPreviewState} from './getPreviewState'
4+
import {getPreviewState, type GetPreviewStateOptions} from './getPreviewState'
65
import {previewStore} from './previewStore'
76

87
/**
98
* @beta
109
*/
11-
export type ResolvePreviewOptions = DocumentHandle
10+
export type ResolvePreviewOptions = GetPreviewStateOptions
1211

1312
/**
1413
* @beta

packages/react/src/hooks/preview/useDocumentPreview.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
1-
import {type DocumentHandle, getPreviewState, type PreviewValue, resolvePreview} from '@sanity/sdk'
2-
import {useCallback, useSyncExternalStore} from 'react'
1+
import {
2+
getPreviewState,
3+
type GetPreviewStateOptions,
4+
type PreviewValue,
5+
resolvePreview,
6+
} from '@sanity/sdk'
7+
import {useCallback, useMemo, useSyncExternalStore} from 'react'
38
import {distinctUntilChanged, EMPTY, Observable, startWith, switchMap} from 'rxjs'
49

5-
import {useSanityInstance} from '../context/useSanityInstance'
10+
import {type SourceOptions} from '../../type'
11+
import {useSanityInstanceAndSource} from '../context/useSanityInstance'
612

713
/**
814
* @public
915
* @category Types
1016
*/
11-
export interface useDocumentPreviewOptions extends DocumentHandle {
17+
export interface useDocumentPreviewOptions
18+
extends Omit<GetPreviewStateOptions, 'source'>,
19+
SourceOptions {
1220
/**
1321
* Optional ref object to track visibility. When provided, preview resolution
1422
* only occurs when the referenced element is visible in the viewport.
@@ -81,10 +89,14 @@ export interface useDocumentPreviewResults {
8189
*/
8290
export function useDocumentPreview({
8391
ref,
92+
projectId,
93+
dataset,
94+
source,
8495
...docHandle
8596
}: useDocumentPreviewOptions): useDocumentPreviewResults {
86-
const instance = useSanityInstance(docHandle)
87-
const stateSource = getPreviewState(instance, docHandle)
97+
const [instance, actualSource] = useSanityInstanceAndSource({projectId, dataset, source})
98+
const options = useMemo(() => ({...docHandle, source: actualSource}), [docHandle, actualSource])
99+
const stateSource = getPreviewState(instance, options)
88100

89101
// Create subscribe function for useSyncExternalStore
90102
const subscribe = useCallback(
@@ -131,9 +143,9 @@ export function useDocumentPreview({
131143
// Create getSnapshot function to return current state
132144
const getSnapshot = useCallback(() => {
133145
const currentState = stateSource.getCurrent()
134-
if (currentState.data === null) throw resolvePreview(instance, docHandle)
146+
if (currentState.data === null) throw resolvePreview(instance, options)
135147
return currentState as useDocumentPreviewResults
136-
}, [docHandle, instance, stateSource])
148+
}, [instance, options, stateSource])
137149

138150
return useSyncExternalStore(subscribe, getSnapshot)
139151
}

0 commit comments

Comments
 (0)