@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.
Files changed (191) hide show
  1. package/README.md +10 -11
  2. package/dist/PrismicImage.d.ts +18 -633
  3. package/dist/PrismicImage.js +32 -33
  4. package/dist/PrismicImage.js.map +1 -1
  5. package/dist/PrismicLink.d.ts +77 -6
  6. package/dist/PrismicLink.js +42 -7
  7. package/dist/PrismicLink.js.map +1 -1
  8. package/dist/PrismicRichText.d.ts +117 -4
  9. package/dist/PrismicRichText.js +74 -8
  10. package/dist/PrismicRichText.js.map +1 -1
  11. package/dist/PrismicText.d.ts +8 -13
  12. package/dist/PrismicText.js +15 -16
  13. package/dist/PrismicText.js.map +1 -1
  14. package/dist/PrismicToolbar.d.ts +2 -12
  15. package/dist/PrismicToolbar.js +8 -10
  16. package/dist/PrismicToolbar.js.map +1 -1
  17. package/dist/SliceZone.d.ts +16 -70
  18. package/dist/SliceZone.js +16 -37
  19. package/dist/SliceZone.js.map +1 -1
  20. package/dist/index.d.ts +13 -21
  21. package/dist/index.js +2 -29
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/devMsg.d.ts +2 -2
  24. package/dist/lib/devMsg.js +2 -2
  25. package/dist/lib/devMsg.js.map +1 -1
  26. package/dist/package.json.js +1 -1
  27. package/package.json +53 -70
  28. package/src/PrismicImage.tsx +80 -65
  29. package/src/PrismicLink.tsx +196 -26
  30. package/src/PrismicRichText.tsx +333 -33
  31. package/src/PrismicText.tsx +25 -30
  32. package/src/PrismicToolbar.tsx +10 -30
  33. package/src/SliceZone.tsx +58 -150
  34. package/src/index.ts +17 -53
  35. package/src/lib/devMsg.ts +3 -3
  36. package/dist/PrismicImage.cjs +0 -68
  37. package/dist/PrismicImage.cjs.map +0 -1
  38. package/dist/PrismicLink.cjs +0 -29
  39. package/dist/PrismicLink.cjs.map +0 -1
  40. package/dist/PrismicProvider.cjs +0 -41
  41. package/dist/PrismicProvider.cjs.map +0 -1
  42. package/dist/PrismicProvider.d.ts +0 -83
  43. package/dist/PrismicProvider.js +0 -24
  44. package/dist/PrismicProvider.js.map +0 -1
  45. package/dist/PrismicRichText.cjs +0 -30
  46. package/dist/PrismicRichText.cjs.map +0 -1
  47. package/dist/PrismicText.cjs +0 -44
  48. package/dist/PrismicText.cjs.map +0 -1
  49. package/dist/PrismicToolbar.cjs +0 -43
  50. package/dist/PrismicToolbar.cjs.map +0 -1
  51. package/dist/SliceZone.cjs +0 -53
  52. package/dist/SliceZone.cjs.map +0 -1
  53. package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.cjs +0 -16
  54. package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.cjs.map +0 -1
  55. package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.js +0 -16
  56. package/dist/_node_modules/@prismicio/client/dist/errors/PrismicError.js.map +0 -1
  57. package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.cjs +0 -13
  58. package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.cjs.map +0 -1
  59. package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.js +0 -13
  60. package/dist/_node_modules/@prismicio/client/dist/getToolbarSrc.js.map +0 -1
  61. package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.cjs +0 -22
  62. package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.cjs.map +0 -1
  63. package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.js +0 -22
  64. package/dist/_node_modules/@prismicio/client/dist/helpers/asImagePixelDensitySrcSet.js.map +0 -1
  65. package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.cjs +0 -46
  66. package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.cjs.map +0 -1
  67. package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.js +0 -46
  68. package/dist/_node_modules/@prismicio/client/dist/helpers/asImageWidthSrcSet.js.map +0 -1
  69. package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.cjs +0 -47
  70. package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.cjs.map +0 -1
  71. package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.js +0 -47
  72. package/dist/_node_modules/@prismicio/client/dist/helpers/asLink.js.map +0 -1
  73. package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.cjs +0 -28
  74. package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.cjs.map +0 -1
  75. package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.js +0 -28
  76. package/dist/_node_modules/@prismicio/client/dist/helpers/asLinkAttrs.js.map +0 -1
  77. package/dist/_node_modules/@prismicio/client/dist/helpers/asText.cjs +0 -21
  78. package/dist/_node_modules/@prismicio/client/dist/helpers/asText.cjs.map +0 -1
  79. package/dist/_node_modules/@prismicio/client/dist/helpers/asText.js +0 -21
  80. package/dist/_node_modules/@prismicio/client/dist/helpers/asText.js.map +0 -1
  81. package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.cjs +0 -27
  82. package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.cjs.map +0 -1
  83. package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.js +0 -27
  84. package/dist/_node_modules/@prismicio/client/dist/helpers/documentToLinkField.js.map +0 -1
  85. package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.cjs +0 -24
  86. package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.cjs.map +0 -1
  87. package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.js +0 -24
  88. package/dist/_node_modules/@prismicio/client/dist/helpers/isFilled.js.map +0 -1
  89. package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.cjs +0 -7
  90. package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.cjs.map +0 -1
  91. package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.js +0 -7
  92. package/dist/_node_modules/@prismicio/client/dist/isRepositoryName.js.map +0 -1
  93. package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.cjs +0 -9
  94. package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.cjs.map +0 -1
  95. package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.js +0 -9
  96. package/dist/_node_modules/@prismicio/client/dist/lib/isInternalURL.js.map +0 -1
  97. package/dist/_node_modules/@prismicio/client/dist/richtext/asText.cjs +0 -13
  98. package/dist/_node_modules/@prismicio/client/dist/richtext/asText.cjs.map +0 -1
  99. package/dist/_node_modules/@prismicio/client/dist/richtext/asText.js +0 -13
  100. package/dist/_node_modules/@prismicio/client/dist/richtext/asText.js.map +0 -1
  101. package/dist/_node_modules/@prismicio/client/dist/types/value/link.cjs +0 -10
  102. package/dist/_node_modules/@prismicio/client/dist/types/value/link.cjs.map +0 -1
  103. package/dist/_node_modules/@prismicio/client/dist/types/value/link.js +0 -10
  104. package/dist/_node_modules/@prismicio/client/dist/types/value/link.js.map +0 -1
  105. package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.cjs +0 -10
  106. package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.cjs.map +0 -1
  107. package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.js +0 -10
  108. package/dist/_node_modules/imgix-url-builder/dist/buildPixelDensitySrcSet.js.map +0 -1
  109. package/dist/_node_modules/imgix-url-builder/dist/buildURL.cjs +0 -29
  110. package/dist/_node_modules/imgix-url-builder/dist/buildURL.cjs.map +0 -1
  111. package/dist/_node_modules/imgix-url-builder/dist/buildURL.js +0 -29
  112. package/dist/_node_modules/imgix-url-builder/dist/buildURL.js.map +0 -1
  113. package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.cjs +0 -10
  114. package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.cjs.map +0 -1
  115. package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.js +0 -10
  116. package/dist/_node_modules/imgix-url-builder/dist/buildWidthSrcSet.js.map +0 -1
  117. package/dist/clientHooks.cjs +0 -40
  118. package/dist/clientHooks.cjs.map +0 -1
  119. package/dist/clientHooks.d.ts +0 -321
  120. package/dist/clientHooks.js +0 -40
  121. package/dist/clientHooks.js.map +0 -1
  122. package/dist/index.cjs +0 -48
  123. package/dist/index.cjs.map +0 -1
  124. package/dist/lib/devMsg.cjs +0 -8
  125. package/dist/lib/devMsg.cjs.map +0 -1
  126. package/dist/lib/isInternalURL.cjs +0 -9
  127. package/dist/lib/isInternalURL.cjs.map +0 -1
  128. package/dist/lib/isInternalURL.d.ts +0 -8
  129. package/dist/lib/isInternalURL.js +0 -9
  130. package/dist/lib/isInternalURL.js.map +0 -1
  131. package/dist/lib/pascalCase.cjs +0 -10
  132. package/dist/lib/pascalCase.cjs.map +0 -1
  133. package/dist/lib/pascalCase.d.ts +0 -26
  134. package/dist/lib/pascalCase.js +0 -10
  135. package/dist/lib/pascalCase.js.map +0 -1
  136. package/dist/package.json.cjs +0 -5
  137. package/dist/package.json.cjs.map +0 -1
  138. package/dist/react-server/PrismicLink.cjs +0 -59
  139. package/dist/react-server/PrismicLink.cjs.map +0 -1
  140. package/dist/react-server/PrismicLink.d.ts +0 -77
  141. package/dist/react-server/PrismicLink.js +0 -42
  142. package/dist/react-server/PrismicLink.js.map +0 -1
  143. package/dist/react-server/PrismicRichText.cjs +0 -97
  144. package/dist/react-server/PrismicRichText.cjs.map +0 -1
  145. package/dist/react-server/PrismicRichText.d.ts +0 -104
  146. package/dist/react-server/PrismicRichText.js +0 -79
  147. package/dist/react-server/PrismicRichText.js.map +0 -1
  148. package/dist/react-server/index.d.ts +0 -4
  149. package/dist/react-server/unsupported.cjs +0 -97
  150. package/dist/react-server/unsupported.cjs.map +0 -1
  151. package/dist/react-server/unsupported.d.ts +0 -22
  152. package/dist/react-server/unsupported.js +0 -97
  153. package/dist/react-server/unsupported.js.map +0 -1
  154. package/dist/react-server.cjs +0 -44
  155. package/dist/react-server.cjs.map +0 -1
  156. package/dist/react-server.js +0 -41
  157. package/dist/react-server.js.map +0 -1
  158. package/dist/types.d.ts +0 -19
  159. package/dist/usePrismicClient.cjs +0 -13
  160. package/dist/usePrismicClient.cjs.map +0 -1
  161. package/dist/usePrismicClient.d.ts +0 -11
  162. package/dist/usePrismicClient.js +0 -13
  163. package/dist/usePrismicClient.js.map +0 -1
  164. package/dist/usePrismicContext.cjs +0 -26
  165. package/dist/usePrismicContext.cjs.map +0 -1
  166. package/dist/usePrismicContext.d.ts +0 -8
  167. package/dist/usePrismicContext.js +0 -9
  168. package/dist/usePrismicContext.js.map +0 -1
  169. package/dist/usePrismicPreviewResolver.cjs +0 -44
  170. package/dist/usePrismicPreviewResolver.cjs.map +0 -1
  171. package/dist/usePrismicPreviewResolver.d.ts +0 -45
  172. package/dist/usePrismicPreviewResolver.js +0 -27
  173. package/dist/usePrismicPreviewResolver.js.map +0 -1
  174. package/dist/useStatefulPrismicClientMethod.cjs +0 -91
  175. package/dist/useStatefulPrismicClientMethod.cjs.map +0 -1
  176. package/dist/useStatefulPrismicClientMethod.d.ts +0 -44
  177. package/dist/useStatefulPrismicClientMethod.js +0 -74
  178. package/dist/useStatefulPrismicClientMethod.js.map +0 -1
  179. package/src/PrismicProvider.tsx +0 -132
  180. package/src/clientHooks.ts +0 -472
  181. package/src/lib/isInternalURL.ts +0 -14
  182. package/src/lib/pascalCase.ts +0 -79
  183. package/src/react-server/PrismicLink.tsx +0 -197
  184. package/src/react-server/PrismicRichText.tsx +0 -283
  185. package/src/react-server/index.ts +0 -38
  186. package/src/react-server/unsupported.ts +0 -184
  187. package/src/types.ts +0 -23
  188. package/src/usePrismicClient.ts +0 -30
  189. package/src/usePrismicContext.ts +0 -13
  190. package/src/usePrismicPreviewResolver.ts +0 -93
  191. 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";
@@ -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
- };
@@ -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
- };