@burdenoff/microfe-bigconsole 2026.716.2 → 2026.716.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/BigConsoleRoot.js +100 -90
- package/dist/bigconsole/BigConsoleRoot.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +70 -60
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +187 -175
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
- package/dist/bigconsole/hooks/useDashboardOperations.js +72 -67
- package/dist/bigconsole/hooks/useDashboardOperations.js.map +1 -1
- package/dist/bigconsole/hooks/useDashboardTemplates.js +108 -105
- package/dist/bigconsole/hooks/useDashboardTemplates.js.map +1 -1
- package/dist/bigconsole/hooks/useDashboardViews.js +77 -74
- package/dist/bigconsole/hooks/useDashboardViews.js.map +1 -1
- package/dist/bigconsole/hooks/useImportDashboard.js +68 -64
- package/dist/bigconsole/hooks/useImportDashboard.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +240 -234
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +161 -143
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +70 -0
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js.map +1 -0
- package/dist/bigconsole/utils/quota.js +86 -0
- package/dist/bigconsole/utils/quota.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ArchiveTemplateDocument as e, CreateTemplateDocument as t, DeleteTemplateDocument as n, DeprecateTemplateDocument as r, GetTemplateDocument as i, InstantiateTemplateDocument as a, ListFeaturedTemplatesDocument as o, ListTemplatesDocument as s, PublishTemplateDocument as c, RateTemplateDocument as l, SearchTemplatesDocument as u, UpdateTemplateDocument as d } from "../../generated/wspace-operations.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createBigConsoleQuotaError as f, isBigConsoleQuotaError as p } from "../utils/quota.js";
|
|
3
|
+
import { useCallback as m, useState as h } from "react";
|
|
4
|
+
import { useApolloClient as g } from "@apollo/client/react";
|
|
4
5
|
//#region src/bigconsole/hooks/useDashboardTemplates.ts
|
|
5
|
-
function
|
|
6
|
+
function _(e) {
|
|
6
7
|
return {
|
|
7
8
|
id: e.id,
|
|
8
9
|
workspaceId: e.workspaceId,
|
|
@@ -32,7 +33,7 @@ function h(e) {
|
|
|
32
33
|
updatedAt: e.updatedAt || (/* @__PURE__ */ new Date()).toISOString()
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
|
-
function
|
|
36
|
+
function v(e) {
|
|
36
37
|
return {
|
|
37
38
|
id: e.id,
|
|
38
39
|
workspaceId: e.workspaceId,
|
|
@@ -53,8 +54,8 @@ function g(e) {
|
|
|
53
54
|
createdAt: e.createdAt || (/* @__PURE__ */ new Date()).toISOString()
|
|
54
55
|
};
|
|
55
56
|
}
|
|
56
|
-
function
|
|
57
|
-
let [
|
|
57
|
+
function y() {
|
|
58
|
+
let [y, b] = h([]), [x, S] = h([]), [C, w] = h(!1), [T, E] = h(null), D = g(), O = [
|
|
58
59
|
"ANALYTICS",
|
|
59
60
|
"OPERATIONS",
|
|
60
61
|
"SALES",
|
|
@@ -62,53 +63,53 @@ function _() {
|
|
|
62
63
|
"FINANCE",
|
|
63
64
|
"HR",
|
|
64
65
|
"CUSTOM"
|
|
65
|
-
],
|
|
66
|
+
], k = m(async (e) => {
|
|
66
67
|
try {
|
|
67
|
-
|
|
68
|
-
let t = ((await
|
|
68
|
+
w(!0), E(null);
|
|
69
|
+
let t = ((await D.query({
|
|
69
70
|
query: s,
|
|
70
71
|
variables: {
|
|
71
72
|
...e,
|
|
72
73
|
first: 100
|
|
73
74
|
},
|
|
74
75
|
fetchPolicy: "network-only"
|
|
75
|
-
})).data?.listTemplates?.edges || []).map((e) =>
|
|
76
|
-
return
|
|
76
|
+
})).data?.listTemplates?.edges || []).map((e) => v(e.node));
|
|
77
|
+
return b(t), t;
|
|
77
78
|
} catch (e) {
|
|
78
|
-
return
|
|
79
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to fetch templates")), [];
|
|
79
80
|
} finally {
|
|
80
|
-
|
|
81
|
+
w(!1);
|
|
81
82
|
}
|
|
82
|
-
}, [
|
|
83
|
+
}, [D]);
|
|
83
84
|
return {
|
|
84
|
-
templates:
|
|
85
|
-
featuredTemplates:
|
|
86
|
-
categories:
|
|
87
|
-
loading:
|
|
88
|
-
error:
|
|
89
|
-
fetchTemplates:
|
|
90
|
-
fetchFeaturedTemplates:
|
|
85
|
+
templates: y,
|
|
86
|
+
featuredTemplates: x,
|
|
87
|
+
categories: O,
|
|
88
|
+
loading: C,
|
|
89
|
+
error: T,
|
|
90
|
+
fetchTemplates: k,
|
|
91
|
+
fetchFeaturedTemplates: m(async (e) => {
|
|
91
92
|
try {
|
|
92
|
-
|
|
93
|
-
let t = ((await
|
|
93
|
+
w(!0), E(null);
|
|
94
|
+
let t = ((await D.query({
|
|
94
95
|
query: o,
|
|
95
96
|
variables: {
|
|
96
97
|
category: e,
|
|
97
98
|
first: 50
|
|
98
99
|
},
|
|
99
100
|
fetchPolicy: "network-only"
|
|
100
|
-
})).data?.listFeaturedTemplates?.edges || []).map((e) =>
|
|
101
|
-
return
|
|
101
|
+
})).data?.listFeaturedTemplates?.edges || []).map((e) => v(e.node));
|
|
102
|
+
return S(t), t;
|
|
102
103
|
} catch (e) {
|
|
103
|
-
return
|
|
104
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to fetch featured templates")), [];
|
|
104
105
|
} finally {
|
|
105
|
-
|
|
106
|
+
w(!1);
|
|
106
107
|
}
|
|
107
|
-
}, [
|
|
108
|
-
searchTemplates:
|
|
108
|
+
}, [D]),
|
|
109
|
+
searchTemplates: m(async (e, t, n) => {
|
|
109
110
|
try {
|
|
110
|
-
|
|
111
|
-
let r = ((await
|
|
111
|
+
w(!0), E(null);
|
|
112
|
+
let r = ((await D.query({
|
|
112
113
|
query: u,
|
|
113
114
|
variables: {
|
|
114
115
|
query: e,
|
|
@@ -117,104 +118,106 @@ function _() {
|
|
|
117
118
|
first: 50
|
|
118
119
|
},
|
|
119
120
|
fetchPolicy: "network-only"
|
|
120
|
-
})).data?.searchTemplates?.edges || []).map((e) =>
|
|
121
|
-
return
|
|
121
|
+
})).data?.searchTemplates?.edges || []).map((e) => v(e.node));
|
|
122
|
+
return b(r), r;
|
|
122
123
|
} catch (e) {
|
|
123
|
-
return
|
|
124
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to search templates")), [];
|
|
124
125
|
} finally {
|
|
125
|
-
|
|
126
|
+
w(!1);
|
|
126
127
|
}
|
|
127
|
-
}, [
|
|
128
|
-
getTemplate:
|
|
128
|
+
}, [D]),
|
|
129
|
+
getTemplate: m(async (e) => {
|
|
129
130
|
try {
|
|
130
|
-
|
|
131
|
-
let t = await
|
|
131
|
+
w(!0), E(null);
|
|
132
|
+
let t = await D.query({
|
|
132
133
|
query: i,
|
|
133
134
|
variables: { id: e },
|
|
134
135
|
fetchPolicy: "network-only"
|
|
135
136
|
});
|
|
136
|
-
return t.data?.getTemplate ?
|
|
137
|
+
return t.data?.getTemplate ? _(t.data.getTemplate) : null;
|
|
137
138
|
} catch (e) {
|
|
138
|
-
return
|
|
139
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to get template")), null;
|
|
139
140
|
} finally {
|
|
140
|
-
|
|
141
|
+
w(!1);
|
|
141
142
|
}
|
|
142
|
-
}, [
|
|
143
|
-
createTemplate:
|
|
143
|
+
}, [D]),
|
|
144
|
+
createTemplate: m(async (e) => {
|
|
144
145
|
try {
|
|
145
|
-
|
|
146
|
-
let n = await
|
|
146
|
+
w(!0), E(null);
|
|
147
|
+
let n = await D.mutate({
|
|
147
148
|
mutation: t,
|
|
148
149
|
variables: { input: e }
|
|
149
150
|
});
|
|
150
151
|
if (n.data?.createTemplate) {
|
|
151
|
-
let e =
|
|
152
|
-
return await
|
|
152
|
+
let e = _(n.data.createTemplate);
|
|
153
|
+
return await k(), e;
|
|
153
154
|
}
|
|
154
155
|
return null;
|
|
155
156
|
} catch (e) {
|
|
156
|
-
return
|
|
157
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to create template")), null;
|
|
157
158
|
} finally {
|
|
158
|
-
|
|
159
|
+
w(!1);
|
|
159
160
|
}
|
|
160
|
-
}, [
|
|
161
|
-
updateTemplate:
|
|
161
|
+
}, [D, k]),
|
|
162
|
+
updateTemplate: m(async (e) => {
|
|
162
163
|
try {
|
|
163
|
-
|
|
164
|
-
let t = await
|
|
164
|
+
w(!0), E(null);
|
|
165
|
+
let t = await D.mutate({
|
|
165
166
|
mutation: d,
|
|
166
167
|
variables: { input: e }
|
|
167
168
|
});
|
|
168
169
|
if (t.data?.updateTemplate) {
|
|
169
|
-
let e = t.data.updateTemplate, n =
|
|
170
|
-
return
|
|
170
|
+
let e = t.data.updateTemplate, n = _(e);
|
|
171
|
+
return b((t) => t.map((t) => t.id === n.id ? v(e) : t)), n;
|
|
171
172
|
}
|
|
172
173
|
return null;
|
|
173
174
|
} catch (e) {
|
|
174
|
-
return
|
|
175
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to update template")), null;
|
|
175
176
|
} finally {
|
|
176
|
-
|
|
177
|
+
w(!1);
|
|
177
178
|
}
|
|
178
|
-
}, [
|
|
179
|
-
deleteTemplate:
|
|
179
|
+
}, [D]),
|
|
180
|
+
deleteTemplate: m(async (e) => {
|
|
180
181
|
try {
|
|
181
|
-
return
|
|
182
|
+
return w(!0), E(null), (await D.mutate({
|
|
182
183
|
mutation: n,
|
|
183
184
|
variables: { id: e }
|
|
184
|
-
})).data?.deleteTemplate ? (
|
|
185
|
+
})).data?.deleteTemplate ? (b((t) => t.filter((t) => t.id !== e)), S((t) => t.filter((t) => t.id !== e)), !0) : !1;
|
|
185
186
|
} catch (e) {
|
|
186
|
-
return
|
|
187
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to delete template")), !1;
|
|
187
188
|
} finally {
|
|
188
|
-
|
|
189
|
+
w(!1);
|
|
189
190
|
}
|
|
190
|
-
}, [
|
|
191
|
-
instantiateTemplate:
|
|
191
|
+
}, [D]),
|
|
192
|
+
instantiateTemplate: m(async (e) => {
|
|
192
193
|
try {
|
|
193
|
-
|
|
194
|
-
let t = await
|
|
194
|
+
w(!0), E(null);
|
|
195
|
+
let t = await D.mutate({
|
|
195
196
|
mutation: a,
|
|
196
197
|
variables: { input: e }
|
|
197
198
|
});
|
|
198
|
-
|
|
199
|
+
if (p(t)) throw f(t);
|
|
200
|
+
return t.data?.instantiateTemplate ? (b((t) => t.map((t) => t.id === e.templateId ? {
|
|
199
201
|
...t,
|
|
200
202
|
usageCount: t.usageCount + 1
|
|
201
203
|
} : t)), t.data.instantiateTemplate) : null;
|
|
202
204
|
} catch (e) {
|
|
203
|
-
|
|
205
|
+
if (p(e)) throw e;
|
|
206
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to instantiate template")), null;
|
|
204
207
|
} finally {
|
|
205
|
-
|
|
208
|
+
w(!1);
|
|
206
209
|
}
|
|
207
|
-
}, [
|
|
208
|
-
rateTemplate:
|
|
210
|
+
}, [D]),
|
|
211
|
+
rateTemplate: m(async (e) => {
|
|
209
212
|
try {
|
|
210
|
-
|
|
211
|
-
let t = await
|
|
213
|
+
w(!0), E(null);
|
|
214
|
+
let t = await D.mutate({
|
|
212
215
|
mutation: l,
|
|
213
216
|
variables: { input: e }
|
|
214
217
|
});
|
|
215
218
|
if (t.data?.rateTemplate) {
|
|
216
|
-
let e =
|
|
217
|
-
return
|
|
219
|
+
let e = _(t.data.rateTemplate);
|
|
220
|
+
return b((t) => t.map((t) => t.id === e.id ? {
|
|
218
221
|
...t,
|
|
219
222
|
rating: e.rating,
|
|
220
223
|
ratingCount: e.ratingCount
|
|
@@ -222,77 +225,77 @@ function _() {
|
|
|
222
225
|
}
|
|
223
226
|
return null;
|
|
224
227
|
} catch (e) {
|
|
225
|
-
return
|
|
228
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to rate template")), null;
|
|
226
229
|
} finally {
|
|
227
|
-
|
|
230
|
+
w(!1);
|
|
228
231
|
}
|
|
229
|
-
}, [
|
|
230
|
-
publishTemplate:
|
|
232
|
+
}, [D]),
|
|
233
|
+
publishTemplate: m(async (e) => {
|
|
231
234
|
try {
|
|
232
|
-
|
|
233
|
-
let t = await
|
|
235
|
+
w(!0), E(null);
|
|
236
|
+
let t = await D.mutate({
|
|
234
237
|
mutation: c,
|
|
235
238
|
variables: { id: e }
|
|
236
239
|
});
|
|
237
240
|
if (t.data?.publishTemplate) {
|
|
238
|
-
let n =
|
|
239
|
-
return
|
|
241
|
+
let n = _(t.data.publishTemplate);
|
|
242
|
+
return b((t) => t.map((t) => t.id === e ? {
|
|
240
243
|
...t,
|
|
241
244
|
status: "ACTIVE"
|
|
242
245
|
} : t)), n;
|
|
243
246
|
}
|
|
244
247
|
return null;
|
|
245
248
|
} catch (e) {
|
|
246
|
-
return
|
|
249
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to publish template")), null;
|
|
247
250
|
} finally {
|
|
248
|
-
|
|
251
|
+
w(!1);
|
|
249
252
|
}
|
|
250
|
-
}, [
|
|
251
|
-
deprecateTemplate:
|
|
253
|
+
}, [D]),
|
|
254
|
+
deprecateTemplate: m(async (e) => {
|
|
252
255
|
try {
|
|
253
|
-
|
|
254
|
-
let t = await
|
|
256
|
+
w(!0), E(null);
|
|
257
|
+
let t = await D.mutate({
|
|
255
258
|
mutation: r,
|
|
256
259
|
variables: { id: e }
|
|
257
260
|
});
|
|
258
261
|
if (t.data?.deprecateTemplate) {
|
|
259
|
-
let n =
|
|
260
|
-
return
|
|
262
|
+
let n = _(t.data.deprecateTemplate);
|
|
263
|
+
return b((t) => t.map((t) => t.id === e ? {
|
|
261
264
|
...t,
|
|
262
265
|
status: "DEPRECATED"
|
|
263
266
|
} : t)), n;
|
|
264
267
|
}
|
|
265
268
|
return null;
|
|
266
269
|
} catch (e) {
|
|
267
|
-
return
|
|
270
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to deprecate template")), null;
|
|
268
271
|
} finally {
|
|
269
|
-
|
|
272
|
+
w(!1);
|
|
270
273
|
}
|
|
271
|
-
}, [
|
|
272
|
-
archiveTemplate:
|
|
274
|
+
}, [D]),
|
|
275
|
+
archiveTemplate: m(async (t) => {
|
|
273
276
|
try {
|
|
274
|
-
|
|
275
|
-
let n = await
|
|
277
|
+
w(!0), E(null);
|
|
278
|
+
let n = await D.mutate({
|
|
276
279
|
mutation: e,
|
|
277
280
|
variables: { id: t }
|
|
278
281
|
});
|
|
279
282
|
if (n.data?.archiveTemplate) {
|
|
280
|
-
let e =
|
|
281
|
-
return
|
|
283
|
+
let e = _(n.data.archiveTemplate);
|
|
284
|
+
return b((e) => e.map((e) => e.id === t ? {
|
|
282
285
|
...e,
|
|
283
286
|
status: "ARCHIVED"
|
|
284
287
|
} : e)), e;
|
|
285
288
|
}
|
|
286
289
|
return null;
|
|
287
290
|
} catch (e) {
|
|
288
|
-
return
|
|
291
|
+
return E(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to archive template")), null;
|
|
289
292
|
} finally {
|
|
290
|
-
|
|
293
|
+
w(!1);
|
|
291
294
|
}
|
|
292
|
-
}, [
|
|
295
|
+
}, [D])
|
|
293
296
|
};
|
|
294
297
|
}
|
|
295
298
|
//#endregion
|
|
296
|
-
export {
|
|
299
|
+
export { y as default };
|
|
297
300
|
|
|
298
301
|
//# sourceMappingURL=useDashboardTemplates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDashboardTemplates.js","names":[],"sources":["../../../src/bigconsole/hooks/useDashboardTemplates.ts"],"sourcesContent":["/**\n * useDashboardTemplates Hook\n *\n * Provides operations for managing dashboard templates.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport {\n GetTemplateDocument,\n ListTemplatesDocument,\n ListFeaturedTemplatesDocument,\n SearchTemplatesDocument,\n CreateTemplateDocument,\n UpdateTemplateDocument,\n DeleteTemplateDocument,\n InstantiateTemplateDocument,\n RateTemplateDocument,\n PublishTemplateDocument,\n DeprecateTemplateDocument,\n ArchiveTemplateDocument,\n} from '../../generated/wspace-operations';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DashboardCategory = 'ANALYTICS' | 'OPERATIONS' | 'SALES' | 'MARKETING' | 'FINANCE' | 'HR' | 'CUSTOM';\nexport type TemplateComplexity = 'BEGINNER' | 'INTERMEDIATE' | 'ADVANCED';\n/**\n * Template author type as per spec (03-graphql-contract.md)\n * Spec values: system, workspace, community\n */\nexport type TemplateAuthorType = 'SYSTEM' | 'WORKSPACE' | 'COMMUNITY';\nexport type TemplateStatus = 'DRAFT' | 'ACTIVE' | 'DEPRECATED' | 'ARCHIVED';\n\nexport interface DashboardTemplate {\n id: string;\n workspaceId?: string;\n tenantId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags: string[];\n definition: Record<string, unknown>;\n definitionVersion: string;\n placeholders: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType: TemplateAuthorType;\n isPublic: boolean;\n isActive: boolean;\n isFeatured: boolean;\n complexity: TemplateComplexity;\n usageCount: number;\n rating?: number;\n ratingCount: number;\n status: TemplateStatus;\n version: number;\n metadata?: Record<string, unknown>;\n createdAt: string;\n createdBy?: string;\n updatedAt: string;\n}\n\nexport interface DashboardTemplateListItem {\n id: string;\n workspaceId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags: string[];\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType: TemplateAuthorType;\n isPublic: boolean;\n isFeatured: boolean;\n complexity: TemplateComplexity;\n usageCount: number;\n rating?: number;\n ratingCount: number;\n status: TemplateStatus;\n createdAt: string;\n}\n\nexport interface CreateTemplateInput {\n workspaceId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags?: string[];\n definition: Record<string, unknown>;\n placeholders: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType?: TemplateAuthorType;\n isPublic?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateTemplateInput {\n id: string;\n name?: string;\n description?: string;\n category?: DashboardCategory;\n tags?: string[];\n definition?: Record<string, unknown>;\n placeholders?: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n isPublic?: boolean;\n isActive?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n status?: TemplateStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface InstantiateTemplateInput {\n templateId: string;\n name: string;\n description?: string;\n placeholderValues: Record<string, unknown>;\n visibility?: 'PRIVATE' | 'WORKSPACE' | 'PUBLIC';\n metadata?: Record<string, unknown>;\n}\n\nexport interface RateTemplateInput {\n templateId: string;\n rating: number; // 1-5\n}\n\nexport interface ListTemplatesFilters {\n category?: DashboardCategory;\n complexity?: TemplateComplexity;\n authorType?: TemplateAuthorType;\n isFeatured?: boolean;\n status?: TemplateStatus;\n search?: string;\n}\n\nexport interface UseDashboardTemplatesResult {\n templates: DashboardTemplateListItem[];\n featuredTemplates: DashboardTemplateListItem[];\n categories: DashboardCategory[];\n loading: boolean;\n error: Error | null;\n\n // Operations\n fetchTemplates: (filters?: ListTemplatesFilters) => Promise<DashboardTemplateListItem[]>;\n fetchFeaturedTemplates: (category?: DashboardCategory) => Promise<DashboardTemplateListItem[]>;\n searchTemplates: (\n query: string,\n category?: DashboardCategory,\n complexity?: TemplateComplexity\n ) => Promise<DashboardTemplateListItem[]>;\n getTemplate: (id: string) => Promise<DashboardTemplate | null>;\n createTemplate: (input: CreateTemplateInput) => Promise<DashboardTemplate | null>;\n updateTemplate: (input: UpdateTemplateInput) => Promise<DashboardTemplate | null>;\n deleteTemplate: (id: string) => Promise<boolean>;\n instantiateTemplate: (input: InstantiateTemplateInput) => Promise<unknown>;\n rateTemplate: (input: RateTemplateInput) => Promise<DashboardTemplate | null>;\n publishTemplate: (id: string) => Promise<DashboardTemplate | null>;\n deprecateTemplate: (id: string) => Promise<DashboardTemplate | null>;\n archiveTemplate: (id: string) => Promise<DashboardTemplate | null>;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface RawTemplateData {\n id: string;\n workspaceId?: string;\n tenantId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags?: string[];\n definition?: Record<string, unknown>;\n definitionVersion?: string;\n placeholders?: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType?: TemplateAuthorType;\n isPublic?: boolean;\n isActive?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n usageCount?: number;\n rating?: number;\n ratingCount?: number;\n status?: TemplateStatus;\n version?: number;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n createdBy?: string;\n updatedAt?: string;\n}\n\nfunction normalizeTemplate(data: RawTemplateData): DashboardTemplate {\n return {\n id: data.id,\n workspaceId: data.workspaceId,\n tenantId: data.tenantId,\n name: data.name,\n description: data.description,\n category: data.category,\n tags: data.tags || [],\n definition: data.definition || {},\n definitionVersion: data.definitionVersion || '1.0',\n placeholders: data.placeholders || {},\n thumbnailFileId: data.thumbnailFileId,\n previewUrl: data.previewUrl,\n authorType: data.authorType || 'WORKSPACE',\n isPublic: data.isPublic ?? false,\n isActive: data.isActive ?? true,\n isFeatured: data.isFeatured ?? false,\n complexity: data.complexity || 'BEGINNER',\n usageCount: data.usageCount || 0,\n rating: data.rating,\n ratingCount: data.ratingCount || 0,\n status: data.status || 'DRAFT',\n version: data.version || 1,\n metadata: data.metadata,\n createdAt: data.createdAt || new Date().toISOString(),\n createdBy: data.createdBy,\n updatedAt: data.updatedAt || new Date().toISOString(),\n };\n}\n\nfunction normalizeTemplateListItem(data: RawTemplateData): DashboardTemplateListItem {\n return {\n id: data.id,\n workspaceId: data.workspaceId,\n name: data.name,\n description: data.description,\n category: data.category,\n tags: data.tags || [],\n thumbnailFileId: data.thumbnailFileId,\n previewUrl: data.previewUrl,\n authorType: data.authorType || 'WORKSPACE',\n isPublic: data.isPublic ?? false,\n isFeatured: data.isFeatured ?? false,\n complexity: data.complexity || 'BEGINNER',\n usageCount: data.usageCount || 0,\n rating: data.rating,\n ratingCount: data.ratingCount || 0,\n status: data.status || 'DRAFT',\n createdAt: data.createdAt || new Date().toISOString(),\n };\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useDashboardTemplates(): UseDashboardTemplatesResult {\n const [templates, setTemplates] = useState<DashboardTemplateListItem[]>([]);\n const [featuredTemplates, setFeaturedTemplates] = useState<DashboardTemplateListItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apolloClient = useApolloClient();\n\n const categories: DashboardCategory[] = ['ANALYTICS', 'OPERATIONS', 'SALES', 'MARKETING', 'FINANCE', 'HR', 'CUSTOM'];\n\n // Fetch templates with filters\n const fetchTemplates = useCallback(\n async (filters?: ListTemplatesFilters): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ listTemplates?: { edges?: Array<{ node: RawTemplateData }> } }>({\n query: ListTemplatesDocument,\n variables: {\n ...filters,\n first: 100,\n },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Fetch featured templates\n const fetchFeaturedTemplates = useCallback(\n async (category?: DashboardCategory): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{\n listFeaturedTemplates?: { edges?: Array<{ node: RawTemplateData }> };\n }>({\n query: ListFeaturedTemplatesDocument,\n variables: { category, first: 50 },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listFeaturedTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setFeaturedTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch featured templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Search templates\n const searchTemplates = useCallback(\n async (\n query: string,\n category?: DashboardCategory,\n complexity?: TemplateComplexity\n ): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ searchTemplates?: { edges?: Array<{ node: RawTemplateData }> } }>({\n query: SearchTemplatesDocument,\n variables: { query, category, complexity, first: 50 },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.searchTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to search templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Get a specific template\n const getTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ getTemplate?: RawTemplateData }>({\n query: GetTemplateDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n if (result.data?.getTemplate) {\n return normalizeTemplate(result.data.getTemplate);\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Create a template\n const createTemplate = useCallback(\n async (input: CreateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ createTemplate?: RawTemplateData }>({\n mutation: CreateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.createTemplate) {\n const newTemplate = normalizeTemplate(result.data.createTemplate);\n // Refresh templates list\n await fetchTemplates();\n return newTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient, fetchTemplates]\n );\n\n // Update a template\n const updateTemplate = useCallback(\n async (input: UpdateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ updateTemplate?: RawTemplateData }>({\n mutation: UpdateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.updateTemplate) {\n const rawData = result.data.updateTemplate;\n const updatedTemplate = normalizeTemplate(rawData);\n setTemplates((prev) =>\n prev.map((t) => (t.id === updatedTemplate.id ? normalizeTemplateListItem(rawData) : t))\n );\n return updatedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Delete a template\n const deleteTemplate = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ deleteTemplate?: boolean }>({\n mutation: DeleteTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.deleteTemplate) {\n setTemplates((prev) => prev.filter((t) => t.id !== id));\n setFeaturedTemplates((prev) => prev.filter((t) => t.id !== id));\n return true;\n }\n\n return false;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete template');\n setError(error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Instantiate a template to create a dashboard\n const instantiateTemplate = useCallback(\n async (input: InstantiateTemplateInput): Promise<unknown> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ instantiateTemplate?: unknown }>({\n mutation: InstantiateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.instantiateTemplate) {\n // Update usage count locally\n setTemplates((prev) =>\n prev.map((t) => (t.id === input.templateId ? { ...t, usageCount: t.usageCount + 1 } : t))\n );\n return result.data.instantiateTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to instantiate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Rate a template\n const rateTemplate = useCallback(\n async (input: RateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ rateTemplate?: RawTemplateData }>({\n mutation: RateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.rateTemplate) {\n const ratedTemplate = normalizeTemplate(result.data.rateTemplate);\n setTemplates((prev) =>\n prev.map((t) =>\n t.id === ratedTemplate.id\n ? { ...t, rating: ratedTemplate.rating, ratingCount: ratedTemplate.ratingCount }\n : t\n )\n );\n return ratedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to rate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Publish a template\n const publishTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ publishTemplate?: RawTemplateData }>({\n mutation: PublishTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.publishTemplate) {\n const publishedTemplate = normalizeTemplate(result.data.publishTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'ACTIVE' as TemplateStatus } : t)));\n return publishedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to publish template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Deprecate a template\n const deprecateTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ deprecateTemplate?: RawTemplateData }>({\n mutation: DeprecateTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.deprecateTemplate) {\n const deprecatedTemplate = normalizeTemplate(result.data.deprecateTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'DEPRECATED' as TemplateStatus } : t)));\n return deprecatedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to deprecate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Archive a template\n const archiveTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ archiveTemplate?: RawTemplateData }>({\n mutation: ArchiveTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.archiveTemplate) {\n const archivedTemplate = normalizeTemplate(result.data.archiveTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'ARCHIVED' as TemplateStatus } : t)));\n return archivedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to archive template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n return {\n templates,\n featuredTemplates,\n categories,\n loading,\n error,\n fetchTemplates,\n fetchFeaturedTemplates,\n searchTemplates,\n getTemplate,\n createTemplate,\n updateTemplate,\n deleteTemplate,\n instantiateTemplate,\n rateTemplate,\n publishTemplate,\n deprecateTemplate,\n archiveTemplate,\n };\n}\n\nexport default useDashboardTemplates;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDashboardTemplates.js","names":[],"sources":["../../../src/bigconsole/hooks/useDashboardTemplates.ts"],"sourcesContent":["/**\n * useDashboardTemplates Hook\n *\n * Provides operations for managing dashboard templates.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport { createBigConsoleQuotaError, isBigConsoleQuotaError } from '../utils/quota';\nimport {\n GetTemplateDocument,\n ListTemplatesDocument,\n ListFeaturedTemplatesDocument,\n SearchTemplatesDocument,\n CreateTemplateDocument,\n UpdateTemplateDocument,\n DeleteTemplateDocument,\n InstantiateTemplateDocument,\n RateTemplateDocument,\n PublishTemplateDocument,\n DeprecateTemplateDocument,\n ArchiveTemplateDocument,\n} from '../../generated/wspace-operations';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DashboardCategory = 'ANALYTICS' | 'OPERATIONS' | 'SALES' | 'MARKETING' | 'FINANCE' | 'HR' | 'CUSTOM';\nexport type TemplateComplexity = 'BEGINNER' | 'INTERMEDIATE' | 'ADVANCED';\n/**\n * Template author type as per spec (03-graphql-contract.md)\n * Spec values: system, workspace, community\n */\nexport type TemplateAuthorType = 'SYSTEM' | 'WORKSPACE' | 'COMMUNITY';\nexport type TemplateStatus = 'DRAFT' | 'ACTIVE' | 'DEPRECATED' | 'ARCHIVED';\n\nexport interface DashboardTemplate {\n id: string;\n workspaceId?: string;\n tenantId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags: string[];\n definition: Record<string, unknown>;\n definitionVersion: string;\n placeholders: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType: TemplateAuthorType;\n isPublic: boolean;\n isActive: boolean;\n isFeatured: boolean;\n complexity: TemplateComplexity;\n usageCount: number;\n rating?: number;\n ratingCount: number;\n status: TemplateStatus;\n version: number;\n metadata?: Record<string, unknown>;\n createdAt: string;\n createdBy?: string;\n updatedAt: string;\n}\n\nexport interface DashboardTemplateListItem {\n id: string;\n workspaceId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags: string[];\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType: TemplateAuthorType;\n isPublic: boolean;\n isFeatured: boolean;\n complexity: TemplateComplexity;\n usageCount: number;\n rating?: number;\n ratingCount: number;\n status: TemplateStatus;\n createdAt: string;\n}\n\nexport interface CreateTemplateInput {\n workspaceId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags?: string[];\n definition: Record<string, unknown>;\n placeholders: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType?: TemplateAuthorType;\n isPublic?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateTemplateInput {\n id: string;\n name?: string;\n description?: string;\n category?: DashboardCategory;\n tags?: string[];\n definition?: Record<string, unknown>;\n placeholders?: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n isPublic?: boolean;\n isActive?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n status?: TemplateStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface InstantiateTemplateInput {\n templateId: string;\n name: string;\n description?: string;\n placeholderValues: Record<string, unknown>;\n visibility?: 'PRIVATE' | 'WORKSPACE' | 'PUBLIC';\n metadata?: Record<string, unknown>;\n}\n\nexport interface RateTemplateInput {\n templateId: string;\n rating: number; // 1-5\n}\n\nexport interface ListTemplatesFilters {\n category?: DashboardCategory;\n complexity?: TemplateComplexity;\n authorType?: TemplateAuthorType;\n isFeatured?: boolean;\n status?: TemplateStatus;\n search?: string;\n}\n\nexport interface UseDashboardTemplatesResult {\n templates: DashboardTemplateListItem[];\n featuredTemplates: DashboardTemplateListItem[];\n categories: DashboardCategory[];\n loading: boolean;\n error: Error | null;\n\n // Operations\n fetchTemplates: (filters?: ListTemplatesFilters) => Promise<DashboardTemplateListItem[]>;\n fetchFeaturedTemplates: (category?: DashboardCategory) => Promise<DashboardTemplateListItem[]>;\n searchTemplates: (\n query: string,\n category?: DashboardCategory,\n complexity?: TemplateComplexity\n ) => Promise<DashboardTemplateListItem[]>;\n getTemplate: (id: string) => Promise<DashboardTemplate | null>;\n createTemplate: (input: CreateTemplateInput) => Promise<DashboardTemplate | null>;\n updateTemplate: (input: UpdateTemplateInput) => Promise<DashboardTemplate | null>;\n deleteTemplate: (id: string) => Promise<boolean>;\n instantiateTemplate: (input: InstantiateTemplateInput) => Promise<unknown>;\n rateTemplate: (input: RateTemplateInput) => Promise<DashboardTemplate | null>;\n publishTemplate: (id: string) => Promise<DashboardTemplate | null>;\n deprecateTemplate: (id: string) => Promise<DashboardTemplate | null>;\n archiveTemplate: (id: string) => Promise<DashboardTemplate | null>;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface RawTemplateData {\n id: string;\n workspaceId?: string;\n tenantId?: string;\n name: string;\n description?: string;\n category: DashboardCategory;\n tags?: string[];\n definition?: Record<string, unknown>;\n definitionVersion?: string;\n placeholders?: Record<string, unknown>;\n thumbnailFileId?: string;\n previewUrl?: string;\n authorType?: TemplateAuthorType;\n isPublic?: boolean;\n isActive?: boolean;\n isFeatured?: boolean;\n complexity?: TemplateComplexity;\n usageCount?: number;\n rating?: number;\n ratingCount?: number;\n status?: TemplateStatus;\n version?: number;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n createdBy?: string;\n updatedAt?: string;\n}\n\nfunction normalizeTemplate(data: RawTemplateData): DashboardTemplate {\n return {\n id: data.id,\n workspaceId: data.workspaceId,\n tenantId: data.tenantId,\n name: data.name,\n description: data.description,\n category: data.category,\n tags: data.tags || [],\n definition: data.definition || {},\n definitionVersion: data.definitionVersion || '1.0',\n placeholders: data.placeholders || {},\n thumbnailFileId: data.thumbnailFileId,\n previewUrl: data.previewUrl,\n authorType: data.authorType || 'WORKSPACE',\n isPublic: data.isPublic ?? false,\n isActive: data.isActive ?? true,\n isFeatured: data.isFeatured ?? false,\n complexity: data.complexity || 'BEGINNER',\n usageCount: data.usageCount || 0,\n rating: data.rating,\n ratingCount: data.ratingCount || 0,\n status: data.status || 'DRAFT',\n version: data.version || 1,\n metadata: data.metadata,\n createdAt: data.createdAt || new Date().toISOString(),\n createdBy: data.createdBy,\n updatedAt: data.updatedAt || new Date().toISOString(),\n };\n}\n\nfunction normalizeTemplateListItem(data: RawTemplateData): DashboardTemplateListItem {\n return {\n id: data.id,\n workspaceId: data.workspaceId,\n name: data.name,\n description: data.description,\n category: data.category,\n tags: data.tags || [],\n thumbnailFileId: data.thumbnailFileId,\n previewUrl: data.previewUrl,\n authorType: data.authorType || 'WORKSPACE',\n isPublic: data.isPublic ?? false,\n isFeatured: data.isFeatured ?? false,\n complexity: data.complexity || 'BEGINNER',\n usageCount: data.usageCount || 0,\n rating: data.rating,\n ratingCount: data.ratingCount || 0,\n status: data.status || 'DRAFT',\n createdAt: data.createdAt || new Date().toISOString(),\n };\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useDashboardTemplates(): UseDashboardTemplatesResult {\n const [templates, setTemplates] = useState<DashboardTemplateListItem[]>([]);\n const [featuredTemplates, setFeaturedTemplates] = useState<DashboardTemplateListItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apolloClient = useApolloClient();\n\n const categories: DashboardCategory[] = ['ANALYTICS', 'OPERATIONS', 'SALES', 'MARKETING', 'FINANCE', 'HR', 'CUSTOM'];\n\n // Fetch templates with filters\n const fetchTemplates = useCallback(\n async (filters?: ListTemplatesFilters): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ listTemplates?: { edges?: Array<{ node: RawTemplateData }> } }>({\n query: ListTemplatesDocument,\n variables: {\n ...filters,\n first: 100,\n },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Fetch featured templates\n const fetchFeaturedTemplates = useCallback(\n async (category?: DashboardCategory): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{\n listFeaturedTemplates?: { edges?: Array<{ node: RawTemplateData }> };\n }>({\n query: ListFeaturedTemplatesDocument,\n variables: { category, first: 50 },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listFeaturedTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setFeaturedTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch featured templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Search templates\n const searchTemplates = useCallback(\n async (\n query: string,\n category?: DashboardCategory,\n complexity?: TemplateComplexity\n ): Promise<DashboardTemplateListItem[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ searchTemplates?: { edges?: Array<{ node: RawTemplateData }> } }>({\n query: SearchTemplatesDocument,\n variables: { query, category, complexity, first: 50 },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.searchTemplates?.edges || [];\n const normalizedTemplates = edges.map((edge) => normalizeTemplateListItem(edge.node));\n setTemplates(normalizedTemplates);\n return normalizedTemplates;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to search templates');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Get a specific template\n const getTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.query<{ getTemplate?: RawTemplateData }>({\n query: GetTemplateDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n if (result.data?.getTemplate) {\n return normalizeTemplate(result.data.getTemplate);\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Create a template\n const createTemplate = useCallback(\n async (input: CreateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ createTemplate?: RawTemplateData }>({\n mutation: CreateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.createTemplate) {\n const newTemplate = normalizeTemplate(result.data.createTemplate);\n // Refresh templates list\n await fetchTemplates();\n return newTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient, fetchTemplates]\n );\n\n // Update a template\n const updateTemplate = useCallback(\n async (input: UpdateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ updateTemplate?: RawTemplateData }>({\n mutation: UpdateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.updateTemplate) {\n const rawData = result.data.updateTemplate;\n const updatedTemplate = normalizeTemplate(rawData);\n setTemplates((prev) =>\n prev.map((t) => (t.id === updatedTemplate.id ? normalizeTemplateListItem(rawData) : t))\n );\n return updatedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Delete a template\n const deleteTemplate = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ deleteTemplate?: boolean }>({\n mutation: DeleteTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.deleteTemplate) {\n setTemplates((prev) => prev.filter((t) => t.id !== id));\n setFeaturedTemplates((prev) => prev.filter((t) => t.id !== id));\n return true;\n }\n\n return false;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete template');\n setError(error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Instantiate a template to create a dashboard\n const instantiateTemplate = useCallback(\n async (input: InstantiateTemplateInput): Promise<unknown> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ instantiateTemplate?: unknown }>({\n mutation: InstantiateTemplateDocument,\n variables: { input },\n });\n\n if (isBigConsoleQuotaError(result)) {\n throw createBigConsoleQuotaError(result);\n }\n\n if (result.data?.instantiateTemplate) {\n // Update usage count locally\n setTemplates((prev) =>\n prev.map((t) => (t.id === input.templateId ? { ...t, usageCount: t.usageCount + 1 } : t))\n );\n return result.data.instantiateTemplate;\n }\n\n return null;\n } catch (err) {\n if (isBigConsoleQuotaError(err)) {\n throw err;\n }\n const error = err instanceof Error ? err : new Error('Failed to instantiate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Rate a template\n const rateTemplate = useCallback(\n async (input: RateTemplateInput): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ rateTemplate?: RawTemplateData }>({\n mutation: RateTemplateDocument,\n variables: { input },\n });\n\n if (result.data?.rateTemplate) {\n const ratedTemplate = normalizeTemplate(result.data.rateTemplate);\n setTemplates((prev) =>\n prev.map((t) =>\n t.id === ratedTemplate.id\n ? { ...t, rating: ratedTemplate.rating, ratingCount: ratedTemplate.ratingCount }\n : t\n )\n );\n return ratedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to rate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Publish a template\n const publishTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ publishTemplate?: RawTemplateData }>({\n mutation: PublishTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.publishTemplate) {\n const publishedTemplate = normalizeTemplate(result.data.publishTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'ACTIVE' as TemplateStatus } : t)));\n return publishedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to publish template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Deprecate a template\n const deprecateTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ deprecateTemplate?: RawTemplateData }>({\n mutation: DeprecateTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.deprecateTemplate) {\n const deprecatedTemplate = normalizeTemplate(result.data.deprecateTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'DEPRECATED' as TemplateStatus } : t)));\n return deprecatedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to deprecate template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n // Archive a template\n const archiveTemplate = useCallback(\n async (id: string): Promise<DashboardTemplate | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await apolloClient.mutate<{ archiveTemplate?: RawTemplateData }>({\n mutation: ArchiveTemplateDocument,\n variables: { id },\n });\n\n if (result.data?.archiveTemplate) {\n const archivedTemplate = normalizeTemplate(result.data.archiveTemplate);\n setTemplates((prev) => prev.map((t) => (t.id === id ? { ...t, status: 'ARCHIVED' as TemplateStatus } : t)));\n return archivedTemplate;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to archive template');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [apolloClient]\n );\n\n return {\n templates,\n featuredTemplates,\n categories,\n loading,\n error,\n fetchTemplates,\n fetchFeaturedTemplates,\n searchTemplates,\n getTemplate,\n createTemplate,\n updateTemplate,\n deleteTemplate,\n instantiateTemplate,\n rateTemplate,\n publishTemplate,\n deprecateTemplate,\n archiveTemplate,\n };\n}\n\nexport default useDashboardTemplates;\n"],"mappings":"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"}
|