@burdenoff/microfe-bigconsole 2026.924.3 → 2026.925.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/BigConsoleRoot.js +94 -84
- package/dist/bigconsole/BigConsoleRoot.js.map +1 -1
- package/dist/bigconsole/assistant/previewController.js +6 -6
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +142 -145
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +73 -61
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/embed/ReadOnlyDashboardRenderer.js +5 -5
- package/dist/bigconsole/components/embed/ReadOnlyDashboardRenderer.js.map +1 -1
- package/dist/bigconsole/components/embed/types.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +4 -4
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +5 -5
- package/dist/bigconsole/hooks/useDashboardEmbedPolicy.js +2 -4
- package/dist/bigconsole/hooks/useDashboardEmbedPolicy.js.map +1 -1
- package/dist/bigconsole/hooks/useDataSinkOperations.js +92 -89
- package/dist/bigconsole/hooks/useDataSinkOperations.js.map +1 -1
- package/dist/bigconsole/hooks/useImportDataSink.js +96 -91
- package/dist/bigconsole/hooks/useImportDataSink.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +79 -77
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +36 -35
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js.map +1 -1
- package/dist/bigconsole/utils/quota.js +51 -23
- package/dist/bigconsole/utils/quota.js.map +1 -1
- package/dist/generated/wspace-operations.js +0 -1
- package/dist/generated/wspace-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { useDataSinkStore as e } from "../store/dataSinkStore.js";
|
|
2
2
|
import { BatchCreateDataSinksDocument as t, BatchDeleteDataSinksDocument as n, CreateDataSinkDocument as r, DeleteDataSinkDocument as i, GetDataSinkDataDocument as a, GetDataSinkDocument as o, InvalidateDataSinkCacheDocument as s, ListDataSinksDocument as c, RefreshDataSinkDocument as l, UpdateDataSinkDocument as u } from "../../generated/wspace-operations.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { createBigConsoleQuotaError as d, isBigConsoleQuotaError as f } from "../utils/quota.js";
|
|
4
|
+
import { useCallback as p, useEffect as m, useMemo as h, useState as g } from "react";
|
|
5
|
+
import { useApolloClient as _ } from "@apollo/client/react";
|
|
5
6
|
//#region src/bigconsole/hooks/useDataSinkOperations.ts
|
|
6
|
-
function
|
|
7
|
+
function v(e) {
|
|
7
8
|
let t = e;
|
|
8
9
|
return {
|
|
9
10
|
id: t.id,
|
|
@@ -46,11 +47,11 @@ function g(e) {
|
|
|
46
47
|
deletedBy: t.deletedBy || null
|
|
47
48
|
};
|
|
48
49
|
}
|
|
49
|
-
function
|
|
50
|
-
let { workspaceId:
|
|
50
|
+
function y(y = {}) {
|
|
51
|
+
let { workspaceId: b, skipFetch: x = !1 } = y, [S, C] = g(!1), [w, T] = g(null), E = _(), D = e((e) => e.dataSinks), O = e((e) => e.setDataSinks), k = e((e) => e.addDataSink), A = e((e) => e.updateDataSink), j = e((e) => e.removeDataSink), M = e((e) => e.setDataSinkRefreshing), N = h(() => Array.from(D.values()), [D]), P = p(async (e) => {
|
|
51
52
|
try {
|
|
52
|
-
|
|
53
|
-
let t = ((await
|
|
53
|
+
C(!0), T(null), O([]);
|
|
54
|
+
let t = ((await E.query({
|
|
54
55
|
query: c,
|
|
55
56
|
variables: {
|
|
56
57
|
status: e?.status,
|
|
@@ -58,34 +59,34 @@ function _(_ = {}) {
|
|
|
58
59
|
search: e?.search
|
|
59
60
|
},
|
|
60
61
|
fetchPolicy: "network-only"
|
|
61
|
-
})).data?.listDataSinks?.edges || []).map((e) =>
|
|
62
|
-
return
|
|
62
|
+
})).data?.listDataSinks?.edges || []).map((e) => v(e.node));
|
|
63
|
+
return O(t), t;
|
|
63
64
|
} catch (e) {
|
|
64
|
-
return
|
|
65
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to fetch DataSinks")), O([]), [];
|
|
65
66
|
} finally {
|
|
66
|
-
|
|
67
|
+
C(!1);
|
|
67
68
|
}
|
|
68
|
-
}, [
|
|
69
|
+
}, [E, O]), F = p(async (e) => {
|
|
69
70
|
try {
|
|
70
|
-
|
|
71
|
-
let t = await
|
|
71
|
+
C(!0), T(null);
|
|
72
|
+
let t = await E.query({
|
|
72
73
|
query: o,
|
|
73
74
|
variables: { id: e },
|
|
74
75
|
fetchPolicy: "network-only"
|
|
75
76
|
});
|
|
76
77
|
if (t.data?.getDataSink) {
|
|
77
|
-
let e =
|
|
78
|
-
return
|
|
78
|
+
let e = v(t.data.getDataSink);
|
|
79
|
+
return k(e), e;
|
|
79
80
|
}
|
|
80
81
|
return null;
|
|
81
82
|
} catch (e) {
|
|
82
|
-
return
|
|
83
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to fetch DataSink")), null;
|
|
83
84
|
} finally {
|
|
84
|
-
|
|
85
|
+
C(!1);
|
|
85
86
|
}
|
|
86
|
-
}, [
|
|
87
|
+
}, [E, k]), I = p(async (e, t) => {
|
|
87
88
|
try {
|
|
88
|
-
return
|
|
89
|
+
return C(!0), T(null), (await E.query({
|
|
89
90
|
query: a,
|
|
90
91
|
variables: {
|
|
91
92
|
id: e.id,
|
|
@@ -99,79 +100,81 @@ function _(_ = {}) {
|
|
|
99
100
|
fetchPolicy: "network-only"
|
|
100
101
|
})).data?.getDataSinkData || null;
|
|
101
102
|
} catch (e) {
|
|
102
|
-
return
|
|
103
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to get DataSink data")), null;
|
|
103
104
|
} finally {
|
|
104
|
-
|
|
105
|
+
C(!1);
|
|
105
106
|
}
|
|
106
|
-
}, [
|
|
107
|
+
}, [E]), L = p(async (e) => {
|
|
107
108
|
try {
|
|
108
|
-
|
|
109
|
-
let t = await
|
|
109
|
+
C(!0), T(null);
|
|
110
|
+
let t = await E.mutate({
|
|
110
111
|
mutation: r,
|
|
111
112
|
variables: { input: e }
|
|
112
113
|
});
|
|
114
|
+
if (f(t)) throw d(t);
|
|
113
115
|
if (t.data?.createDataSink) {
|
|
114
|
-
let e =
|
|
115
|
-
return
|
|
116
|
+
let e = v(t.data.createDataSink);
|
|
117
|
+
return k(e), e;
|
|
116
118
|
}
|
|
117
119
|
return null;
|
|
118
120
|
} catch (e) {
|
|
119
|
-
|
|
121
|
+
if (f(e)) throw e;
|
|
122
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to create DataSink")), null;
|
|
120
123
|
} finally {
|
|
121
|
-
|
|
124
|
+
C(!1);
|
|
122
125
|
}
|
|
123
|
-
}, [
|
|
126
|
+
}, [E, k]), R = p(async (e) => {
|
|
124
127
|
try {
|
|
125
|
-
|
|
126
|
-
let t = await
|
|
128
|
+
C(!0), T(null);
|
|
129
|
+
let t = await E.mutate({
|
|
127
130
|
mutation: u,
|
|
128
131
|
variables: { input: e }
|
|
129
132
|
});
|
|
130
133
|
if (t.data?.updateDataSink) {
|
|
131
|
-
let e =
|
|
132
|
-
return
|
|
134
|
+
let e = v(t.data.updateDataSink);
|
|
135
|
+
return A(e.id, e), e;
|
|
133
136
|
}
|
|
134
137
|
return null;
|
|
135
138
|
} catch (e) {
|
|
136
|
-
return
|
|
139
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to update DataSink")), null;
|
|
137
140
|
} finally {
|
|
138
|
-
|
|
141
|
+
C(!1);
|
|
139
142
|
}
|
|
140
|
-
}, [
|
|
143
|
+
}, [E, A]), z = p(async (e) => {
|
|
141
144
|
try {
|
|
142
|
-
return
|
|
145
|
+
return C(!0), T(null), (await E.mutate({
|
|
143
146
|
mutation: i,
|
|
144
147
|
variables: { id: e }
|
|
145
|
-
})).data?.deleteDataSink ? (
|
|
148
|
+
})).data?.deleteDataSink ? (j(e), !0) : !1;
|
|
146
149
|
} catch (e) {
|
|
147
|
-
return
|
|
150
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to delete DataSink")), !1;
|
|
148
151
|
} finally {
|
|
149
|
-
|
|
152
|
+
C(!1);
|
|
150
153
|
}
|
|
151
|
-
}, [
|
|
154
|
+
}, [E, j]), B = p(async (e) => {
|
|
152
155
|
try {
|
|
153
|
-
|
|
154
|
-
let t = await
|
|
156
|
+
C(!0), T(null), e.id && M(e.id, !0);
|
|
157
|
+
let t = await E.mutate({
|
|
155
158
|
mutation: l,
|
|
156
159
|
variables: { input: e }
|
|
157
160
|
});
|
|
158
161
|
if (t.data?.refreshDataSink) {
|
|
159
|
-
let e =
|
|
160
|
-
return
|
|
162
|
+
let e = v(t.data.refreshDataSink);
|
|
163
|
+
return A(e.id, e), M(e.id, !1), e;
|
|
161
164
|
}
|
|
162
165
|
return null;
|
|
163
166
|
} catch (t) {
|
|
164
|
-
return
|
|
167
|
+
return T(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to refresh DataSink")), e.id && M(e.id, !1), null;
|
|
165
168
|
} finally {
|
|
166
|
-
|
|
169
|
+
C(!1);
|
|
167
170
|
}
|
|
168
171
|
}, [
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
]),
|
|
172
|
+
E,
|
|
173
|
+
A,
|
|
174
|
+
M
|
|
175
|
+
]), V = p(async (e) => {
|
|
173
176
|
try {
|
|
174
|
-
return
|
|
177
|
+
return C(!0), T(null), (await E.mutate({
|
|
175
178
|
mutation: s,
|
|
176
179
|
variables: { id: e }
|
|
177
180
|
})).data?.invalidateDataSinkCache || {
|
|
@@ -181,68 +184,68 @@ function _(_ = {}) {
|
|
|
181
184
|
};
|
|
182
185
|
} catch (e) {
|
|
183
186
|
let t = e instanceof Error ? e : /* @__PURE__ */ Error("Failed to invalidate cache");
|
|
184
|
-
return
|
|
187
|
+
return T(t), {
|
|
185
188
|
count: 0,
|
|
186
189
|
invalidatedIds: [],
|
|
187
190
|
success: !1,
|
|
188
191
|
message: t.message
|
|
189
192
|
};
|
|
190
193
|
} finally {
|
|
191
|
-
|
|
194
|
+
C(!1);
|
|
192
195
|
}
|
|
193
|
-
}, [
|
|
196
|
+
}, [E, b]), H = p(async (e) => {
|
|
194
197
|
try {
|
|
195
|
-
|
|
196
|
-
let n = await
|
|
198
|
+
C(!0), T(null);
|
|
199
|
+
let n = await E.mutate({
|
|
197
200
|
mutation: t,
|
|
198
201
|
variables: { inputs: e }
|
|
199
202
|
});
|
|
200
203
|
if (n.data?.batchCreateDataSinks) {
|
|
201
|
-
let e = n.data.batchCreateDataSinks.map(
|
|
202
|
-
return e.forEach(
|
|
204
|
+
let e = n.data.batchCreateDataSinks.map(v);
|
|
205
|
+
return e.forEach(k), e;
|
|
203
206
|
}
|
|
204
207
|
return [];
|
|
205
208
|
} catch (e) {
|
|
206
|
-
return
|
|
209
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to batch create DataSinks")), [];
|
|
207
210
|
} finally {
|
|
208
|
-
|
|
211
|
+
C(!1);
|
|
209
212
|
}
|
|
210
|
-
}, [
|
|
213
|
+
}, [E, k]), U = p(async (e) => {
|
|
211
214
|
try {
|
|
212
|
-
|
|
213
|
-
let t = await
|
|
215
|
+
C(!0), T(null);
|
|
216
|
+
let t = await E.mutate({
|
|
214
217
|
mutation: n,
|
|
215
218
|
variables: { ids: e }
|
|
216
219
|
});
|
|
217
|
-
return t.data?.batchDeleteDataSinks ? (e.forEach(
|
|
220
|
+
return t.data?.batchDeleteDataSinks ? (e.forEach(j), t.data.batchDeleteDataSinks) : [];
|
|
218
221
|
} catch (e) {
|
|
219
|
-
return
|
|
222
|
+
return T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to batch delete DataSinks")), [];
|
|
220
223
|
} finally {
|
|
221
|
-
|
|
224
|
+
C(!1);
|
|
222
225
|
}
|
|
223
|
-
}, [
|
|
224
|
-
await
|
|
225
|
-
}, [
|
|
226
|
-
return
|
|
227
|
-
|
|
228
|
-
}, [
|
|
229
|
-
loading:
|
|
230
|
-
error:
|
|
231
|
-
dataSinks:
|
|
232
|
-
fetchDataSinks:
|
|
233
|
-
fetchDataSink:
|
|
234
|
-
getDataSinkData:
|
|
235
|
-
createDataSink:
|
|
236
|
-
updateDataSink:
|
|
237
|
-
deleteDataSink:
|
|
238
|
-
refreshDataSink:
|
|
239
|
-
invalidateCache:
|
|
240
|
-
batchCreateDataSinks:
|
|
241
|
-
batchDeleteDataSinks:
|
|
242
|
-
refetch:
|
|
226
|
+
}, [E, j]), W = p(async () => {
|
|
227
|
+
await P();
|
|
228
|
+
}, [P]);
|
|
229
|
+
return m(() => {
|
|
230
|
+
x || P();
|
|
231
|
+
}, [x, P]), {
|
|
232
|
+
loading: S,
|
|
233
|
+
error: w,
|
|
234
|
+
dataSinks: N,
|
|
235
|
+
fetchDataSinks: P,
|
|
236
|
+
fetchDataSink: F,
|
|
237
|
+
getDataSinkData: I,
|
|
238
|
+
createDataSink: L,
|
|
239
|
+
updateDataSink: R,
|
|
240
|
+
deleteDataSink: z,
|
|
241
|
+
refreshDataSink: B,
|
|
242
|
+
invalidateCache: V,
|
|
243
|
+
batchCreateDataSinks: H,
|
|
244
|
+
batchDeleteDataSinks: U,
|
|
245
|
+
refetch: W
|
|
243
246
|
};
|
|
244
247
|
}
|
|
245
248
|
//#endregion
|
|
246
|
-
export {
|
|
249
|
+
export { y as default };
|
|
247
250
|
|
|
248
251
|
//# sourceMappingURL=useDataSinkOperations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataSinkOperations.js","names":[],"sources":["../../../src/bigconsole/hooks/useDataSinkOperations.ts"],"sourcesContent":["/**\n * DataSink Operations Hook\n *\n * Custom hook for DataSink CRUD operations with Apollo Client.\n * Integrates with the DataSink Zustand store for state management.\n */\n\nimport { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport { useDataSinkStore } from '../store/dataSinkStore';\nimport {\n ListDataSinksDocument,\n GetDataSinkDocument,\n GetDataSinkDataDocument,\n CreateDataSinkDocument,\n UpdateDataSinkDocument,\n DeleteDataSinkDocument,\n RefreshDataSinkDocument,\n InvalidateDataSinkCacheDocument,\n BatchCreateDataSinksDocument,\n BatchDeleteDataSinksDocument,\n} from '../../generated/wspace-operations';\nimport type { DataSink, DataSinkStatus, CreateDataSinkInput, UpdateDataSinkInput } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface UseDataSinkOperationsOptions {\n workspaceId?: string;\n skipFetch?: boolean;\n}\n\ninterface DataSinkFilters {\n status?: DataSinkStatus;\n isActive?: boolean;\n search?: string;\n}\n\ninterface RefreshDataSinkInput {\n id: string;\n forceRefresh?: boolean;\n}\n\ninterface InvalidateCacheResult {\n count: number;\n invalidatedIds: string[];\n success: boolean;\n message?: string;\n}\n\ninterface DataSinkDataResult {\n raw: unknown;\n extracted: unknown;\n cached: boolean;\n version: number;\n fetchedAt: string;\n // v3.0: pagination metadata (non-null totalCount only for array payloads).\n totalCount?: number | null;\n limit?: number | null;\n offset?: number | null;\n hasMore?: boolean | null;\n}\n\n// GraphQL Query/Mutation Result Types\ninterface ListDataSinksResult {\n listDataSinks?: {\n edges: Array<{ node: unknown }>;\n pageInfo?: { hasNextPage: boolean; endCursor?: string };\n };\n}\n\ninterface GetDataSinkResult {\n getDataSink?: unknown;\n}\n\ninterface GetDataSinkDataResult {\n getDataSinkData?: DataSinkDataResult;\n}\n\ninterface CreateDataSinkResult {\n createDataSink?: unknown;\n}\n\ninterface UpdateDataSinkResult {\n updateDataSink?: unknown;\n}\n\ninterface DeleteDataSinkResult {\n deleteDataSink?: boolean;\n}\n\ninterface RefreshDataSinkResult {\n refreshDataSink?: unknown;\n}\n\ninterface InvalidateDataSinkCacheResult {\n invalidateDataSinkCache?: InvalidateCacheResult;\n}\n\ninterface BatchCreateDataSinksResult {\n batchCreateDataSinks?: unknown[];\n}\n\ninterface BatchDeleteDataSinksResult {\n batchDeleteDataSinks?: Array<{ id: string; deletedAt: string }>;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Normalize GraphQL response to DataSink type\n */\nfunction normalizeDataSink(data: unknown): DataSink {\n const raw = data as Record<string, unknown>;\n return {\n id: raw.id as string,\n workspaceId: raw.workspaceId as string,\n tenantId: raw.tenantId as string,\n name: (raw.name as string) || null,\n description: (raw.description as string) || null,\n key: raw.key as string,\n fluidGridsWorkflowId: (raw.fluidGridsWorkflowId as string) || null,\n fluidGridsWorkflowExecutionId: (raw.fluidGridsWorkflowExecutionId as string) || null,\n config: (raw.config as Record<string, unknown>) || null,\n data: (raw.data as Record<string, unknown>) || {},\n dataStats: (raw.dataStats as DataSink['dataStats']) || null,\n lastRefreshedAt: (raw.lastRefreshedAt as string) || new Date().toISOString(),\n lastRefreshedBy: (raw.lastRefreshedBy as string) || null,\n expiresAt: (raw.expiresAt as string) || null,\n nextRefreshAt: (raw.nextRefreshAt as string) || null,\n ttl: (raw.ttl as number) ?? 0,\n version: (raw.version as number) ?? 1,\n sizeBytes: (raw.sizeBytes as number) ?? 0,\n isActive: (raw.isActive as boolean) ?? true,\n fieldMaskingEnabled: (raw.fieldMaskingEnabled as boolean) ?? false,\n fieldMaskingRules: (raw.fieldMaskingRules as Record<string, unknown>) || null,\n status: (raw.status as DataSink['status']) || 'ready',\n statusChangedAt: (raw.statusChangedAt as string) || null,\n statusChangedBy: (raw.statusChangedBy as string) || null,\n setupState: (raw.setupState as DataSink['setupState']) || 'not_started',\n refresh: (raw.refresh as DataSink['refresh']) || null,\n exports: (raw.exports as DataSink['exports']) || null,\n alerts: (raw.alerts as DataSink['alerts']) || null,\n quota: (raw.quota as DataSink['quota']) || null,\n workflowLinks: raw.workflowLinks as DataSink['workflowLinks'],\n linkedWorkflowCount: raw.linkedWorkflowCount as number | undefined,\n metadata: (raw.metadata as Record<string, unknown>) || null,\n createdAt: raw.createdAt as string,\n createdBy: (raw.createdBy as string) || '',\n updatedAt: raw.updatedAt as string,\n updatedBy: (raw.updatedBy as string) || '',\n deletedAt: (raw.deletedAt as string) || null,\n deletedBy: (raw.deletedBy as string) || null,\n };\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useDataSinkOperations(options: UseDataSinkOperationsOptions = {}) {\n const { workspaceId, skipFetch = false } = options;\n\n // Local state\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Apollo client\n const client = useApolloClient();\n\n // Store selectors and actions\n const dataSinksMap = useDataSinkStore((state) => state.dataSinks);\n const setDataSinks = useDataSinkStore((state) => state.setDataSinks);\n const addDataSink = useDataSinkStore((state) => state.addDataSink);\n const updateDataSinkInStore = useDataSinkStore((state) => state.updateDataSink);\n const removeDataSink = useDataSinkStore((state) => state.removeDataSink);\n const setDataSinkRefreshing = useDataSinkStore((state) => state.setDataSinkRefreshing);\n\n // Memoized array of datasinks\n const dataSinks = useMemo(() => Array.from(dataSinksMap.values()), [dataSinksMap]);\n\n // ============================================================================\n // OPERATIONS\n // ============================================================================\n\n /**\n * Fetch all datasinks with optional filters\n */\n const fetchDataSinks = useCallback(\n async (filters?: DataSinkFilters): Promise<DataSink[]> => {\n try {\n setLoading(true);\n setError(null);\n // Fail closed while the authoritative workspace list is refreshed.\n // A persisted Zustand snapshot may contain sinks deleted by another\n // tab, an API client, or an E2E harness; proposal pickers must never\n // bind to those stale records while this network request is pending.\n setDataSinks([]);\n\n const result = await client.query<ListDataSinksResult>({\n query: ListDataSinksDocument,\n variables: {\n status: filters?.status,\n isActive: filters?.isActive,\n search: filters?.search,\n },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listDataSinks?.edges || [];\n const normalized = edges.map((edge: { node: unknown }) => normalizeDataSink(edge.node));\n\n setDataSinks(normalized);\n return normalized;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch DataSinks');\n setError(error);\n // Do not retain a previously permitted resource set after an auth,\n // workspace-context, or network failure.\n setDataSinks([]);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, setDataSinks]\n );\n\n /**\n * Fetch a single datasink by ID\n */\n const fetchDataSink = useCallback(\n async (id: string): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.query<GetDataSinkResult>({\n query: GetDataSinkDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n if (result.data?.getDataSink) {\n const normalized = normalizeDataSink(result.data.getDataSink);\n addDataSink(normalized);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Get datasink data for preview\n */\n const getDataSinkData = useCallback(\n async (\n idOrKey: { id?: string; key?: string },\n options?: {\n dataPath?: string;\n forceRefresh?: boolean;\n // v3.0: server-side pagination + filter for array payloads.\n limit?: number;\n offset?: number;\n filter?: Array<{ field: string; op: string; value: unknown }>;\n }\n ): Promise<DataSinkDataResult | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.query<GetDataSinkDataResult>({\n query: GetDataSinkDataDocument,\n variables: {\n id: idOrKey.id,\n key: idOrKey.key,\n dataPath: options?.dataPath,\n forceRefresh: options?.forceRefresh,\n limit: options?.limit,\n offset: options?.offset,\n filter: options?.filter,\n },\n fetchPolicy: 'network-only',\n });\n\n return result.data?.getDataSinkData || null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get DataSink data');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n /**\n * Create a new datasink\n */\n const createDataSink = useCallback(\n async (input: CreateDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<CreateDataSinkResult>({\n mutation: CreateDataSinkDocument,\n variables: { input },\n });\n\n if (result.data?.createDataSink) {\n const normalized = normalizeDataSink(result.data.createDataSink);\n addDataSink(normalized);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Update an existing datasink\n */\n const updateDataSink = useCallback(\n async (input: UpdateDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<UpdateDataSinkResult>({\n mutation: UpdateDataSinkDocument,\n variables: { input },\n });\n\n if (result.data?.updateDataSink) {\n const normalized = normalizeDataSink(result.data.updateDataSink);\n updateDataSinkInStore(normalized.id, normalized);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, updateDataSinkInStore]\n );\n\n /**\n * Delete a datasink\n */\n const deleteDataSink = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<DeleteDataSinkResult>({\n mutation: DeleteDataSinkDocument,\n variables: { id },\n });\n\n if (result.data?.deleteDataSink) {\n removeDataSink(id);\n return true;\n }\n\n return false;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete DataSink');\n setError(error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [client, removeDataSink]\n );\n\n /**\n * Refresh a datasink's data\n */\n const refreshDataSink = useCallback(\n async (input: RefreshDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n if (input.id) {\n setDataSinkRefreshing(input.id, true);\n }\n\n const result = await client.mutate<RefreshDataSinkResult>({\n mutation: RefreshDataSinkDocument,\n variables: { input },\n });\n\n if (result.data?.refreshDataSink) {\n const normalized = normalizeDataSink(result.data.refreshDataSink);\n updateDataSinkInStore(normalized.id, normalized);\n setDataSinkRefreshing(normalized.id, false);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to refresh DataSink');\n setError(error);\n if (input.id) {\n setDataSinkRefreshing(input.id, false);\n }\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, updateDataSinkInStore, setDataSinkRefreshing]\n );\n\n /**\n * Invalidate datasink cache\n */\n const invalidateCache = useCallback(\n async (id?: string): Promise<InvalidateCacheResult> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<InvalidateDataSinkCacheResult>({\n mutation: InvalidateDataSinkCacheDocument,\n variables: {\n id,\n },\n });\n\n return (\n result.data?.invalidateDataSinkCache || {\n count: 0,\n invalidatedIds: [],\n success: false,\n }\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to invalidate cache');\n setError(error);\n return {\n count: 0,\n invalidatedIds: [],\n success: false,\n message: error.message,\n };\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId]\n );\n\n /**\n * Batch create datasinks\n */\n const batchCreateDataSinks = useCallback(\n async (inputs: CreateDataSinkInput[]): Promise<DataSink[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<BatchCreateDataSinksResult>({\n mutation: BatchCreateDataSinksDocument,\n variables: { inputs },\n });\n\n if (result.data?.batchCreateDataSinks) {\n const normalized = result.data.batchCreateDataSinks.map(normalizeDataSink);\n normalized.forEach(addDataSink);\n return normalized;\n }\n\n return [];\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to batch create DataSinks');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Batch delete datasinks\n */\n const batchDeleteDataSinks = useCallback(\n async (ids: string[]): Promise<{ id: string; deletedAt: string }[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<BatchDeleteDataSinksResult>({\n mutation: BatchDeleteDataSinksDocument,\n variables: { ids },\n });\n\n if (result.data?.batchDeleteDataSinks) {\n ids.forEach(removeDataSink);\n return result.data.batchDeleteDataSinks;\n }\n\n return [];\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to batch delete DataSinks');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, removeDataSink]\n );\n\n /**\n * Refetch all datasinks\n */\n const refetch = useCallback(async () => {\n await fetchDataSinks();\n }, [fetchDataSinks]);\n\n // Auto-fetch on mount if not skipped\n useEffect(() => {\n if (!skipFetch) {\n fetchDataSinks();\n }\n }, [skipFetch, fetchDataSinks]);\n\n return {\n loading,\n error,\n dataSinks,\n fetchDataSinks,\n fetchDataSink,\n getDataSinkData,\n createDataSink,\n updateDataSink,\n deleteDataSink,\n refreshDataSink,\n invalidateCache,\n batchCreateDataSinks,\n batchDeleteDataSinks,\n refetch,\n };\n}\n\nexport default useDataSinkOperations;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDataSinkOperations.js","names":[],"sources":["../../../src/bigconsole/hooks/useDataSinkOperations.ts"],"sourcesContent":["/**\n * DataSink Operations Hook\n *\n * Custom hook for DataSink CRUD operations with Apollo Client.\n * Integrates with the DataSink Zustand store for state management.\n */\n\nimport { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport { useDataSinkStore } from '../store/dataSinkStore';\nimport {\n ListDataSinksDocument,\n GetDataSinkDocument,\n GetDataSinkDataDocument,\n CreateDataSinkDocument,\n UpdateDataSinkDocument,\n DeleteDataSinkDocument,\n RefreshDataSinkDocument,\n InvalidateDataSinkCacheDocument,\n BatchCreateDataSinksDocument,\n BatchDeleteDataSinksDocument,\n} from '../../generated/wspace-operations';\nimport type { DataSink, DataSinkStatus, CreateDataSinkInput, UpdateDataSinkInput } from '../types';\nimport { createBigConsoleQuotaError, isBigConsoleQuotaError } from '../utils/quota';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface UseDataSinkOperationsOptions {\n workspaceId?: string;\n skipFetch?: boolean;\n}\n\ninterface DataSinkFilters {\n status?: DataSinkStatus;\n isActive?: boolean;\n search?: string;\n}\n\ninterface RefreshDataSinkInput {\n id: string;\n forceRefresh?: boolean;\n}\n\ninterface InvalidateCacheResult {\n count: number;\n invalidatedIds: string[];\n success: boolean;\n message?: string;\n}\n\ninterface DataSinkDataResult {\n raw: unknown;\n extracted: unknown;\n cached: boolean;\n version: number;\n fetchedAt: string;\n // v3.0: pagination metadata (non-null totalCount only for array payloads).\n totalCount?: number | null;\n limit?: number | null;\n offset?: number | null;\n hasMore?: boolean | null;\n}\n\n// GraphQL Query/Mutation Result Types\ninterface ListDataSinksResult {\n listDataSinks?: {\n edges: Array<{ node: unknown }>;\n pageInfo?: { hasNextPage: boolean; endCursor?: string };\n };\n}\n\ninterface GetDataSinkResult {\n getDataSink?: unknown;\n}\n\ninterface GetDataSinkDataResult {\n getDataSinkData?: DataSinkDataResult;\n}\n\ninterface CreateDataSinkResult {\n createDataSink?: unknown;\n}\n\ninterface UpdateDataSinkResult {\n updateDataSink?: unknown;\n}\n\ninterface DeleteDataSinkResult {\n deleteDataSink?: boolean;\n}\n\ninterface RefreshDataSinkResult {\n refreshDataSink?: unknown;\n}\n\ninterface InvalidateDataSinkCacheResult {\n invalidateDataSinkCache?: InvalidateCacheResult;\n}\n\ninterface BatchCreateDataSinksResult {\n batchCreateDataSinks?: unknown[];\n}\n\ninterface BatchDeleteDataSinksResult {\n batchDeleteDataSinks?: Array<{ id: string; deletedAt: string }>;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Normalize GraphQL response to DataSink type\n */\nfunction normalizeDataSink(data: unknown): DataSink {\n const raw = data as Record<string, unknown>;\n return {\n id: raw.id as string,\n workspaceId: raw.workspaceId as string,\n tenantId: raw.tenantId as string,\n name: (raw.name as string) || null,\n description: (raw.description as string) || null,\n key: raw.key as string,\n fluidGridsWorkflowId: (raw.fluidGridsWorkflowId as string) || null,\n fluidGridsWorkflowExecutionId: (raw.fluidGridsWorkflowExecutionId as string) || null,\n config: (raw.config as Record<string, unknown>) || null,\n data: (raw.data as Record<string, unknown>) || {},\n dataStats: (raw.dataStats as DataSink['dataStats']) || null,\n lastRefreshedAt: (raw.lastRefreshedAt as string) || new Date().toISOString(),\n lastRefreshedBy: (raw.lastRefreshedBy as string) || null,\n expiresAt: (raw.expiresAt as string) || null,\n nextRefreshAt: (raw.nextRefreshAt as string) || null,\n ttl: (raw.ttl as number) ?? 0,\n version: (raw.version as number) ?? 1,\n sizeBytes: (raw.sizeBytes as number) ?? 0,\n isActive: (raw.isActive as boolean) ?? true,\n fieldMaskingEnabled: (raw.fieldMaskingEnabled as boolean) ?? false,\n fieldMaskingRules: (raw.fieldMaskingRules as Record<string, unknown>) || null,\n status: (raw.status as DataSink['status']) || 'ready',\n statusChangedAt: (raw.statusChangedAt as string) || null,\n statusChangedBy: (raw.statusChangedBy as string) || null,\n setupState: (raw.setupState as DataSink['setupState']) || 'not_started',\n refresh: (raw.refresh as DataSink['refresh']) || null,\n exports: (raw.exports as DataSink['exports']) || null,\n alerts: (raw.alerts as DataSink['alerts']) || null,\n quota: (raw.quota as DataSink['quota']) || null,\n workflowLinks: raw.workflowLinks as DataSink['workflowLinks'],\n linkedWorkflowCount: raw.linkedWorkflowCount as number | undefined,\n metadata: (raw.metadata as Record<string, unknown>) || null,\n createdAt: raw.createdAt as string,\n createdBy: (raw.createdBy as string) || '',\n updatedAt: raw.updatedAt as string,\n updatedBy: (raw.updatedBy as string) || '',\n deletedAt: (raw.deletedAt as string) || null,\n deletedBy: (raw.deletedBy as string) || null,\n };\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useDataSinkOperations(options: UseDataSinkOperationsOptions = {}) {\n const { workspaceId, skipFetch = false } = options;\n\n // Local state\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Apollo client\n const client = useApolloClient();\n\n // Store selectors and actions\n const dataSinksMap = useDataSinkStore((state) => state.dataSinks);\n const setDataSinks = useDataSinkStore((state) => state.setDataSinks);\n const addDataSink = useDataSinkStore((state) => state.addDataSink);\n const updateDataSinkInStore = useDataSinkStore((state) => state.updateDataSink);\n const removeDataSink = useDataSinkStore((state) => state.removeDataSink);\n const setDataSinkRefreshing = useDataSinkStore((state) => state.setDataSinkRefreshing);\n\n // Memoized array of datasinks\n const dataSinks = useMemo(() => Array.from(dataSinksMap.values()), [dataSinksMap]);\n\n // ============================================================================\n // OPERATIONS\n // ============================================================================\n\n /**\n * Fetch all datasinks with optional filters\n */\n const fetchDataSinks = useCallback(\n async (filters?: DataSinkFilters): Promise<DataSink[]> => {\n try {\n setLoading(true);\n setError(null);\n // Fail closed while the authoritative workspace list is refreshed.\n // A persisted Zustand snapshot may contain sinks deleted by another\n // tab, an API client, or an E2E harness; proposal pickers must never\n // bind to those stale records while this network request is pending.\n setDataSinks([]);\n\n const result = await client.query<ListDataSinksResult>({\n query: ListDataSinksDocument,\n variables: {\n status: filters?.status,\n isActive: filters?.isActive,\n search: filters?.search,\n },\n fetchPolicy: 'network-only',\n });\n\n const edges = result.data?.listDataSinks?.edges || [];\n const normalized = edges.map((edge: { node: unknown }) => normalizeDataSink(edge.node));\n\n setDataSinks(normalized);\n return normalized;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch DataSinks');\n setError(error);\n // Do not retain a previously permitted resource set after an auth,\n // workspace-context, or network failure.\n setDataSinks([]);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, setDataSinks]\n );\n\n /**\n * Fetch a single datasink by ID\n */\n const fetchDataSink = useCallback(\n async (id: string): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.query<GetDataSinkResult>({\n query: GetDataSinkDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n if (result.data?.getDataSink) {\n const normalized = normalizeDataSink(result.data.getDataSink);\n addDataSink(normalized);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Get datasink data for preview\n */\n const getDataSinkData = useCallback(\n async (\n idOrKey: { id?: string; key?: string },\n options?: {\n dataPath?: string;\n forceRefresh?: boolean;\n // v3.0: server-side pagination + filter for array payloads.\n limit?: number;\n offset?: number;\n filter?: Array<{ field: string; op: string; value: unknown }>;\n }\n ): Promise<DataSinkDataResult | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.query<GetDataSinkDataResult>({\n query: GetDataSinkDataDocument,\n variables: {\n id: idOrKey.id,\n key: idOrKey.key,\n dataPath: options?.dataPath,\n forceRefresh: options?.forceRefresh,\n limit: options?.limit,\n offset: options?.offset,\n filter: options?.filter,\n },\n fetchPolicy: 'network-only',\n });\n\n return result.data?.getDataSinkData || null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get DataSink data');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n /**\n * Create a new datasink.\n *\n * Throws a `BigConsoleQuotaError` when the gateway refuses the create on a\n * quota (spent, or never provisioned because the org has no billing account\n * yet — BOFF-7913), so the caller can raise the billing dialog instead of a\n * generic \"Failed to create\" message. Other failures resolve to `null`.\n */\n const createDataSink = useCallback(\n async (input: CreateDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<CreateDataSinkResult>({\n mutation: CreateDataSinkDocument,\n variables: { input },\n });\n\n if (isBigConsoleQuotaError(result)) {\n throw createBigConsoleQuotaError(result);\n }\n\n if (result.data?.createDataSink) {\n const normalized = normalizeDataSink(result.data.createDataSink);\n addDataSink(normalized);\n return normalized;\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 create DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Update an existing datasink\n */\n const updateDataSink = useCallback(\n async (input: UpdateDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<UpdateDataSinkResult>({\n mutation: UpdateDataSinkDocument,\n variables: { input },\n });\n\n if (result.data?.updateDataSink) {\n const normalized = normalizeDataSink(result.data.updateDataSink);\n updateDataSinkInStore(normalized.id, normalized);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update DataSink');\n setError(error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, updateDataSinkInStore]\n );\n\n /**\n * Delete a datasink\n */\n const deleteDataSink = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<DeleteDataSinkResult>({\n mutation: DeleteDataSinkDocument,\n variables: { id },\n });\n\n if (result.data?.deleteDataSink) {\n removeDataSink(id);\n return true;\n }\n\n return false;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete DataSink');\n setError(error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [client, removeDataSink]\n );\n\n /**\n * Refresh a datasink's data\n */\n const refreshDataSink = useCallback(\n async (input: RefreshDataSinkInput): Promise<DataSink | null> => {\n try {\n setLoading(true);\n setError(null);\n\n if (input.id) {\n setDataSinkRefreshing(input.id, true);\n }\n\n const result = await client.mutate<RefreshDataSinkResult>({\n mutation: RefreshDataSinkDocument,\n variables: { input },\n });\n\n if (result.data?.refreshDataSink) {\n const normalized = normalizeDataSink(result.data.refreshDataSink);\n updateDataSinkInStore(normalized.id, normalized);\n setDataSinkRefreshing(normalized.id, false);\n return normalized;\n }\n\n return null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to refresh DataSink');\n setError(error);\n if (input.id) {\n setDataSinkRefreshing(input.id, false);\n }\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, updateDataSinkInStore, setDataSinkRefreshing]\n );\n\n /**\n * Invalidate datasink cache\n */\n const invalidateCache = useCallback(\n async (id?: string): Promise<InvalidateCacheResult> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<InvalidateDataSinkCacheResult>({\n mutation: InvalidateDataSinkCacheDocument,\n variables: {\n id,\n },\n });\n\n return (\n result.data?.invalidateDataSinkCache || {\n count: 0,\n invalidatedIds: [],\n success: false,\n }\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to invalidate cache');\n setError(error);\n return {\n count: 0,\n invalidatedIds: [],\n success: false,\n message: error.message,\n };\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId]\n );\n\n /**\n * Batch create datasinks\n */\n const batchCreateDataSinks = useCallback(\n async (inputs: CreateDataSinkInput[]): Promise<DataSink[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<BatchCreateDataSinksResult>({\n mutation: BatchCreateDataSinksDocument,\n variables: { inputs },\n });\n\n if (result.data?.batchCreateDataSinks) {\n const normalized = result.data.batchCreateDataSinks.map(normalizeDataSink);\n normalized.forEach(addDataSink);\n return normalized;\n }\n\n return [];\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to batch create DataSinks');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, addDataSink]\n );\n\n /**\n * Batch delete datasinks\n */\n const batchDeleteDataSinks = useCallback(\n async (ids: string[]): Promise<{ id: string; deletedAt: string }[]> => {\n try {\n setLoading(true);\n setError(null);\n\n const result = await client.mutate<BatchDeleteDataSinksResult>({\n mutation: BatchDeleteDataSinksDocument,\n variables: { ids },\n });\n\n if (result.data?.batchDeleteDataSinks) {\n ids.forEach(removeDataSink);\n return result.data.batchDeleteDataSinks;\n }\n\n return [];\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to batch delete DataSinks');\n setError(error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, removeDataSink]\n );\n\n /**\n * Refetch all datasinks\n */\n const refetch = useCallback(async () => {\n await fetchDataSinks();\n }, [fetchDataSinks]);\n\n // Auto-fetch on mount if not skipped\n useEffect(() => {\n if (!skipFetch) {\n fetchDataSinks();\n }\n }, [skipFetch, fetchDataSinks]);\n\n return {\n loading,\n error,\n dataSinks,\n fetchDataSinks,\n fetchDataSink,\n getDataSinkData,\n createDataSink,\n updateDataSink,\n deleteDataSink,\n refreshDataSink,\n invalidateCache,\n batchCreateDataSinks,\n batchDeleteDataSinks,\n refetch,\n };\n}\n\nexport default useDataSinkOperations;\n"],"mappings":"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"}
|