next-sanity 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +14 -14
- package/src/types.ts +8 -0
- package/src/useSubscription.ts +1 -8
package/dist/index.d.ts
CHANGED
|
@@ -52,7 +52,7 @@ export {groq}
|
|
|
52
52
|
|
|
53
53
|
export declare type GroqStoreEventSource = Config['EventSource']
|
|
54
54
|
|
|
55
|
-
declare type Params = Record<string, unknown>
|
|
55
|
+
export declare type Params = Record<string, unknown>
|
|
56
56
|
|
|
57
57
|
export declare interface ProjectConfig {
|
|
58
58
|
projectId: string
|
|
@@ -64,7 +64,7 @@ export declare interface ProjectConfig {
|
|
|
64
64
|
|
|
65
65
|
export declare type SanityClient = SanityClient_2
|
|
66
66
|
|
|
67
|
-
declare interface SubscriptionOptions<R = any> {
|
|
67
|
+
export declare interface SubscriptionOptions<R = any> {
|
|
68
68
|
enabled?: boolean
|
|
69
69
|
params?: Params
|
|
70
70
|
initialData?: R
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {ProjectConfig} from './types'\n\nconst EMPTY_PARAMS = {}\n\nexport type Params = Record<string, unknown>\nexport interface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {Params, ProjectConfig, SubscriptionOptions} from './types'\n\nconst EMPTY_PARAMS = {}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {ProjectConfig} from './types'\n\nconst EMPTY_PARAMS = {}\n\nexport type Params = Record<string, unknown>\nexport interface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","Promise","resolve","_interopNamespace","require","groqStore","Error","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {Params, ProjectConfig, SubscriptionOptions} from './types'\n\nconst EMPTY_PARAMS = {}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","Promise","resolve","_interopNamespace","require","groqStore","Error","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-sanity",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Sanity.io toolkit for Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -80,32 +80,32 @@
|
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
82
|
"@sanity/client": "^3.4.1",
|
|
83
|
-
"@sanity/groq-store": "^0.
|
|
83
|
+
"@sanity/groq-store": "^1.0.2",
|
|
84
84
|
"groq": "^2.33.2"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
87
|
"@async-fn/jest": "^1.6.4",
|
|
88
|
-
"@rollup/plugin-url": "^8.0.
|
|
88
|
+
"@rollup/plugin-url": "^8.0.1",
|
|
89
89
|
"@sanity/eslint-config-studio": "^2.0.0",
|
|
90
|
-
"@sanity/pkg-utils": "^1.
|
|
90
|
+
"@sanity/pkg-utils": "^1.16.0",
|
|
91
91
|
"@sanity/semantic-release-preset": "^2.0.2",
|
|
92
92
|
"@testing-library/react-hooks": "^8.0.1",
|
|
93
|
-
"@types/eventsource": "^1.1.
|
|
94
|
-
"@types/jest": "^29.
|
|
95
|
-
"@types/react": "^18.0.
|
|
96
|
-
"@types/react-dom": "^18.0.
|
|
93
|
+
"@types/eventsource": "^1.1.10",
|
|
94
|
+
"@types/jest": "^29.2.0",
|
|
95
|
+
"@types/react": "^18.0.24",
|
|
96
|
+
"@types/react-dom": "^18.0.8",
|
|
97
97
|
"@types/styled-components": "^5.1.26",
|
|
98
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
99
|
-
"eslint": "^8.
|
|
100
|
-
"eslint-config-next": "^
|
|
98
|
+
"@typescript-eslint/eslint-plugin": "^5.41.0",
|
|
99
|
+
"eslint": "^8.26.0",
|
|
100
|
+
"eslint-config-next": "^13.0.0",
|
|
101
101
|
"eslint-config-prettier": "^8.5.0",
|
|
102
102
|
"eslint-config-sanity": "^6.0.0",
|
|
103
103
|
"eslint-gitignore": "^0.1.0",
|
|
104
104
|
"eslint-plugin-prettier": "^4.2.1",
|
|
105
105
|
"eslint-plugin-simple-import-sort": "^8.0.0",
|
|
106
|
-
"jest": "^29.
|
|
107
|
-
"jest-environment-jsdom": "^29.
|
|
108
|
-
"next": "^
|
|
106
|
+
"jest": "^29.2.2",
|
|
107
|
+
"jest-environment-jsdom": "^29.2.2",
|
|
108
|
+
"next": "^13.0.0",
|
|
109
109
|
"prettier": "^2.7.1",
|
|
110
110
|
"prettier-plugin-packagejson": "^2.3.0",
|
|
111
111
|
"react": "^18.2.0",
|
package/src/types.ts
CHANGED
package/src/useSubscription.ts
CHANGED
|
@@ -3,17 +3,10 @@ import {useEffect, useMemo, useState} from 'react'
|
|
|
3
3
|
|
|
4
4
|
import {Aborter, getAborter} from './aborter'
|
|
5
5
|
import {getCurrentUser} from './currentUser'
|
|
6
|
-
import {ProjectConfig} from './types'
|
|
6
|
+
import {Params, ProjectConfig, SubscriptionOptions} from './types'
|
|
7
7
|
|
|
8
8
|
const EMPTY_PARAMS = {}
|
|
9
9
|
|
|
10
|
-
export type Params = Record<string, unknown>
|
|
11
|
-
export interface SubscriptionOptions<R = any> {
|
|
12
|
-
enabled?: boolean
|
|
13
|
-
params?: Params
|
|
14
|
-
initialData?: R
|
|
15
|
-
}
|
|
16
|
-
|
|
17
10
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
18
11
|
export function createPreviewSubscriptionHook({
|
|
19
12
|
projectId,
|