@fonderie/react-courier-admin 0.4.0 → 0.5.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 CHANGED
@@ -3,7 +3,7 @@
3
3
  React hooks for the Fonderie courier admin API — `useTemplates`,
4
4
  `useTemplate`, `useSaveTemplate`, `useDeleteTemplate`, and
5
5
  `useTemplateRevisions` (list + rollback). Thin bindings over
6
- [`@fonderie/client`](https://github.com/fonderiejs/sdk/tree/main/packages/client)'s
6
+ [`@fonderie/client`](https://github.com/fonderiejs/fonderie/tree/main/packages/client)'s
7
7
  `CourierAdminClient`: loading/error state and the request itself, nothing
8
8
  else. Bring your own UI.
9
9
 
@@ -48,14 +48,14 @@ session — the same model `@fonderie/config`'s admin surface and the
48
48
  `AuthClient`/`BillingClient`/`WorkspacesClient`.
49
49
 
50
50
  Want pre-built screens instead of wiring your own editor?
51
- See [`@fonderie/react-courier-admin-screens`](https://github.com/fonderiejs/sdk/tree/main/packages/react-courier-admin-screens).
51
+ See [`@fonderie/react-courier-admin-screens`](https://github.com/fonderiejs/fonderie/tree/main/packages/react-courier-admin-screens).
52
52
 
53
53
  ## Why this exists
54
54
 
55
55
  You've shipped this plumbing before — auth, teams, billing, messaging —
56
56
  and the next project will ask for it again. Fonderie packages it once:
57
57
  plain TypeScript modules for
58
- [`@fonderie/core`](https://github.com/fonderiejs/sdk/tree/main/packages/core),
58
+ [`@fonderie/core`](https://github.com/fonderiejs/fonderie/tree/main/packages/core),
59
59
  PostgreSQL-backed, self-hosted, MIT. No external control plane, no
60
60
  per-seat anything. Register the modules you need; skip the ones you don't.
61
61
 
@@ -64,7 +64,7 @@ state management around `@fonderie/client`, nothing more. No business logic
64
64
  lives here; it lives in `@fonderie/courier` on the server.
65
65
 
66
66
  Browse the whole set at
67
- [fonderiejs/sdk](https://github.com/fonderiejs/sdk) · follow
67
+ [fonderiejs/fonderie](https://github.com/fonderiejs/fonderie) · follow
68
68
  [@fonderiejs](https://x.com/fonderiejs)
69
69
 
70
70
  ## License
package/dist/index.cjs CHANGED
@@ -20,32 +20,36 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- CourierAdminClient: () => import_client5.CourierAdminClient,
24
- FonderieApiError: () => import_client5.FonderieApiError,
23
+ CourierAdminClient: () => import_client8.CourierAdminClient,
24
+ FonderieApiError: () => import_client8.FonderieApiError,
25
+ useBuiltInTemplate: () => useBuiltInTemplate,
25
26
  useTemplate: () => useTemplate,
27
+ useTemplateCatalog: () => useTemplateCatalog,
26
28
  useTemplatePreview: () => useTemplatePreview,
29
+ useTemplateResolution: () => useTemplateResolution,
27
30
  useTemplateRevisions: () => useTemplateRevisions,
28
31
  useTemplates: () => useTemplates
29
32
  });
30
33
  module.exports = __toCommonJS(index_exports);
31
- var import_client5 = require("@fonderie/client");
34
+ var import_client8 = require("@fonderie/client");
32
35
 
33
- // src/hooks/useTemplate.ts
36
+ // src/hooks/useBuiltInTemplate.ts
34
37
  var import_client = require("@fonderie/client");
35
38
  var import_react = require("react");
36
- function useTemplate(client, type, locale) {
37
- const [template, setTemplate] = (0, import_react.useState)(null);
39
+ function useBuiltInTemplate(client, type, locale) {
40
+ const [builtIn, setBuiltIn] = (0, import_react.useState)(null);
38
41
  const [isLoading, setIsLoading] = (0, import_react.useState)(true);
39
42
  const [error, setError] = (0, import_react.useState)(null);
40
43
  const refresh = (0, import_react.useCallback)(async () => {
41
44
  setIsLoading(true);
42
45
  setError(null);
43
46
  try {
44
- const { result } = await client.getTemplate(type, locale);
45
- setTemplate(result);
47
+ const { result } = await client.getBuiltInTemplate(type, locale);
48
+ setBuiltIn(result);
46
49
  } catch (err) {
47
50
  const apiError = err instanceof import_client.FonderieApiError ? err : new import_client.FonderieApiError("unknown", String(err), 0);
48
- setError(apiError);
51
+ if (apiError.status === 404) setBuiltIn(null);
52
+ else setError(apiError);
49
53
  } finally {
50
54
  setIsLoading(false);
51
55
  }
@@ -53,30 +57,114 @@ function useTemplate(client, type, locale) {
53
57
  (0, import_react.useEffect)(() => {
54
58
  void refresh();
55
59
  }, [refresh]);
56
- return { template, isLoading, error, refresh };
60
+ return { builtIn, isLoading, error, refresh };
57
61
  }
58
62
 
59
- // src/hooks/useTemplateRevisions.ts
63
+ // src/hooks/useTemplateCatalog.ts
60
64
  var import_client2 = require("@fonderie/client");
61
65
  var import_react2 = require("react");
62
- function useTemplateRevisions(client, type, locale) {
63
- const [revisions, setRevisions] = (0, import_react2.useState)([]);
66
+ function useTemplateCatalog(client) {
67
+ const [catalog, setCatalog] = (0, import_react2.useState)(null);
64
68
  const [isLoading, setIsLoading] = (0, import_react2.useState)(true);
65
69
  const [error, setError] = (0, import_react2.useState)(null);
66
70
  const refresh = (0, import_react2.useCallback)(async () => {
71
+ setIsLoading(true);
72
+ setError(null);
73
+ try {
74
+ const { result } = await client.getTemplateCatalog();
75
+ setCatalog(result);
76
+ } catch (err) {
77
+ setError(
78
+ err instanceof import_client2.FonderieApiError ? err : new import_client2.FonderieApiError("unknown", String(err), 0)
79
+ );
80
+ } finally {
81
+ setIsLoading(false);
82
+ }
83
+ }, [client]);
84
+ (0, import_react2.useEffect)(() => {
85
+ void refresh();
86
+ }, [refresh]);
87
+ return { catalog, isLoading, error, refresh };
88
+ }
89
+
90
+ // src/hooks/useTemplateResolution.ts
91
+ var import_client3 = require("@fonderie/client");
92
+ var import_react3 = require("react");
93
+ function useTemplateResolution(client) {
94
+ const [resolution, setResolution] = (0, import_react3.useState)(null);
95
+ const [isResolving, setIsResolving] = (0, import_react3.useState)(false);
96
+ const [error, setError] = (0, import_react3.useState)(null);
97
+ const resolve = (0, import_react3.useCallback)(
98
+ async (type, locale) => {
99
+ setIsResolving(true);
100
+ setError(null);
101
+ try {
102
+ const { result } = await client.resolveTemplate(type, locale);
103
+ setResolution(result);
104
+ return result;
105
+ } catch (err) {
106
+ setError(
107
+ err instanceof import_client3.FonderieApiError ? err : new import_client3.FonderieApiError("unknown", String(err), 0)
108
+ );
109
+ setResolution(null);
110
+ return null;
111
+ } finally {
112
+ setIsResolving(false);
113
+ }
114
+ },
115
+ [client]
116
+ );
117
+ return { resolution, isResolving, error, resolve };
118
+ }
119
+
120
+ // src/hooks/useTemplate.ts
121
+ var import_client4 = require("@fonderie/client");
122
+ var import_react4 = require("react");
123
+ function useTemplate(client, type, locale) {
124
+ const [template, setTemplate] = (0, import_react4.useState)(null);
125
+ const [isLoading, setIsLoading] = (0, import_react4.useState)(true);
126
+ const [error, setError] = (0, import_react4.useState)(null);
127
+ const refresh = (0, import_react4.useCallback)(async () => {
128
+ setIsLoading(true);
129
+ setError(null);
130
+ try {
131
+ const { result } = await client.getTemplate(type, locale);
132
+ setTemplate(result);
133
+ } catch (err) {
134
+ const apiError = err instanceof import_client4.FonderieApiError ? err : new import_client4.FonderieApiError("unknown", String(err), 0);
135
+ if (apiError.status === 404) setTemplate(null);
136
+ setError(apiError);
137
+ } finally {
138
+ setIsLoading(false);
139
+ }
140
+ }, [client, type, locale]);
141
+ (0, import_react4.useEffect)(() => {
142
+ void refresh();
143
+ }, [refresh]);
144
+ return { template, isLoading, error, refresh };
145
+ }
146
+
147
+ // src/hooks/useTemplateRevisions.ts
148
+ var import_client5 = require("@fonderie/client");
149
+ var import_react5 = require("react");
150
+ function useTemplateRevisions(client, type, locale) {
151
+ const [revisions, setRevisions] = (0, import_react5.useState)([]);
152
+ const [isLoading, setIsLoading] = (0, import_react5.useState)(true);
153
+ const [error, setError] = (0, import_react5.useState)(null);
154
+ const refresh = (0, import_react5.useCallback)(async () => {
67
155
  setIsLoading(true);
68
156
  setError(null);
69
157
  try {
70
158
  const { result } = await client.listRevisions(type, locale);
71
159
  setRevisions(result);
72
160
  } catch (err) {
73
- const apiError = err instanceof import_client2.FonderieApiError ? err : new import_client2.FonderieApiError("unknown", String(err), 0);
161
+ const apiError = err instanceof import_client5.FonderieApiError ? err : new import_client5.FonderieApiError("unknown", String(err), 0);
74
162
  setError(apiError);
75
163
  } finally {
76
164
  setIsLoading(false);
77
165
  }
78
166
  }, [client, type, locale]);
79
- const rollback = (0, import_react2.useCallback)(
167
+ const rollback = (0, import_react5.useCallback)(
80
168
  async (toVersion) => {
81
169
  setError(null);
82
170
  try {
@@ -84,40 +172,40 @@ function useTemplateRevisions(client, type, locale) {
84
172
  await refresh();
85
173
  return result;
86
174
  } catch (err) {
87
- const apiError = err instanceof import_client2.FonderieApiError ? err : new import_client2.FonderieApiError("unknown", String(err), 0);
175
+ const apiError = err instanceof import_client5.FonderieApiError ? err : new import_client5.FonderieApiError("unknown", String(err), 0);
88
176
  setError(apiError);
89
177
  throw apiError;
90
178
  }
91
179
  },
92
180
  [client, type, locale, refresh]
93
181
  );
94
- (0, import_react2.useEffect)(() => {
182
+ (0, import_react5.useEffect)(() => {
95
183
  void refresh();
96
184
  }, [refresh]);
97
185
  return { revisions, isLoading, error, refresh, rollback };
98
186
  }
99
187
 
100
188
  // src/hooks/useTemplates.ts
101
- var import_client3 = require("@fonderie/client");
102
- var import_react3 = require("react");
189
+ var import_client6 = require("@fonderie/client");
190
+ var import_react6 = require("react");
103
191
  function useTemplates(client) {
104
- const [templates, setTemplates] = (0, import_react3.useState)([]);
105
- const [isLoading, setIsLoading] = (0, import_react3.useState)(true);
106
- const [error, setError] = (0, import_react3.useState)(null);
107
- const refresh = (0, import_react3.useCallback)(async () => {
192
+ const [templates, setTemplates] = (0, import_react6.useState)([]);
193
+ const [isLoading, setIsLoading] = (0, import_react6.useState)(true);
194
+ const [error, setError] = (0, import_react6.useState)(null);
195
+ const refresh = (0, import_react6.useCallback)(async () => {
108
196
  setIsLoading(true);
109
197
  setError(null);
110
198
  try {
111
199
  const { result } = await client.listTemplates();
112
200
  setTemplates(result);
113
201
  } catch (err) {
114
- const apiError = err instanceof import_client3.FonderieApiError ? err : new import_client3.FonderieApiError("unknown", String(err), 0);
202
+ const apiError = err instanceof import_client6.FonderieApiError ? err : new import_client6.FonderieApiError("unknown", String(err), 0);
115
203
  setError(apiError);
116
204
  } finally {
117
205
  setIsLoading(false);
118
206
  }
119
207
  }, [client]);
120
- const saveTemplate = (0, import_react3.useCallback)(
208
+ const saveTemplate = (0, import_react6.useCallback)(
121
209
  async (type, input, locale) => {
122
210
  setError(null);
123
211
  try {
@@ -125,41 +213,41 @@ function useTemplates(client) {
125
213
  await refresh();
126
214
  return result;
127
215
  } catch (err) {
128
- const apiError = err instanceof import_client3.FonderieApiError ? err : new import_client3.FonderieApiError("unknown", String(err), 0);
216
+ const apiError = err instanceof import_client6.FonderieApiError ? err : new import_client6.FonderieApiError("unknown", String(err), 0);
129
217
  setError(apiError);
130
218
  throw apiError;
131
219
  }
132
220
  },
133
221
  [client, refresh]
134
222
  );
135
- const removeTemplate = (0, import_react3.useCallback)(
223
+ const removeTemplate = (0, import_react6.useCallback)(
136
224
  async (type, locale) => {
137
225
  setError(null);
138
226
  try {
139
227
  await client.deleteTemplate(type, locale);
140
228
  await refresh();
141
229
  } catch (err) {
142
- const apiError = err instanceof import_client3.FonderieApiError ? err : new import_client3.FonderieApiError("unknown", String(err), 0);
230
+ const apiError = err instanceof import_client6.FonderieApiError ? err : new import_client6.FonderieApiError("unknown", String(err), 0);
143
231
  setError(apiError);
144
232
  throw apiError;
145
233
  }
146
234
  },
147
235
  [client, refresh]
148
236
  );
149
- (0, import_react3.useEffect)(() => {
237
+ (0, import_react6.useEffect)(() => {
150
238
  void refresh();
151
239
  }, [refresh]);
152
240
  return { templates, isLoading, error, refresh, saveTemplate, removeTemplate };
153
241
  }
154
242
 
155
243
  // src/hooks/useTemplatePreview.ts
156
- var import_client4 = require("@fonderie/client");
157
- var import_react4 = require("react");
244
+ var import_client7 = require("@fonderie/client");
245
+ var import_react7 = require("react");
158
246
  function useTemplatePreview(client) {
159
- const [preview, setPreview] = (0, import_react4.useState)(null);
160
- const [isPreviewing, setIsPreviewing] = (0, import_react4.useState)(false);
161
- const [error, setError] = (0, import_react4.useState)(null);
162
- const renderPreview = (0, import_react4.useCallback)(
247
+ const [preview, setPreview] = (0, import_react7.useState)(null);
248
+ const [isPreviewing, setIsPreviewing] = (0, import_react7.useState)(false);
249
+ const [error, setError] = (0, import_react7.useState)(null);
250
+ const renderPreview = (0, import_react7.useCallback)(
163
251
  async (type, input, locale) => {
164
252
  setIsPreviewing(true);
165
253
  setError(null);
@@ -168,7 +256,7 @@ function useTemplatePreview(client) {
168
256
  setPreview(result);
169
257
  return result;
170
258
  } catch (err) {
171
- const apiError = err instanceof import_client4.FonderieApiError ? err : new import_client4.FonderieApiError("unknown", String(err), 0);
259
+ const apiError = err instanceof import_client7.FonderieApiError ? err : new import_client7.FonderieApiError("unknown", String(err), 0);
172
260
  setError(apiError);
173
261
  throw apiError;
174
262
  } finally {
@@ -177,15 +265,18 @@ function useTemplatePreview(client) {
177
265
  },
178
266
  [client]
179
267
  );
180
- const clearPreview = (0, import_react4.useCallback)(() => setPreview(null), []);
268
+ const clearPreview = (0, import_react7.useCallback)(() => setPreview(null), []);
181
269
  return { preview, isPreviewing, error, renderPreview, clearPreview };
182
270
  }
183
271
  // Annotate the CommonJS export names for ESM import in node:
184
272
  0 && (module.exports = {
185
273
  CourierAdminClient,
186
274
  FonderieApiError,
275
+ useBuiltInTemplate,
187
276
  useTemplate,
277
+ useTemplateCatalog,
188
278
  useTemplatePreview,
279
+ useTemplateResolution,
189
280
  useTemplateRevisions,
190
281
  useTemplates
191
282
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/useTemplate.ts","../src/hooks/useTemplateRevisions.ts","../src/hooks/useTemplates.ts","../src/hooks/useTemplatePreview.ts"],"sourcesContent":["export type {\n\tICourierAdminClientOptions,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n\tITemplateEntry,\n\tITemplateRevision,\n} from '@fonderie/client';\nexport { CourierAdminClient, FonderieApiError } from '@fonderie/client';\nexport type {\n\tIUseTemplatePreviewReturn,\n\tIUseTemplateReturn,\n\tIUseTemplateRevisionsReturn,\n\tIUseTemplatesReturn,\n} from './hooks';\nexport {\n\tuseTemplate,\n\tuseTemplatePreview,\n\tuseTemplateRevisions,\n\tuseTemplates,\n} from './hooks';\n","import type { CourierAdminClient, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateReturn {\n\ttemplate: ITemplateEntry | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\nexport function useTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateReturn {\n\tconst [template, setTemplate] = useState<ITemplateEntry | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplate(type, locale);\n\t\t\tsetTemplate(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { template, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateEntry, ITemplateRevision } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateRevisionsReturn {\n\trevisions: ITemplateRevision[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\trollback: (toVersion: number) => Promise<ITemplateEntry>;\n}\n\nexport function useTemplateRevisions(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateRevisionsReturn {\n\tconst [revisions, setRevisions] = useState<ITemplateRevision[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listRevisions(type, locale);\n\t\t\tsetRevisions(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tconst rollback = useCallback(\n\t\tasync (toVersion: number) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.rollback(type, { toVersion }, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, type, locale, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { revisions, isLoading, error, refresh, rollback };\n}\n","import type { CourierAdminClient, ISetTemplateInput, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplatesReturn {\n\ttemplates: ITemplateEntry[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\tsaveTemplate: (\n\t\ttype: string,\n\t\tinput: ISetTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<ITemplateEntry>;\n\tremoveTemplate: (type: string, locale?: string | null) => Promise<void>;\n}\n\nexport function useTemplates(client: CourierAdminClient): IUseTemplatesReturn {\n\tconst [templates, setTemplates] = useState<ITemplateEntry[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listTemplates();\n\t\t\tsetTemplates(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tconst saveTemplate = useCallback(\n\t\tasync (type: string, input: ISetTemplateInput, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.setTemplate(type, input, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tconst removeTemplate = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tawait client.deleteTemplate(type, locale);\n\t\t\t\tawait refresh();\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { templates, isLoading, error, refresh, saveTemplate, removeTemplate };\n}\n","import type {\n\tCourierAdminClient,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n} from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplatePreviewReturn {\n\tpreview: IRenderedTemplateResult | null;\n\tisPreviewing: boolean;\n\terror: FonderieApiError | null;\n\trenderPreview: (\n\t\ttype: string,\n\t\tinput: IPreviewTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<IRenderedTemplateResult>;\n\tclearPreview: () => void;\n}\n\n// On demand, not on mount: the caller decides when the editor's content is\n// worth rendering. Server-side, so what comes back is what the resolver\n// produces — the layout shell and the variable substitution included.\nexport function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn {\n\tconst [preview, setPreview] = useState<IRenderedTemplateResult | null>(null);\n\tconst [isPreviewing, setIsPreviewing] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst renderPreview = useCallback(\n\t\tasync (type: string, input: IPreviewTemplateInput, locale?: string | null) => {\n\t\t\tsetIsPreviewing(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.previewTemplate(type, input, locale);\n\t\t\t\tsetPreview(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t} finally {\n\t\t\t\tsetIsPreviewing(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\tconst clearPreview = useCallback(() => setPreview(null), []);\n\n\treturn { preview, isPreviewing, error, renderPreview, clearPreview };\n}\n"],"mappings":"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","names":["import_client","import_client","import_react","import_client","import_react","import_client","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useBuiltInTemplate.ts","../src/hooks/useTemplateCatalog.ts","../src/hooks/useTemplateResolution.ts","../src/hooks/useTemplate.ts","../src/hooks/useTemplateRevisions.ts","../src/hooks/useTemplates.ts","../src/hooks/useTemplatePreview.ts"],"sourcesContent":["export type {\n\tIBuiltInTemplate,\n\tICourierAdminClientOptions,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n\tITemplateCatalog,\n\tITemplateCatalogEntry,\n\tITemplateEntry,\n\tITemplateResolution,\n\tITemplateRevision,\n} from '@fonderie/client';\nexport { CourierAdminClient, FonderieApiError } from '@fonderie/client';\nexport type {\n\tIUseBuiltInTemplateReturn,\n\tIUseTemplateCatalogReturn,\n\tIUseTemplateResolutionReturn,\n\tIUseTemplatePreviewReturn,\n\tIUseTemplateReturn,\n\tIUseTemplateRevisionsReturn,\n\tIUseTemplatesReturn,\n} from './hooks';\nexport {\n\tuseBuiltInTemplate,\n\tuseTemplate,\n\tuseTemplateCatalog,\n\tuseTemplateResolution,\n\tuseTemplatePreview,\n\tuseTemplateRevisions,\n\tuseTemplates,\n} from './hooks';\n","import type { CourierAdminClient, IBuiltInTemplate } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseBuiltInTemplateReturn {\n\t/** Null while loading, and when none ships in that language (404 is not an error here). */\n\tbuiltIn: IBuiltInTemplate | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\n// Fonderie's own copy of an email in a language — to open a language nobody has\n// saved yet, or to compare a saved version with what ships.\nexport function useBuiltInTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseBuiltInTemplateReturn {\n\tconst [builtIn, setBuiltIn] = useState<IBuiltInTemplate | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getBuiltInTemplate(type, locale);\n\t\t\tsetBuiltIn(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t// Nothing ships in that language: an answer, not a failure.\n\t\t\tif (apiError.status === 404) setBuiltIn(null);\n\t\t\telse setError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { builtIn, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateCatalog } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateCatalogReturn {\n\tcatalog: ITemplateCatalog | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\n// Every email — saved or built-in only — with its languages and the app's\n// locales, for a template list that shows what actually exists.\nexport function useTemplateCatalog(client: CourierAdminClient): IUseTemplateCatalogReturn {\n\tconst [catalog, setCatalog] = useState<ITemplateCatalog | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplateCatalog();\n\t\t\tsetCatalog(result);\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0),\n\t\t\t);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { catalog, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateResolution } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplateResolutionReturn {\n\tresolution: ITemplateResolution | null;\n\tisResolving: boolean;\n\terror: FonderieApiError | null;\n\t/** Which version a send in `locale` would use. */\n\tresolve: (type: string, locale?: string | null) => Promise<ITemplateResolution | null>;\n}\n\n// Who receives what — asked of the server, which decides with the same function\n// a real send runs.\nexport function useTemplateResolution(client: CourierAdminClient): IUseTemplateResolutionReturn {\n\tconst [resolution, setResolution] = useState<ITemplateResolution | null>(null);\n\tconst [isResolving, setIsResolving] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst resolve = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetIsResolving(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.resolveTemplate(type, locale);\n\t\t\t\tsetResolution(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tsetError(\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0),\n\t\t\t\t);\n\t\t\t\tsetResolution(null);\n\t\t\t\treturn null;\n\t\t\t} finally {\n\t\t\t\tsetIsResolving(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\treturn { resolution, isResolving, error, resolve };\n}\n","import type { CourierAdminClient, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateReturn {\n\ttemplate: ITemplateEntry | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\nexport function useTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateReturn {\n\tconst [template, setTemplate] = useState<ITemplateEntry | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplate(type, locale);\n\t\t\tsetTemplate(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t// Gone (deleted, or never saved): drop what was shown, or a screen keeps\n\t\t\t// rendering a version that no longer exists.\n\t\t\tif (apiError.status === 404) setTemplate(null);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { template, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateEntry, ITemplateRevision } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateRevisionsReturn {\n\trevisions: ITemplateRevision[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\trollback: (toVersion: number) => Promise<ITemplateEntry>;\n}\n\nexport function useTemplateRevisions(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateRevisionsReturn {\n\tconst [revisions, setRevisions] = useState<ITemplateRevision[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listRevisions(type, locale);\n\t\t\tsetRevisions(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tconst rollback = useCallback(\n\t\tasync (toVersion: number) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.rollback(type, { toVersion }, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, type, locale, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { revisions, isLoading, error, refresh, rollback };\n}\n","import type { CourierAdminClient, ISetTemplateInput, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplatesReturn {\n\ttemplates: ITemplateEntry[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\tsaveTemplate: (\n\t\ttype: string,\n\t\tinput: ISetTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<ITemplateEntry>;\n\tremoveTemplate: (type: string, locale?: string | null) => Promise<void>;\n}\n\nexport function useTemplates(client: CourierAdminClient): IUseTemplatesReturn {\n\tconst [templates, setTemplates] = useState<ITemplateEntry[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listTemplates();\n\t\t\tsetTemplates(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tconst saveTemplate = useCallback(\n\t\tasync (type: string, input: ISetTemplateInput, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.setTemplate(type, input, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tconst removeTemplate = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tawait client.deleteTemplate(type, locale);\n\t\t\t\tawait refresh();\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { templates, isLoading, error, refresh, saveTemplate, removeTemplate };\n}\n","import type {\n\tCourierAdminClient,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n} from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplatePreviewReturn {\n\tpreview: IRenderedTemplateResult | null;\n\tisPreviewing: boolean;\n\terror: FonderieApiError | null;\n\trenderPreview: (\n\t\ttype: string,\n\t\tinput: IPreviewTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<IRenderedTemplateResult>;\n\tclearPreview: () => void;\n}\n\n// On demand, not on mount: the caller decides when the editor's content is\n// worth rendering. Server-side, so what comes back is what the resolver\n// produces — the layout shell and the variable substitution included.\nexport function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn {\n\tconst [preview, setPreview] = useState<IRenderedTemplateResult | null>(null);\n\tconst [isPreviewing, setIsPreviewing] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst renderPreview = useCallback(\n\t\tasync (type: string, input: IPreviewTemplateInput, locale?: string | null) => {\n\t\t\tsetIsPreviewing(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.previewTemplate(type, input, locale);\n\t\t\t\tsetPreview(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t} finally {\n\t\t\t\tsetIsPreviewing(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\tconst clearPreview = useCallback(() => setPreview(null), []);\n\n\treturn { preview, isPreviewing, error, renderPreview, clearPreview };\n}\n"],"mappings":"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","names":["import_client","import_client","import_react","import_client","import_react","import_client","import_react","import_client","import_react","import_client","import_react","import_client","import_react"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,31 @@
1
- import { ITemplateEntry, FonderieApiError, CourierAdminClient, ITemplateRevision, ISetTemplateInput, IRenderedTemplateResult, IPreviewTemplateInput } from '@fonderie/client';
2
- export { CourierAdminClient, FonderieApiError, ICourierAdminClientOptions, IPreviewTemplateInput, IRenderedTemplateResult, IRollbackTemplateInput, ISetTemplateInput, ITemplateEntry, ITemplateRevision } from '@fonderie/client';
1
+ import { IBuiltInTemplate, FonderieApiError, CourierAdminClient, ITemplateCatalog, ITemplateResolution, ITemplateEntry, ITemplateRevision, ISetTemplateInput, IRenderedTemplateResult, IPreviewTemplateInput } from '@fonderie/client';
2
+ export { CourierAdminClient, FonderieApiError, IBuiltInTemplate, ICourierAdminClientOptions, IPreviewTemplateInput, IRenderedTemplateResult, IRollbackTemplateInput, ISetTemplateInput, ITemplateCatalog, ITemplateCatalogEntry, ITemplateEntry, ITemplateResolution, ITemplateRevision } from '@fonderie/client';
3
+
4
+ interface IUseBuiltInTemplateReturn {
5
+ /** Null while loading, and when none ships in that language (404 is not an error here). */
6
+ builtIn: IBuiltInTemplate | null;
7
+ isLoading: boolean;
8
+ error: FonderieApiError | null;
9
+ refresh: () => Promise<void>;
10
+ }
11
+ declare function useBuiltInTemplate(client: CourierAdminClient, type: string, locale?: string | null): IUseBuiltInTemplateReturn;
12
+
13
+ interface IUseTemplateCatalogReturn {
14
+ catalog: ITemplateCatalog | null;
15
+ isLoading: boolean;
16
+ error: FonderieApiError | null;
17
+ refresh: () => Promise<void>;
18
+ }
19
+ declare function useTemplateCatalog(client: CourierAdminClient): IUseTemplateCatalogReturn;
20
+
21
+ interface IUseTemplateResolutionReturn {
22
+ resolution: ITemplateResolution | null;
23
+ isResolving: boolean;
24
+ error: FonderieApiError | null;
25
+ /** Which version a send in `locale` would use. */
26
+ resolve: (type: string, locale?: string | null) => Promise<ITemplateResolution | null>;
27
+ }
28
+ declare function useTemplateResolution(client: CourierAdminClient): IUseTemplateResolutionReturn;
3
29
 
4
30
  interface IUseTemplateReturn {
5
31
  template: ITemplateEntry | null;
@@ -37,4 +63,4 @@ interface IUseTemplatePreviewReturn {
37
63
  }
38
64
  declare function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn;
39
65
 
40
- export { type IUseTemplatePreviewReturn, type IUseTemplateReturn, type IUseTemplateRevisionsReturn, type IUseTemplatesReturn, useTemplate, useTemplatePreview, useTemplateRevisions, useTemplates };
66
+ export { type IUseBuiltInTemplateReturn, type IUseTemplateCatalogReturn, type IUseTemplatePreviewReturn, type IUseTemplateResolutionReturn, type IUseTemplateReturn, type IUseTemplateRevisionsReturn, type IUseTemplatesReturn, useBuiltInTemplate, useTemplate, useTemplateCatalog, useTemplatePreview, useTemplateResolution, useTemplateRevisions, useTemplates };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,31 @@
1
- import { ITemplateEntry, FonderieApiError, CourierAdminClient, ITemplateRevision, ISetTemplateInput, IRenderedTemplateResult, IPreviewTemplateInput } from '@fonderie/client';
2
- export { CourierAdminClient, FonderieApiError, ICourierAdminClientOptions, IPreviewTemplateInput, IRenderedTemplateResult, IRollbackTemplateInput, ISetTemplateInput, ITemplateEntry, ITemplateRevision } from '@fonderie/client';
1
+ import { IBuiltInTemplate, FonderieApiError, CourierAdminClient, ITemplateCatalog, ITemplateResolution, ITemplateEntry, ITemplateRevision, ISetTemplateInput, IRenderedTemplateResult, IPreviewTemplateInput } from '@fonderie/client';
2
+ export { CourierAdminClient, FonderieApiError, IBuiltInTemplate, ICourierAdminClientOptions, IPreviewTemplateInput, IRenderedTemplateResult, IRollbackTemplateInput, ISetTemplateInput, ITemplateCatalog, ITemplateCatalogEntry, ITemplateEntry, ITemplateResolution, ITemplateRevision } from '@fonderie/client';
3
+
4
+ interface IUseBuiltInTemplateReturn {
5
+ /** Null while loading, and when none ships in that language (404 is not an error here). */
6
+ builtIn: IBuiltInTemplate | null;
7
+ isLoading: boolean;
8
+ error: FonderieApiError | null;
9
+ refresh: () => Promise<void>;
10
+ }
11
+ declare function useBuiltInTemplate(client: CourierAdminClient, type: string, locale?: string | null): IUseBuiltInTemplateReturn;
12
+
13
+ interface IUseTemplateCatalogReturn {
14
+ catalog: ITemplateCatalog | null;
15
+ isLoading: boolean;
16
+ error: FonderieApiError | null;
17
+ refresh: () => Promise<void>;
18
+ }
19
+ declare function useTemplateCatalog(client: CourierAdminClient): IUseTemplateCatalogReturn;
20
+
21
+ interface IUseTemplateResolutionReturn {
22
+ resolution: ITemplateResolution | null;
23
+ isResolving: boolean;
24
+ error: FonderieApiError | null;
25
+ /** Which version a send in `locale` would use. */
26
+ resolve: (type: string, locale?: string | null) => Promise<ITemplateResolution | null>;
27
+ }
28
+ declare function useTemplateResolution(client: CourierAdminClient): IUseTemplateResolutionReturn;
3
29
 
4
30
  interface IUseTemplateReturn {
5
31
  template: ITemplateEntry | null;
@@ -37,4 +63,4 @@ interface IUseTemplatePreviewReturn {
37
63
  }
38
64
  declare function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn;
39
65
 
40
- export { type IUseTemplatePreviewReturn, type IUseTemplateReturn, type IUseTemplateRevisionsReturn, type IUseTemplatesReturn, useTemplate, useTemplatePreview, useTemplateRevisions, useTemplates };
66
+ export { type IUseBuiltInTemplateReturn, type IUseTemplateCatalogReturn, type IUseTemplatePreviewReturn, type IUseTemplateResolutionReturn, type IUseTemplateReturn, type IUseTemplateRevisionsReturn, type IUseTemplatesReturn, useBuiltInTemplate, useTemplate, useTemplateCatalog, useTemplatePreview, useTemplateResolution, useTemplateRevisions, useTemplates };
package/dist/index.js CHANGED
@@ -1,22 +1,23 @@
1
1
  // src/index.ts
2
- import { CourierAdminClient, FonderieApiError as FonderieApiError5 } from "@fonderie/client";
2
+ import { CourierAdminClient, FonderieApiError as FonderieApiError8 } from "@fonderie/client";
3
3
 
4
- // src/hooks/useTemplate.ts
4
+ // src/hooks/useBuiltInTemplate.ts
5
5
  import { FonderieApiError } from "@fonderie/client";
6
6
  import { useCallback, useEffect, useState } from "react";
7
- function useTemplate(client, type, locale) {
8
- const [template, setTemplate] = useState(null);
7
+ function useBuiltInTemplate(client, type, locale) {
8
+ const [builtIn, setBuiltIn] = useState(null);
9
9
  const [isLoading, setIsLoading] = useState(true);
10
10
  const [error, setError] = useState(null);
11
11
  const refresh = useCallback(async () => {
12
12
  setIsLoading(true);
13
13
  setError(null);
14
14
  try {
15
- const { result } = await client.getTemplate(type, locale);
16
- setTemplate(result);
15
+ const { result } = await client.getBuiltInTemplate(type, locale);
16
+ setBuiltIn(result);
17
17
  } catch (err) {
18
18
  const apiError = err instanceof FonderieApiError ? err : new FonderieApiError("unknown", String(err), 0);
19
- setError(apiError);
19
+ if (apiError.status === 404) setBuiltIn(null);
20
+ else setError(apiError);
20
21
  } finally {
21
22
  setIsLoading(false);
22
23
  }
@@ -24,30 +25,114 @@ function useTemplate(client, type, locale) {
24
25
  useEffect(() => {
25
26
  void refresh();
26
27
  }, [refresh]);
27
- return { template, isLoading, error, refresh };
28
+ return { builtIn, isLoading, error, refresh };
28
29
  }
29
30
 
30
- // src/hooks/useTemplateRevisions.ts
31
+ // src/hooks/useTemplateCatalog.ts
31
32
  import { FonderieApiError as FonderieApiError2 } from "@fonderie/client";
32
33
  import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
33
- function useTemplateRevisions(client, type, locale) {
34
- const [revisions, setRevisions] = useState2([]);
34
+ function useTemplateCatalog(client) {
35
+ const [catalog, setCatalog] = useState2(null);
35
36
  const [isLoading, setIsLoading] = useState2(true);
36
37
  const [error, setError] = useState2(null);
37
38
  const refresh = useCallback2(async () => {
39
+ setIsLoading(true);
40
+ setError(null);
41
+ try {
42
+ const { result } = await client.getTemplateCatalog();
43
+ setCatalog(result);
44
+ } catch (err) {
45
+ setError(
46
+ err instanceof FonderieApiError2 ? err : new FonderieApiError2("unknown", String(err), 0)
47
+ );
48
+ } finally {
49
+ setIsLoading(false);
50
+ }
51
+ }, [client]);
52
+ useEffect2(() => {
53
+ void refresh();
54
+ }, [refresh]);
55
+ return { catalog, isLoading, error, refresh };
56
+ }
57
+
58
+ // src/hooks/useTemplateResolution.ts
59
+ import { FonderieApiError as FonderieApiError3 } from "@fonderie/client";
60
+ import { useCallback as useCallback3, useState as useState3 } from "react";
61
+ function useTemplateResolution(client) {
62
+ const [resolution, setResolution] = useState3(null);
63
+ const [isResolving, setIsResolving] = useState3(false);
64
+ const [error, setError] = useState3(null);
65
+ const resolve = useCallback3(
66
+ async (type, locale) => {
67
+ setIsResolving(true);
68
+ setError(null);
69
+ try {
70
+ const { result } = await client.resolveTemplate(type, locale);
71
+ setResolution(result);
72
+ return result;
73
+ } catch (err) {
74
+ setError(
75
+ err instanceof FonderieApiError3 ? err : new FonderieApiError3("unknown", String(err), 0)
76
+ );
77
+ setResolution(null);
78
+ return null;
79
+ } finally {
80
+ setIsResolving(false);
81
+ }
82
+ },
83
+ [client]
84
+ );
85
+ return { resolution, isResolving, error, resolve };
86
+ }
87
+
88
+ // src/hooks/useTemplate.ts
89
+ import { FonderieApiError as FonderieApiError4 } from "@fonderie/client";
90
+ import { useCallback as useCallback4, useEffect as useEffect3, useState as useState4 } from "react";
91
+ function useTemplate(client, type, locale) {
92
+ const [template, setTemplate] = useState4(null);
93
+ const [isLoading, setIsLoading] = useState4(true);
94
+ const [error, setError] = useState4(null);
95
+ const refresh = useCallback4(async () => {
96
+ setIsLoading(true);
97
+ setError(null);
98
+ try {
99
+ const { result } = await client.getTemplate(type, locale);
100
+ setTemplate(result);
101
+ } catch (err) {
102
+ const apiError = err instanceof FonderieApiError4 ? err : new FonderieApiError4("unknown", String(err), 0);
103
+ if (apiError.status === 404) setTemplate(null);
104
+ setError(apiError);
105
+ } finally {
106
+ setIsLoading(false);
107
+ }
108
+ }, [client, type, locale]);
109
+ useEffect3(() => {
110
+ void refresh();
111
+ }, [refresh]);
112
+ return { template, isLoading, error, refresh };
113
+ }
114
+
115
+ // src/hooks/useTemplateRevisions.ts
116
+ import { FonderieApiError as FonderieApiError5 } from "@fonderie/client";
117
+ import { useCallback as useCallback5, useEffect as useEffect4, useState as useState5 } from "react";
118
+ function useTemplateRevisions(client, type, locale) {
119
+ const [revisions, setRevisions] = useState5([]);
120
+ const [isLoading, setIsLoading] = useState5(true);
121
+ const [error, setError] = useState5(null);
122
+ const refresh = useCallback5(async () => {
38
123
  setIsLoading(true);
39
124
  setError(null);
40
125
  try {
41
126
  const { result } = await client.listRevisions(type, locale);
42
127
  setRevisions(result);
43
128
  } catch (err) {
44
- const apiError = err instanceof FonderieApiError2 ? err : new FonderieApiError2("unknown", String(err), 0);
129
+ const apiError = err instanceof FonderieApiError5 ? err : new FonderieApiError5("unknown", String(err), 0);
45
130
  setError(apiError);
46
131
  } finally {
47
132
  setIsLoading(false);
48
133
  }
49
134
  }, [client, type, locale]);
50
- const rollback = useCallback2(
135
+ const rollback = useCallback5(
51
136
  async (toVersion) => {
52
137
  setError(null);
53
138
  try {
@@ -55,40 +140,40 @@ function useTemplateRevisions(client, type, locale) {
55
140
  await refresh();
56
141
  return result;
57
142
  } catch (err) {
58
- const apiError = err instanceof FonderieApiError2 ? err : new FonderieApiError2("unknown", String(err), 0);
143
+ const apiError = err instanceof FonderieApiError5 ? err : new FonderieApiError5("unknown", String(err), 0);
59
144
  setError(apiError);
60
145
  throw apiError;
61
146
  }
62
147
  },
63
148
  [client, type, locale, refresh]
64
149
  );
65
- useEffect2(() => {
150
+ useEffect4(() => {
66
151
  void refresh();
67
152
  }, [refresh]);
68
153
  return { revisions, isLoading, error, refresh, rollback };
69
154
  }
70
155
 
71
156
  // src/hooks/useTemplates.ts
72
- import { FonderieApiError as FonderieApiError3 } from "@fonderie/client";
73
- import { useCallback as useCallback3, useEffect as useEffect3, useState as useState3 } from "react";
157
+ import { FonderieApiError as FonderieApiError6 } from "@fonderie/client";
158
+ import { useCallback as useCallback6, useEffect as useEffect5, useState as useState6 } from "react";
74
159
  function useTemplates(client) {
75
- const [templates, setTemplates] = useState3([]);
76
- const [isLoading, setIsLoading] = useState3(true);
77
- const [error, setError] = useState3(null);
78
- const refresh = useCallback3(async () => {
160
+ const [templates, setTemplates] = useState6([]);
161
+ const [isLoading, setIsLoading] = useState6(true);
162
+ const [error, setError] = useState6(null);
163
+ const refresh = useCallback6(async () => {
79
164
  setIsLoading(true);
80
165
  setError(null);
81
166
  try {
82
167
  const { result } = await client.listTemplates();
83
168
  setTemplates(result);
84
169
  } catch (err) {
85
- const apiError = err instanceof FonderieApiError3 ? err : new FonderieApiError3("unknown", String(err), 0);
170
+ const apiError = err instanceof FonderieApiError6 ? err : new FonderieApiError6("unknown", String(err), 0);
86
171
  setError(apiError);
87
172
  } finally {
88
173
  setIsLoading(false);
89
174
  }
90
175
  }, [client]);
91
- const saveTemplate = useCallback3(
176
+ const saveTemplate = useCallback6(
92
177
  async (type, input, locale) => {
93
178
  setError(null);
94
179
  try {
@@ -96,41 +181,41 @@ function useTemplates(client) {
96
181
  await refresh();
97
182
  return result;
98
183
  } catch (err) {
99
- const apiError = err instanceof FonderieApiError3 ? err : new FonderieApiError3("unknown", String(err), 0);
184
+ const apiError = err instanceof FonderieApiError6 ? err : new FonderieApiError6("unknown", String(err), 0);
100
185
  setError(apiError);
101
186
  throw apiError;
102
187
  }
103
188
  },
104
189
  [client, refresh]
105
190
  );
106
- const removeTemplate = useCallback3(
191
+ const removeTemplate = useCallback6(
107
192
  async (type, locale) => {
108
193
  setError(null);
109
194
  try {
110
195
  await client.deleteTemplate(type, locale);
111
196
  await refresh();
112
197
  } catch (err) {
113
- const apiError = err instanceof FonderieApiError3 ? err : new FonderieApiError3("unknown", String(err), 0);
198
+ const apiError = err instanceof FonderieApiError6 ? err : new FonderieApiError6("unknown", String(err), 0);
114
199
  setError(apiError);
115
200
  throw apiError;
116
201
  }
117
202
  },
118
203
  [client, refresh]
119
204
  );
120
- useEffect3(() => {
205
+ useEffect5(() => {
121
206
  void refresh();
122
207
  }, [refresh]);
123
208
  return { templates, isLoading, error, refresh, saveTemplate, removeTemplate };
124
209
  }
125
210
 
126
211
  // src/hooks/useTemplatePreview.ts
127
- import { FonderieApiError as FonderieApiError4 } from "@fonderie/client";
128
- import { useCallback as useCallback4, useState as useState4 } from "react";
212
+ import { FonderieApiError as FonderieApiError7 } from "@fonderie/client";
213
+ import { useCallback as useCallback7, useState as useState7 } from "react";
129
214
  function useTemplatePreview(client) {
130
- const [preview, setPreview] = useState4(null);
131
- const [isPreviewing, setIsPreviewing] = useState4(false);
132
- const [error, setError] = useState4(null);
133
- const renderPreview = useCallback4(
215
+ const [preview, setPreview] = useState7(null);
216
+ const [isPreviewing, setIsPreviewing] = useState7(false);
217
+ const [error, setError] = useState7(null);
218
+ const renderPreview = useCallback7(
134
219
  async (type, input, locale) => {
135
220
  setIsPreviewing(true);
136
221
  setError(null);
@@ -139,7 +224,7 @@ function useTemplatePreview(client) {
139
224
  setPreview(result);
140
225
  return result;
141
226
  } catch (err) {
142
- const apiError = err instanceof FonderieApiError4 ? err : new FonderieApiError4("unknown", String(err), 0);
227
+ const apiError = err instanceof FonderieApiError7 ? err : new FonderieApiError7("unknown", String(err), 0);
143
228
  setError(apiError);
144
229
  throw apiError;
145
230
  } finally {
@@ -148,14 +233,17 @@ function useTemplatePreview(client) {
148
233
  },
149
234
  [client]
150
235
  );
151
- const clearPreview = useCallback4(() => setPreview(null), []);
236
+ const clearPreview = useCallback7(() => setPreview(null), []);
152
237
  return { preview, isPreviewing, error, renderPreview, clearPreview };
153
238
  }
154
239
  export {
155
240
  CourierAdminClient,
156
- FonderieApiError5 as FonderieApiError,
241
+ FonderieApiError8 as FonderieApiError,
242
+ useBuiltInTemplate,
157
243
  useTemplate,
244
+ useTemplateCatalog,
158
245
  useTemplatePreview,
246
+ useTemplateResolution,
159
247
  useTemplateRevisions,
160
248
  useTemplates
161
249
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/useTemplate.ts","../src/hooks/useTemplateRevisions.ts","../src/hooks/useTemplates.ts","../src/hooks/useTemplatePreview.ts"],"sourcesContent":["export type {\n\tICourierAdminClientOptions,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n\tITemplateEntry,\n\tITemplateRevision,\n} from '@fonderie/client';\nexport { CourierAdminClient, FonderieApiError } from '@fonderie/client';\nexport type {\n\tIUseTemplatePreviewReturn,\n\tIUseTemplateReturn,\n\tIUseTemplateRevisionsReturn,\n\tIUseTemplatesReturn,\n} from './hooks';\nexport {\n\tuseTemplate,\n\tuseTemplatePreview,\n\tuseTemplateRevisions,\n\tuseTemplates,\n} from './hooks';\n","import type { CourierAdminClient, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateReturn {\n\ttemplate: ITemplateEntry | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\nexport function useTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateReturn {\n\tconst [template, setTemplate] = useState<ITemplateEntry | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplate(type, locale);\n\t\t\tsetTemplate(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { template, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateEntry, ITemplateRevision } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateRevisionsReturn {\n\trevisions: ITemplateRevision[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\trollback: (toVersion: number) => Promise<ITemplateEntry>;\n}\n\nexport function useTemplateRevisions(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateRevisionsReturn {\n\tconst [revisions, setRevisions] = useState<ITemplateRevision[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listRevisions(type, locale);\n\t\t\tsetRevisions(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tconst rollback = useCallback(\n\t\tasync (toVersion: number) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.rollback(type, { toVersion }, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, type, locale, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { revisions, isLoading, error, refresh, rollback };\n}\n","import type { CourierAdminClient, ISetTemplateInput, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplatesReturn {\n\ttemplates: ITemplateEntry[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\tsaveTemplate: (\n\t\ttype: string,\n\t\tinput: ISetTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<ITemplateEntry>;\n\tremoveTemplate: (type: string, locale?: string | null) => Promise<void>;\n}\n\nexport function useTemplates(client: CourierAdminClient): IUseTemplatesReturn {\n\tconst [templates, setTemplates] = useState<ITemplateEntry[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listTemplates();\n\t\t\tsetTemplates(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tconst saveTemplate = useCallback(\n\t\tasync (type: string, input: ISetTemplateInput, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.setTemplate(type, input, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tconst removeTemplate = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tawait client.deleteTemplate(type, locale);\n\t\t\t\tawait refresh();\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { templates, isLoading, error, refresh, saveTemplate, removeTemplate };\n}\n","import type {\n\tCourierAdminClient,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n} from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplatePreviewReturn {\n\tpreview: IRenderedTemplateResult | null;\n\tisPreviewing: boolean;\n\terror: FonderieApiError | null;\n\trenderPreview: (\n\t\ttype: string,\n\t\tinput: IPreviewTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<IRenderedTemplateResult>;\n\tclearPreview: () => void;\n}\n\n// On demand, not on mount: the caller decides when the editor's content is\n// worth rendering. Server-side, so what comes back is what the resolver\n// produces — the layout shell and the variable substitution included.\nexport function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn {\n\tconst [preview, setPreview] = useState<IRenderedTemplateResult | null>(null);\n\tconst [isPreviewing, setIsPreviewing] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst renderPreview = useCallback(\n\t\tasync (type: string, input: IPreviewTemplateInput, locale?: string | null) => {\n\t\t\tsetIsPreviewing(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.previewTemplate(type, input, locale);\n\t\t\t\tsetPreview(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t} finally {\n\t\t\t\tsetIsPreviewing(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\tconst clearPreview = useCallback(() => setPreview(null), []);\n\n\treturn { preview, isPreviewing, error, renderPreview, clearPreview };\n}\n"],"mappings":"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","names":["FonderieApiError","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useState"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useBuiltInTemplate.ts","../src/hooks/useTemplateCatalog.ts","../src/hooks/useTemplateResolution.ts","../src/hooks/useTemplate.ts","../src/hooks/useTemplateRevisions.ts","../src/hooks/useTemplates.ts","../src/hooks/useTemplatePreview.ts"],"sourcesContent":["export type {\n\tIBuiltInTemplate,\n\tICourierAdminClientOptions,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n\tITemplateCatalog,\n\tITemplateCatalogEntry,\n\tITemplateEntry,\n\tITemplateResolution,\n\tITemplateRevision,\n} from '@fonderie/client';\nexport { CourierAdminClient, FonderieApiError } from '@fonderie/client';\nexport type {\n\tIUseBuiltInTemplateReturn,\n\tIUseTemplateCatalogReturn,\n\tIUseTemplateResolutionReturn,\n\tIUseTemplatePreviewReturn,\n\tIUseTemplateReturn,\n\tIUseTemplateRevisionsReturn,\n\tIUseTemplatesReturn,\n} from './hooks';\nexport {\n\tuseBuiltInTemplate,\n\tuseTemplate,\n\tuseTemplateCatalog,\n\tuseTemplateResolution,\n\tuseTemplatePreview,\n\tuseTemplateRevisions,\n\tuseTemplates,\n} from './hooks';\n","import type { CourierAdminClient, IBuiltInTemplate } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseBuiltInTemplateReturn {\n\t/** Null while loading, and when none ships in that language (404 is not an error here). */\n\tbuiltIn: IBuiltInTemplate | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\n// Fonderie's own copy of an email in a language — to open a language nobody has\n// saved yet, or to compare a saved version with what ships.\nexport function useBuiltInTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseBuiltInTemplateReturn {\n\tconst [builtIn, setBuiltIn] = useState<IBuiltInTemplate | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getBuiltInTemplate(type, locale);\n\t\t\tsetBuiltIn(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t// Nothing ships in that language: an answer, not a failure.\n\t\t\tif (apiError.status === 404) setBuiltIn(null);\n\t\t\telse setError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { builtIn, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateCatalog } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateCatalogReturn {\n\tcatalog: ITemplateCatalog | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\n// Every email — saved or built-in only — with its languages and the app's\n// locales, for a template list that shows what actually exists.\nexport function useTemplateCatalog(client: CourierAdminClient): IUseTemplateCatalogReturn {\n\tconst [catalog, setCatalog] = useState<ITemplateCatalog | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplateCatalog();\n\t\t\tsetCatalog(result);\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0),\n\t\t\t);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { catalog, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateResolution } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplateResolutionReturn {\n\tresolution: ITemplateResolution | null;\n\tisResolving: boolean;\n\terror: FonderieApiError | null;\n\t/** Which version a send in `locale` would use. */\n\tresolve: (type: string, locale?: string | null) => Promise<ITemplateResolution | null>;\n}\n\n// Who receives what — asked of the server, which decides with the same function\n// a real send runs.\nexport function useTemplateResolution(client: CourierAdminClient): IUseTemplateResolutionReturn {\n\tconst [resolution, setResolution] = useState<ITemplateResolution | null>(null);\n\tconst [isResolving, setIsResolving] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst resolve = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetIsResolving(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.resolveTemplate(type, locale);\n\t\t\t\tsetResolution(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tsetError(\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0),\n\t\t\t\t);\n\t\t\t\tsetResolution(null);\n\t\t\t\treturn null;\n\t\t\t} finally {\n\t\t\t\tsetIsResolving(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\treturn { resolution, isResolving, error, resolve };\n}\n","import type { CourierAdminClient, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateReturn {\n\ttemplate: ITemplateEntry | null;\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n}\n\nexport function useTemplate(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateReturn {\n\tconst [template, setTemplate] = useState<ITemplateEntry | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.getTemplate(type, locale);\n\t\t\tsetTemplate(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t// Gone (deleted, or never saved): drop what was shown, or a screen keeps\n\t\t\t// rendering a version that no longer exists.\n\t\t\tif (apiError.status === 404) setTemplate(null);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { template, isLoading, error, refresh };\n}\n","import type { CourierAdminClient, ITemplateEntry, ITemplateRevision } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplateRevisionsReturn {\n\trevisions: ITemplateRevision[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\trollback: (toVersion: number) => Promise<ITemplateEntry>;\n}\n\nexport function useTemplateRevisions(\n\tclient: CourierAdminClient,\n\ttype: string,\n\tlocale?: string | null,\n): IUseTemplateRevisionsReturn {\n\tconst [revisions, setRevisions] = useState<ITemplateRevision[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listRevisions(type, locale);\n\t\t\tsetRevisions(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client, type, locale]);\n\n\tconst rollback = useCallback(\n\t\tasync (toVersion: number) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.rollback(type, { toVersion }, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, type, locale, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { revisions, isLoading, error, refresh, rollback };\n}\n","import type { CourierAdminClient, ISetTemplateInput, ITemplateEntry } from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface IUseTemplatesReturn {\n\ttemplates: ITemplateEntry[];\n\tisLoading: boolean;\n\terror: FonderieApiError | null;\n\trefresh: () => Promise<void>;\n\tsaveTemplate: (\n\t\ttype: string,\n\t\tinput: ISetTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<ITemplateEntry>;\n\tremoveTemplate: (type: string, locale?: string | null) => Promise<void>;\n}\n\nexport function useTemplates(client: CourierAdminClient): IUseTemplatesReturn {\n\tconst [templates, setTemplates] = useState<ITemplateEntry[]>([]);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst refresh = useCallback(async () => {\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst { result } = await client.listTemplates();\n\t\t\tsetTemplates(result);\n\t\t} catch (err) {\n\t\t\tconst apiError =\n\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\tsetError(apiError);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [client]);\n\n\tconst saveTemplate = useCallback(\n\t\tasync (type: string, input: ISetTemplateInput, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.setTemplate(type, input, locale);\n\t\t\t\tawait refresh();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tconst removeTemplate = useCallback(\n\t\tasync (type: string, locale?: string | null) => {\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tawait client.deleteTemplate(type, locale);\n\t\t\t\tawait refresh();\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t}\n\t\t},\n\t\t[client, refresh],\n\t);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t}, [refresh]);\n\n\treturn { templates, isLoading, error, refresh, saveTemplate, removeTemplate };\n}\n","import type {\n\tCourierAdminClient,\n\tIPreviewTemplateInput,\n\tIRenderedTemplateResult,\n} from '@fonderie/client';\nimport { FonderieApiError } from '@fonderie/client';\nimport { useCallback, useState } from 'react';\n\nexport interface IUseTemplatePreviewReturn {\n\tpreview: IRenderedTemplateResult | null;\n\tisPreviewing: boolean;\n\terror: FonderieApiError | null;\n\trenderPreview: (\n\t\ttype: string,\n\t\tinput: IPreviewTemplateInput,\n\t\tlocale?: string | null,\n\t) => Promise<IRenderedTemplateResult>;\n\tclearPreview: () => void;\n}\n\n// On demand, not on mount: the caller decides when the editor's content is\n// worth rendering. Server-side, so what comes back is what the resolver\n// produces — the layout shell and the variable substitution included.\nexport function useTemplatePreview(client: CourierAdminClient): IUseTemplatePreviewReturn {\n\tconst [preview, setPreview] = useState<IRenderedTemplateResult | null>(null);\n\tconst [isPreviewing, setIsPreviewing] = useState(false);\n\tconst [error, setError] = useState<FonderieApiError | null>(null);\n\n\tconst renderPreview = useCallback(\n\t\tasync (type: string, input: IPreviewTemplateInput, locale?: string | null) => {\n\t\t\tsetIsPreviewing(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst { result } = await client.previewTemplate(type, input, locale);\n\t\t\t\tsetPreview(result);\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst apiError =\n\t\t\t\t\terr instanceof FonderieApiError ? err : new FonderieApiError('unknown', String(err), 0);\n\t\t\t\tsetError(apiError);\n\t\t\t\tthrow apiError;\n\t\t\t} finally {\n\t\t\t\tsetIsPreviewing(false);\n\t\t\t}\n\t\t},\n\t\t[client],\n\t);\n\n\tconst clearPreview = useCallback(() => setPreview(null), []);\n\n\treturn { preview, isPreviewing, error, renderPreview, clearPreview };\n}\n"],"mappings":";AAaA,SAAS,oBAAoB,oBAAAA,yBAAwB;;;ACZrD,SAAS,wBAAwB;AACjC,SAAS,aAAa,WAAW,gBAAgB;AAY1C,SAAS,mBACf,QACA,MACA,QAC4B;AAC5B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkC,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkC,IAAI;AAEhE,QAAM,UAAU,YAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACH,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,mBAAmB,MAAM,MAAM;AAC/D,iBAAW,MAAM;AAAA,IAClB,SAAS,KAAK;AACb,YAAM,WACL,eAAe,mBAAmB,MAAM,IAAI,iBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AAEvF,UAAI,SAAS,WAAW,IAAK,YAAW,IAAI;AAAA,UACvC,UAAS,QAAQ;AAAA,IACvB,UAAE;AACD,mBAAa,KAAK;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,QAAQ,MAAM,MAAM,CAAC;AAEzB,YAAU,MAAM;AACf,SAAK,QAAQ;AAAA,EACd,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,SAAS,WAAW,OAAO,QAAQ;AAC7C;;;AC5CA,SAAS,oBAAAC,yBAAwB;AACjC,SAAS,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAW1C,SAAS,mBAAmB,QAAuD;AACzF,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkC,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,UAAUF,aAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACH,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,mBAAmB;AACnD,iBAAW,MAAM;AAAA,IAClB,SAAS,KAAK;AACb;AAAA,QACC,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AAAA,MACvF;AAAA,IACD,UAAE;AACD,mBAAa,KAAK;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAE,WAAU,MAAM;AACf,SAAK,QAAQ;AAAA,EACd,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,SAAS,WAAW,OAAO,QAAQ;AAC7C;;;ACrCA,SAAS,oBAAAE,yBAAwB;AACjC,SAAS,eAAAC,cAAa,YAAAC,iBAAgB;AAY/B,SAAS,sBAAsB,QAA0D;AAC/F,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAqC,IAAI;AAC7E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,UAAUD;AAAA,IACf,OAAO,MAAc,WAA2B;AAC/C,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,UAAI;AACH,cAAM,EAAE,OAAO,IAAI,MAAM,OAAO,gBAAgB,MAAM,MAAM;AAC5D,sBAAc,MAAM;AACpB,eAAO;AAAA,MACR,SAAS,KAAK;AACb;AAAA,UACC,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AAAA,QACvF;AACA,sBAAc,IAAI;AAClB,eAAO;AAAA,MACR,UAAE;AACD,uBAAe,KAAK;AAAA,MACrB;AAAA,IACD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AAEA,SAAO,EAAE,YAAY,aAAa,OAAO,QAAQ;AAClD;;;ACxCA,SAAS,oBAAAG,yBAAwB;AACjC,SAAS,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAS1C,SAAS,YACf,QACA,MACA,QACqB;AACrB,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAgC,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,UAAUF,aAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACH,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,YAAY,MAAM,MAAM;AACxD,kBAAY,MAAM;AAAA,IACnB,SAAS,KAAK;AACb,YAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AAGvF,UAAI,SAAS,WAAW,IAAK,aAAY,IAAI;AAC7C,eAAS,QAAQ;AAAA,IAClB,UAAE;AACD,mBAAa,KAAK;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,QAAQ,MAAM,MAAM,CAAC;AAEzB,EAAAE,WAAU,MAAM;AACf,SAAK,QAAQ;AAAA,EACd,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,UAAU,WAAW,OAAO,QAAQ;AAC9C;;;AC1CA,SAAS,oBAAAE,yBAAwB;AACjC,SAAS,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAU1C,SAAS,qBACf,QACA,MACA,QAC8B;AAC9B,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA8B,CAAC,CAAC;AAClE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,UAAUF,aAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACH,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc,MAAM,MAAM;AAC1D,mBAAa,MAAM;AAAA,IACpB,SAAS,KAAK;AACb,YAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,eAAS,QAAQ;AAAA,IAClB,UAAE;AACD,mBAAa,KAAK;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,QAAQ,MAAM,MAAM,CAAC;AAEzB,QAAM,WAAWC;AAAA,IAChB,OAAO,cAAsB;AAC5B,eAAS,IAAI;AACb,UAAI;AACH,cAAM,EAAE,OAAO,IAAI,MAAM,OAAO,SAAS,MAAM,EAAE,UAAU,GAAG,MAAM;AACpE,cAAM,QAAQ;AACd,eAAO;AAAA,MACR,SAAS,KAAK;AACb,cAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAC/B;AAEA,EAAAE,WAAU,MAAM;AACf,SAAK,QAAQ;AAAA,EACd,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,WAAW,WAAW,OAAO,SAAS,SAAS;AACzD;;;ACzDA,SAAS,oBAAAE,yBAAwB;AACjC,SAAS,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAe1C,SAAS,aAAa,QAAiD;AAC7E,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA2B,CAAC,CAAC;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,UAAUF,aAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACH,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc;AAC9C,mBAAa,MAAM;AAAA,IACpB,SAAS,KAAK;AACb,YAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,eAAS,QAAQ;AAAA,IAClB,UAAE;AACD,mBAAa,KAAK;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAeC;AAAA,IACpB,OAAO,MAAc,OAA0B,WAA2B;AACzE,eAAS,IAAI;AACb,UAAI;AACH,cAAM,EAAE,OAAO,IAAI,MAAM,OAAO,YAAY,MAAM,OAAO,MAAM;AAC/D,cAAM,QAAQ;AACd,eAAO;AAAA,MACR,SAAS,KAAK;AACb,cAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,iBAAiBC;AAAA,IACtB,OAAO,MAAc,WAA2B;AAC/C,eAAS,IAAI;AACb,UAAI;AACH,cAAM,OAAO,eAAe,MAAM,MAAM;AACxC,cAAM,QAAQ;AAAA,MACf,SAAS,KAAK;AACb,cAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,OAAO;AAAA,EACjB;AAEA,EAAAE,WAAU,MAAM;AACf,SAAK,QAAQ;AAAA,EACd,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,WAAW,WAAW,OAAO,SAAS,cAAc,eAAe;AAC7E;;;ACtEA,SAAS,oBAAAE,yBAAwB;AACjC,SAAS,eAAAC,cAAa,YAAAC,iBAAgB;AAiB/B,SAAS,mBAAmB,QAAuD;AACzF,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAyC,IAAI;AAC3E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAkC,IAAI;AAEhE,QAAM,gBAAgBD;AAAA,IACrB,OAAO,MAAc,OAA8B,WAA2B;AAC7E,sBAAgB,IAAI;AACpB,eAAS,IAAI;AACb,UAAI;AACH,cAAM,EAAE,OAAO,IAAI,MAAM,OAAO,gBAAgB,MAAM,OAAO,MAAM;AACnE,mBAAW,MAAM;AACjB,eAAO;AAAA,MACR,SAAS,KAAK;AACb,cAAM,WACL,eAAeD,oBAAmB,MAAM,IAAIA,kBAAiB,WAAW,OAAO,GAAG,GAAG,CAAC;AACvF,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACP,UAAE;AACD,wBAAgB,KAAK;AAAA,MACtB;AAAA,IACD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AAEA,QAAM,eAAeC,aAAY,MAAM,WAAW,IAAI,GAAG,CAAC,CAAC;AAE3D,SAAO,EAAE,SAAS,cAAc,OAAO,eAAe,aAAa;AACpE;","names":["FonderieApiError","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useState","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useEffect","useState","FonderieApiError","useCallback","useState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fonderie/react-courier-admin",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "React hooks for the Fonderie courier admin API (email/SMS/push template management) — thin bindings over @fonderie/client's CourierAdminClient.",
5
5
  "keywords": [
6
6
  "fonderiejs",