@prismicio/react 2.9.0 → 3.0.0-alpha.0
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/README.md +10 -11
- package/dist/PrismicImage.d.ts +18 -633
- package/dist/PrismicImage.js +32 -33
- package/dist/PrismicImage.js.map +1 -1
- package/dist/PrismicLink.d.ts +77 -6
- package/dist/PrismicLink.js +42 -7
- package/dist/PrismicLink.js.map +1 -1
- package/dist/PrismicRichText.d.ts +117 -4
- package/dist/PrismicRichText.js +74 -8
- package/dist/PrismicRichText.js.map +1 -1
- package/dist/PrismicText.d.ts +8 -13
- package/dist/PrismicText.js +15 -16
- package/dist/PrismicText.js.map +1 -1
- package/dist/PrismicToolbar.d.ts +2 -12
- package/dist/PrismicToolbar.js +8 -10
- package/dist/PrismicToolbar.js.map +1 -1
- package/dist/SliceZone.d.ts +16 -70
- package/dist/SliceZone.js +16 -37
- package/dist/SliceZone.js.map +1 -1
- package/dist/index.d.ts +13 -21
- package/dist/index.js +2 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/devMsg.d.ts +2 -2
- package/dist/lib/devMsg.js +2 -2
- package/dist/lib/devMsg.js.map +1 -1
- package/dist/package.json.js +1 -1
- package/package.json +53 -70
- package/src/PrismicImage.tsx +80 -65
- package/src/PrismicLink.tsx +196 -26
- package/src/PrismicRichText.tsx +333 -33
- package/src/PrismicText.tsx +25 -30
- package/src/PrismicToolbar.tsx +10 -30
- package/src/SliceZone.tsx +58 -150
- package/src/index.ts +17 -53
- package/src/lib/devMsg.ts +3 -3
- package/dist/PrismicImage.cjs +0 -68
- package/dist/PrismicImage.cjs.map +0 -1
- package/dist/PrismicLink.cjs +0 -29
- package/dist/PrismicLink.cjs.map +0 -1
- package/dist/PrismicProvider.cjs +0 -41
- package/dist/PrismicProvider.cjs.map +0 -1
- package/dist/PrismicProvider.d.ts +0 -83
- package/dist/PrismicProvider.js +0 -24
- package/dist/PrismicProvider.js.map +0 -1
- package/dist/PrismicRichText.cjs +0 -30
- package/dist/PrismicRichText.cjs.map +0 -1
- package/dist/PrismicText.cjs +0 -44
- package/dist/PrismicText.cjs.map +0 -1
- package/dist/PrismicToolbar.cjs +0 -43
- package/dist/PrismicToolbar.cjs.map +0 -1
- package/dist/SliceZone.cjs +0 -53
- package/dist/SliceZone.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.cjs +0 -16
- package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.js +0 -16
- package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.cjs +0 -13
- package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.js +0 -13
- package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.cjs +0 -22
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.js +0 -22
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.cjs +0 -46
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.js +0 -46
- package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.cjs +0 -47
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.js +0 -47
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.cjs +0 -28
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.js +0 -28
- package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asText.cjs +0 -21
- package/dist/_node_modules/@prismicio/client/dist/helpers/asText.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/asText.js +0 -21
- package/dist/_node_modules/@prismicio/client/dist/helpers/asText.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.cjs +0 -27
- package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.js +0 -27
- package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.cjs +0 -24
- package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.js +0 -24
- package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.cjs +0 -7
- package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.js +0 -7
- package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.cjs +0 -9
- package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.js +0 -9
- package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/richtext/asText.cjs +0 -13
- package/dist/_node_modules/@prismicio/client/dist/richtext/asText.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/richtext/asText.js +0 -13
- package/dist/_node_modules/@prismicio/client/dist/richtext/asText.js.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/types/value/link.cjs +0 -10
- package/dist/_node_modules/@prismicio/client/dist/types/value/link.cjs.map +0 -1
- package/dist/_node_modules/@prismicio/client/dist/types/value/link.js +0 -10
- package/dist/_node_modules/@prismicio/client/dist/types/value/link.js.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.cjs +0 -10
- package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.cjs.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.js +0 -10
- package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.js.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildURL.cjs +0 -29
- package/dist/_node_modules/imgix-url-builder/dist/buildURL.cjs.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildURL.js +0 -29
- package/dist/_node_modules/imgix-url-builder/dist/buildURL.js.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.cjs +0 -10
- package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.cjs.map +0 -1
- package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.js +0 -10
- package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.js.map +0 -1
- package/dist/clientHooks.cjs +0 -40
- package/dist/clientHooks.cjs.map +0 -1
- package/dist/clientHooks.d.ts +0 -321
- package/dist/clientHooks.js +0 -40
- package/dist/clientHooks.js.map +0 -1
- package/dist/index.cjs +0 -48
- package/dist/index.cjs.map +0 -1
- package/dist/lib/devMsg.cjs +0 -8
- package/dist/lib/devMsg.cjs.map +0 -1
- package/dist/lib/isInternalURL.cjs +0 -9
- package/dist/lib/isInternalURL.cjs.map +0 -1
- package/dist/lib/isInternalURL.d.ts +0 -8
- package/dist/lib/isInternalURL.js +0 -9
- package/dist/lib/isInternalURL.js.map +0 -1
- package/dist/lib/pascalCase.cjs +0 -10
- package/dist/lib/pascalCase.cjs.map +0 -1
- package/dist/lib/pascalCase.d.ts +0 -26
- package/dist/lib/pascalCase.js +0 -10
- package/dist/lib/pascalCase.js.map +0 -1
- package/dist/package.json.cjs +0 -5
- package/dist/package.json.cjs.map +0 -1
- package/dist/react-server/PrismicLink.cjs +0 -59
- package/dist/react-server/PrismicLink.cjs.map +0 -1
- package/dist/react-server/PrismicLink.d.ts +0 -77
- package/dist/react-server/PrismicLink.js +0 -42
- package/dist/react-server/PrismicLink.js.map +0 -1
- package/dist/react-server/PrismicRichText.cjs +0 -97
- package/dist/react-server/PrismicRichText.cjs.map +0 -1
- package/dist/react-server/PrismicRichText.d.ts +0 -104
- package/dist/react-server/PrismicRichText.js +0 -79
- package/dist/react-server/PrismicRichText.js.map +0 -1
- package/dist/react-server/index.d.ts +0 -4
- package/dist/react-server/unsupported.cjs +0 -97
- package/dist/react-server/unsupported.cjs.map +0 -1
- package/dist/react-server/unsupported.d.ts +0 -22
- package/dist/react-server/unsupported.js +0 -97
- package/dist/react-server/unsupported.js.map +0 -1
- package/dist/react-server.cjs +0 -44
- package/dist/react-server.cjs.map +0 -1
- package/dist/react-server.js +0 -41
- package/dist/react-server.js.map +0 -1
- package/dist/types.d.ts +0 -19
- package/dist/usePrismicClient.cjs +0 -13
- package/dist/usePrismicClient.cjs.map +0 -1
- package/dist/usePrismicClient.d.ts +0 -11
- package/dist/usePrismicClient.js +0 -13
- package/dist/usePrismicClient.js.map +0 -1
- package/dist/usePrismicContext.cjs +0 -26
- package/dist/usePrismicContext.cjs.map +0 -1
- package/dist/usePrismicContext.d.ts +0 -8
- package/dist/usePrismicContext.js +0 -9
- package/dist/usePrismicContext.js.map +0 -1
- package/dist/usePrismicPreviewResolver.cjs +0 -44
- package/dist/usePrismicPreviewResolver.cjs.map +0 -1
- package/dist/usePrismicPreviewResolver.d.ts +0 -45
- package/dist/usePrismicPreviewResolver.js +0 -27
- package/dist/usePrismicPreviewResolver.js.map +0 -1
- package/dist/useStatefulPrismicClientMethod.cjs +0 -91
- package/dist/useStatefulPrismicClientMethod.cjs.map +0 -1
- package/dist/useStatefulPrismicClientMethod.d.ts +0 -44
- package/dist/useStatefulPrismicClientMethod.js +0 -74
- package/dist/useStatefulPrismicClientMethod.js.map +0 -1
- package/src/PrismicProvider.tsx +0 -132
- package/src/clientHooks.ts +0 -472
- package/src/lib/isInternalURL.ts +0 -14
- package/src/lib/pascalCase.ts +0 -79
- package/src/react-server/PrismicLink.tsx +0 -197
- package/src/react-server/PrismicRichText.tsx +0 -283
- package/src/react-server/index.ts +0 -38
- package/src/react-server/unsupported.ts +0 -184
- package/src/types.ts +0 -23
- package/src/usePrismicClient.ts +0 -30
- package/src/usePrismicContext.ts +0 -13
- package/src/usePrismicPreviewResolver.ts +0 -93
- package/src/useStatefulPrismicClientMethod.ts +0 -196
package/src/types.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import * as prismicR from "@prismicio/richtext";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A function mapping Rich Text block types to React Components. It is used to
|
|
5
|
-
* render Rich Text or Title fields.
|
|
6
|
-
*
|
|
7
|
-
* @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
|
|
8
|
-
*/
|
|
9
|
-
export type JSXFunctionSerializer =
|
|
10
|
-
prismicR.RichTextFunctionSerializer<JSX.Element>;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A map of Rich Text block types to React Components. It is used to render Rich
|
|
14
|
-
* Text or Title fields.
|
|
15
|
-
*
|
|
16
|
-
* @see Templating Rich Text and Title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
|
|
17
|
-
*/
|
|
18
|
-
export type JSXMapSerializer = prismicR.RichTextMapSerializer<JSX.Element>;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* States of a `@prismicio/client` hook.
|
|
22
|
-
*/
|
|
23
|
-
export type PrismicClientHookState = "idle" | "loading" | "loaded" | "failed";
|
package/src/usePrismicClient.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type * as prismic from "@prismicio/client";
|
|
2
|
-
|
|
3
|
-
import { usePrismicContext } from "./usePrismicContext";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Retrieve the `@prismicio/client` instance provided to `<PrismicProvider>`
|
|
7
|
-
* higher in the React tree.
|
|
8
|
-
*
|
|
9
|
-
* @param explicitClient - An optional `@prismicio/client` instance to override
|
|
10
|
-
* the Client provided to `<PrismicProvider>`.
|
|
11
|
-
*
|
|
12
|
-
* @returns The `@prismicio/client` instance provided to `<PrismicProvider>`.
|
|
13
|
-
*/
|
|
14
|
-
export const usePrismicClient = <
|
|
15
|
-
TDocuments extends prismic.PrismicDocument = prismic.PrismicDocument,
|
|
16
|
-
>(
|
|
17
|
-
explicitClient?: prismic.Client<TDocuments>,
|
|
18
|
-
): prismic.Client<TDocuments> => {
|
|
19
|
-
const context = usePrismicContext();
|
|
20
|
-
|
|
21
|
-
const client = explicitClient || context?.client;
|
|
22
|
-
|
|
23
|
-
if (!client) {
|
|
24
|
-
throw new Error(
|
|
25
|
-
"A @prismicio/client is required to query documents. Provide a client to the hook or to a <PrismicProvider> higher in your component tree.",
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return client;
|
|
30
|
-
};
|
package/src/usePrismicContext.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
import { PrismicContext, PrismicContextValue } from "./PrismicProvider";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* React hook used to read shared configuration for `@prismicio/react`
|
|
7
|
-
* components and hooks.
|
|
8
|
-
*
|
|
9
|
-
* @returns The closest `<PrismicProvider>` context value.
|
|
10
|
-
*/
|
|
11
|
-
export const usePrismicContext = (): PrismicContextValue => {
|
|
12
|
-
return React.useContext(PrismicContext) || {};
|
|
13
|
-
};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import type * as prismic from "@prismicio/client";
|
|
2
|
-
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { usePrismicContext } from "./usePrismicContext";
|
|
6
|
-
import {
|
|
7
|
-
ClientHookReturnType,
|
|
8
|
-
useStatefulPrismicClientMethod,
|
|
9
|
-
} from "./useStatefulPrismicClientMethod";
|
|
10
|
-
|
|
11
|
-
export type UsePrismicPreviewResolverArgs = {
|
|
12
|
-
/**
|
|
13
|
-
* An optional `@prismicio/client` instance to override the Client provided to
|
|
14
|
-
* `<PrismicProvider>`
|
|
15
|
-
*/
|
|
16
|
-
client?: prismic.Client;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A function that maps a Prismic document to a URL within your app.
|
|
20
|
-
*/
|
|
21
|
-
linkResolver?: Parameters<
|
|
22
|
-
prismic.Client["resolvePreviewURL"]
|
|
23
|
-
>[0]["linkResolver"];
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* A fallback URL if the Link Resolver does not return a value.
|
|
27
|
-
*/
|
|
28
|
-
defaultURL?: Parameters<prismic.Client["resolvePreviewURL"]>[0]["defaultURL"];
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The preview token (also known as a ref) that will be used to query preview
|
|
32
|
-
* content from the Prismic repository.
|
|
33
|
-
*/
|
|
34
|
-
previewToken?: Parameters<
|
|
35
|
-
prismic.Client["resolvePreviewURL"]
|
|
36
|
-
>[0]["previewToken"];
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The previewed document that will be used to determine the destination URL.
|
|
40
|
-
*/
|
|
41
|
-
documentID?: Parameters<prismic.Client["resolvePreviewURL"]>[0]["documentID"];
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* A function to automatically navigate to the resolved URL. If a function is
|
|
45
|
-
* not provded, `usePreviewResolver` will not navigate to the URL.
|
|
46
|
-
*
|
|
47
|
-
* @param url - The resolved preview URL.
|
|
48
|
-
*/
|
|
49
|
-
navigate?: (url: string) => unknown;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Resolve a preview session's URL. The resolved URL can be used to redirect to
|
|
54
|
-
* the previewed document.
|
|
55
|
-
*
|
|
56
|
-
* If a `navigate` function is provided, the hook will automatically navigate to
|
|
57
|
-
* the previewed document's URL.
|
|
58
|
-
*
|
|
59
|
-
* @param args - Arguments to configure how a URL is resolved.
|
|
60
|
-
*
|
|
61
|
-
* @returns A tuple containing the resolved URL and the hook's state.
|
|
62
|
-
*/
|
|
63
|
-
export const usePrismicPreviewResolver = (
|
|
64
|
-
args: UsePrismicPreviewResolverArgs = {},
|
|
65
|
-
): ClientHookReturnType<string> => {
|
|
66
|
-
const context = usePrismicContext();
|
|
67
|
-
|
|
68
|
-
const linkResolver = args.linkResolver || context.linkResolver;
|
|
69
|
-
|
|
70
|
-
const result = useStatefulPrismicClientMethod(
|
|
71
|
-
"resolvePreviewURL",
|
|
72
|
-
[
|
|
73
|
-
{
|
|
74
|
-
linkResolver,
|
|
75
|
-
defaultURL: args.defaultURL || "/",
|
|
76
|
-
previewToken: args.previewToken,
|
|
77
|
-
documentID: args.documentID,
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
args.client,
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
const [resolvedURL] = result;
|
|
84
|
-
const { navigate } = args;
|
|
85
|
-
|
|
86
|
-
React.useEffect(() => {
|
|
87
|
-
if (resolvedURL && navigate) {
|
|
88
|
-
navigate(resolvedURL);
|
|
89
|
-
}
|
|
90
|
-
}, [resolvedURL, navigate]);
|
|
91
|
-
|
|
92
|
-
return result;
|
|
93
|
-
};
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import type * as prismic from "@prismicio/client";
|
|
2
|
-
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { PrismicClientHookState } from "./types";
|
|
6
|
-
import { usePrismicClient } from "./usePrismicClient";
|
|
7
|
-
|
|
8
|
-
type StateMachineState<TData> = {
|
|
9
|
-
state: PrismicClientHookState;
|
|
10
|
-
data?: TData;
|
|
11
|
-
error?: Error;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type StateMachineAction<TData> =
|
|
15
|
-
| [type: "start"]
|
|
16
|
-
| [type: "succeed", payload: TData]
|
|
17
|
-
| [type: "fail", payload: Error];
|
|
18
|
-
|
|
19
|
-
const reducer = <TData>(
|
|
20
|
-
state: StateMachineState<TData>,
|
|
21
|
-
action: StateMachineAction<TData>,
|
|
22
|
-
): StateMachineState<TData> => {
|
|
23
|
-
switch (action[0]) {
|
|
24
|
-
case "start": {
|
|
25
|
-
return { state: "loading" };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
case "succeed": {
|
|
29
|
-
return { state: "loaded", data: action[1] };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
case "fail": {
|
|
33
|
-
return {
|
|
34
|
-
...state,
|
|
35
|
-
state: "failed",
|
|
36
|
-
error: action[1],
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const initialState: StateMachineState<never> = {
|
|
43
|
-
state: "idle",
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
|
|
47
|
-
|
|
48
|
-
type ClientPrototype = typeof prismic.Client.prototype;
|
|
49
|
-
|
|
50
|
-
type ClientMethod<MethodName extends keyof ClientPrototype> =
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
-
ClientPrototype[MethodName] extends (...args: any[]) => any
|
|
53
|
-
? ClientPrototype[MethodName]
|
|
54
|
-
: never;
|
|
55
|
-
|
|
56
|
-
type ClientMethodName = keyof {
|
|
57
|
-
[P in keyof prismic.Client as prismic.Client[P] extends (
|
|
58
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
-
...args: any[]
|
|
60
|
-
) => // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
-
Promise<any>
|
|
62
|
-
? P
|
|
63
|
-
: never]: unknown;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export type ClientMethodParameters<MethodName extends keyof ClientPrototype> =
|
|
67
|
-
Parameters<ClientMethod<MethodName>>;
|
|
68
|
-
|
|
69
|
-
export type HookOnlyParameters = {
|
|
70
|
-
client?: prismic.Client;
|
|
71
|
-
skip?: boolean;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Determines if a value is a `@prismicio/client` params object.
|
|
76
|
-
*
|
|
77
|
-
* @param value - The value to check.
|
|
78
|
-
*
|
|
79
|
-
* @returns `true` if `value` is a `@prismicio/client` params object, `false`
|
|
80
|
-
* otherwise.
|
|
81
|
-
*/
|
|
82
|
-
const isParams = (
|
|
83
|
-
value: unknown,
|
|
84
|
-
): value is ClientMethodParameters<"get">[0] & HookOnlyParameters => {
|
|
85
|
-
// This is a *very* naive check.
|
|
86
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* The return value of a `@prismicio/client` React hook.
|
|
91
|
-
*
|
|
92
|
-
* @typeParam TData - Data returned by the client.
|
|
93
|
-
*/
|
|
94
|
-
export type ClientHookReturnType<TData = unknown> = [
|
|
95
|
-
/**
|
|
96
|
-
* Data returned by the client.
|
|
97
|
-
*/
|
|
98
|
-
data: TData | undefined,
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* The current state of the hook's client method call.
|
|
102
|
-
*/
|
|
103
|
-
state: Pick<StateMachineState<TData>, "state" | "error">,
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Creates a React hook that forwards arguments to a specific method of a
|
|
108
|
-
* `@prismicio/client` instance. The created hook has its own internal state
|
|
109
|
-
* manager to report async status, such as pending or error statuses.
|
|
110
|
-
*
|
|
111
|
-
* @param methodName - The `@prismicio/client` method to which hook arguments
|
|
112
|
-
* will be forwarded.
|
|
113
|
-
*
|
|
114
|
-
* @returns A new React hook configured for the provided method.
|
|
115
|
-
*
|
|
116
|
-
* @internal
|
|
117
|
-
*/
|
|
118
|
-
export const useStatefulPrismicClientMethod = <
|
|
119
|
-
TMethodName extends ClientMethodName,
|
|
120
|
-
TArgs extends Parameters<ClientMethod<TMethodName>>,
|
|
121
|
-
TData extends UnwrapPromise<ReturnType<ClientMethod<TMethodName>>>,
|
|
122
|
-
>(
|
|
123
|
-
methodName: TMethodName,
|
|
124
|
-
args: TArgs,
|
|
125
|
-
explicitClient?: prismic.Client,
|
|
126
|
-
): ClientHookReturnType<TData> => {
|
|
127
|
-
const lastArg = args[args.length - 1];
|
|
128
|
-
const {
|
|
129
|
-
client: lastArgExplicitClient,
|
|
130
|
-
skip,
|
|
131
|
-
...params
|
|
132
|
-
} = isParams(lastArg) ? lastArg : ({} as HookOnlyParameters);
|
|
133
|
-
const argsWithoutParams = isParams(lastArg) ? args.slice(0, -1) : args;
|
|
134
|
-
|
|
135
|
-
const client = usePrismicClient(explicitClient || lastArgExplicitClient);
|
|
136
|
-
|
|
137
|
-
const [state, dispatch] = React.useReducer<
|
|
138
|
-
React.Reducer<StateMachineState<TData>, StateMachineAction<TData>>
|
|
139
|
-
>(reducer, initialState);
|
|
140
|
-
|
|
141
|
-
React.useEffect(
|
|
142
|
-
() => {
|
|
143
|
-
// Used to prevent dispatching an action if the hook was cleaned up.
|
|
144
|
-
let didCancel = false;
|
|
145
|
-
|
|
146
|
-
if (!skip) {
|
|
147
|
-
if (!didCancel) {
|
|
148
|
-
dispatch(["start"]);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// @ts-expect-error - Merging method arg types is too complex
|
|
152
|
-
client[methodName]
|
|
153
|
-
.call(client, ...argsWithoutParams, params)
|
|
154
|
-
.then((result) => {
|
|
155
|
-
if (!didCancel) {
|
|
156
|
-
dispatch(["succeed", result as TData]);
|
|
157
|
-
}
|
|
158
|
-
})
|
|
159
|
-
.catch((error) => {
|
|
160
|
-
if (!didCancel) {
|
|
161
|
-
dispatch(["fail", error]);
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Ensure we don't dispatch an action if the hook is cleaned up.
|
|
167
|
-
() => {
|
|
168
|
-
didCancel = true;
|
|
169
|
-
};
|
|
170
|
-
},
|
|
171
|
-
// We must disable exhaustive-deps since we are using
|
|
172
|
-
// JSON.stringify on params (effectively a deep equality check).
|
|
173
|
-
// We want this effect to run again anytime params change.
|
|
174
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
175
|
-
[
|
|
176
|
-
client,
|
|
177
|
-
methodName,
|
|
178
|
-
skip,
|
|
179
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
180
|
-
JSON.stringify(argsWithoutParams),
|
|
181
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
182
|
-
JSON.stringify(params),
|
|
183
|
-
],
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
return React.useMemo(
|
|
187
|
-
() => [
|
|
188
|
-
state.data,
|
|
189
|
-
{
|
|
190
|
-
state: state.state,
|
|
191
|
-
error: state.error,
|
|
192
|
-
},
|
|
193
|
-
],
|
|
194
|
-
[state],
|
|
195
|
-
);
|
|
196
|
-
};
|