@objectstack/client-react 1.0.4 → 1.0.5
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/.turbo/turbo-build.log +22 -0
- package/CHANGELOG.md +15 -0
- package/dist/index.d.mts +416 -0
- package/dist/index.d.ts +412 -11
- package/dist/index.js +505 -32
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +458 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +6 -6
- package/src/data-hooks.tsx +1 -1
- package/tsconfig.json +2 -1
- package/dist/context.d.ts +0 -45
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -86
- package/dist/data-hooks.d.ts +0 -246
- package/dist/data-hooks.d.ts.map +0 -1
- package/dist/data-hooks.js +0 -398
- package/dist/index.d.ts.map +0 -1
- package/dist/metadata-hooks.d.ts +0 -121
- package/dist/metadata-hooks.d.ts.map +0 -1
- package/dist/metadata-hooks.js +0 -243
package/dist/index.js
CHANGED
|
@@ -1,33 +1,506 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.tsx
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
ObjectStackClient: () => import_client.ObjectStackClient,
|
|
34
|
+
ObjectStackContext: () => ObjectStackContext,
|
|
35
|
+
ObjectStackProvider: () => ObjectStackProvider,
|
|
36
|
+
useClient: () => useClient,
|
|
37
|
+
useFields: () => useFields,
|
|
38
|
+
useInfiniteQuery: () => useInfiniteQuery,
|
|
39
|
+
useMetadata: () => useMetadata,
|
|
40
|
+
useMutation: () => useMutation,
|
|
41
|
+
useObject: () => useObject,
|
|
42
|
+
usePagination: () => usePagination,
|
|
43
|
+
useQuery: () => useQuery,
|
|
44
|
+
useView: () => useView
|
|
45
|
+
});
|
|
46
|
+
module.exports = __toCommonJS(index_exports);
|
|
47
|
+
|
|
48
|
+
// src/context.tsx
|
|
49
|
+
var React = __toESM(require("react"));
|
|
50
|
+
var import_react = require("react");
|
|
51
|
+
var ObjectStackContext = (0, import_react.createContext)(null);
|
|
52
|
+
function ObjectStackProvider({ client, children }) {
|
|
53
|
+
return /* @__PURE__ */ React.createElement(ObjectStackContext.Provider, { value: client }, children);
|
|
54
|
+
}
|
|
55
|
+
function useClient() {
|
|
56
|
+
const client = (0, import_react.useContext)(ObjectStackContext);
|
|
57
|
+
if (!client) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
"useClient must be used within an ObjectStackProvider. Make sure your component is wrapped with <ObjectStackProvider client={...}>."
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return client;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/data-hooks.tsx
|
|
66
|
+
var import_react2 = require("react");
|
|
67
|
+
function useQuery(object, options = {}) {
|
|
68
|
+
const client = useClient();
|
|
69
|
+
const [data, setData] = (0, import_react2.useState)(null);
|
|
70
|
+
const [isLoading, setIsLoading] = (0, import_react2.useState)(true);
|
|
71
|
+
const [isRefetching, setIsRefetching] = (0, import_react2.useState)(false);
|
|
72
|
+
const [error, setError] = (0, import_react2.useState)(null);
|
|
73
|
+
const intervalRef = (0, import_react2.useRef)(void 0);
|
|
74
|
+
const {
|
|
75
|
+
query,
|
|
76
|
+
select,
|
|
77
|
+
filters,
|
|
78
|
+
sort,
|
|
79
|
+
top,
|
|
80
|
+
skip,
|
|
81
|
+
enabled = true,
|
|
82
|
+
refetchInterval,
|
|
83
|
+
onSuccess,
|
|
84
|
+
onError
|
|
85
|
+
} = options;
|
|
86
|
+
const fetchData = (0, import_react2.useCallback)(async (isRefetch = false) => {
|
|
87
|
+
if (!enabled) return;
|
|
88
|
+
try {
|
|
89
|
+
if (isRefetch) {
|
|
90
|
+
setIsRefetching(true);
|
|
91
|
+
} else {
|
|
92
|
+
setIsLoading(true);
|
|
93
|
+
}
|
|
94
|
+
setError(null);
|
|
95
|
+
let result;
|
|
96
|
+
if (query) {
|
|
97
|
+
result = await client.data.query(object, query);
|
|
98
|
+
} else {
|
|
99
|
+
result = await client.data.find(object, {
|
|
100
|
+
select,
|
|
101
|
+
filters,
|
|
102
|
+
sort,
|
|
103
|
+
top,
|
|
104
|
+
skip
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
setData(result);
|
|
108
|
+
onSuccess?.(result);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
const error2 = err instanceof Error ? err : new Error("Query failed");
|
|
111
|
+
setError(error2);
|
|
112
|
+
onError?.(error2);
|
|
113
|
+
} finally {
|
|
114
|
+
setIsLoading(false);
|
|
115
|
+
setIsRefetching(false);
|
|
116
|
+
}
|
|
117
|
+
}, [client, object, query, select, filters, sort, top, skip, enabled, onSuccess, onError]);
|
|
118
|
+
(0, import_react2.useEffect)(() => {
|
|
119
|
+
fetchData();
|
|
120
|
+
}, [fetchData]);
|
|
121
|
+
(0, import_react2.useEffect)(() => {
|
|
122
|
+
if (refetchInterval && enabled) {
|
|
123
|
+
intervalRef.current = setInterval(() => {
|
|
124
|
+
fetchData(true);
|
|
125
|
+
}, refetchInterval);
|
|
126
|
+
return () => {
|
|
127
|
+
if (intervalRef.current) {
|
|
128
|
+
clearInterval(intervalRef.current);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return void 0;
|
|
133
|
+
}, [refetchInterval, enabled, fetchData]);
|
|
134
|
+
const refetch = (0, import_react2.useCallback)(async () => {
|
|
135
|
+
await fetchData(true);
|
|
136
|
+
}, [fetchData]);
|
|
137
|
+
return {
|
|
138
|
+
data,
|
|
139
|
+
isLoading,
|
|
140
|
+
error,
|
|
141
|
+
refetch,
|
|
142
|
+
isRefetching
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function useMutation(object, operation, options = {}) {
|
|
146
|
+
const client = useClient();
|
|
147
|
+
const [data, setData] = (0, import_react2.useState)(null);
|
|
148
|
+
const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
|
|
149
|
+
const [error, setError] = (0, import_react2.useState)(null);
|
|
150
|
+
const { onSuccess, onError, onSettled } = options;
|
|
151
|
+
const mutateAsync = (0, import_react2.useCallback)(async (variables) => {
|
|
152
|
+
setIsLoading(true);
|
|
153
|
+
setError(null);
|
|
154
|
+
try {
|
|
155
|
+
let result;
|
|
156
|
+
switch (operation) {
|
|
157
|
+
case "create":
|
|
158
|
+
result = await client.data.create(object, variables);
|
|
159
|
+
break;
|
|
160
|
+
case "update":
|
|
161
|
+
const updateVars = variables;
|
|
162
|
+
result = await client.data.update(object, updateVars.id, updateVars.data);
|
|
163
|
+
break;
|
|
164
|
+
case "delete":
|
|
165
|
+
const deleteVars = variables;
|
|
166
|
+
result = await client.data.delete(object, deleteVars.id);
|
|
167
|
+
break;
|
|
168
|
+
case "createMany":
|
|
169
|
+
result = await client.data.createMany(object, variables);
|
|
170
|
+
break;
|
|
171
|
+
case "updateMany":
|
|
172
|
+
const updateManyVars = variables;
|
|
173
|
+
result = await client.data.updateMany(object, updateManyVars.records, updateManyVars.options);
|
|
174
|
+
break;
|
|
175
|
+
case "deleteMany":
|
|
176
|
+
const deleteManyVars = variables;
|
|
177
|
+
result = await client.data.deleteMany(object, deleteManyVars.ids, deleteManyVars.options);
|
|
178
|
+
break;
|
|
179
|
+
default:
|
|
180
|
+
throw new Error(`Unknown operation: ${operation}`);
|
|
181
|
+
}
|
|
182
|
+
setData(result);
|
|
183
|
+
onSuccess?.(result, variables);
|
|
184
|
+
onSettled?.(result, null, variables);
|
|
185
|
+
return result;
|
|
186
|
+
} catch (err) {
|
|
187
|
+
const error2 = err instanceof Error ? err : new Error("Mutation failed");
|
|
188
|
+
setError(error2);
|
|
189
|
+
onError?.(error2, variables);
|
|
190
|
+
onSettled?.(void 0, error2, variables);
|
|
191
|
+
throw error2;
|
|
192
|
+
} finally {
|
|
193
|
+
setIsLoading(false);
|
|
194
|
+
}
|
|
195
|
+
}, [client, object, operation, onSuccess, onError, onSettled]);
|
|
196
|
+
const mutate = (0, import_react2.useCallback)((variables) => {
|
|
197
|
+
return mutateAsync(variables).catch(() => {
|
|
198
|
+
return null;
|
|
199
|
+
});
|
|
200
|
+
}, [mutateAsync]);
|
|
201
|
+
const reset = (0, import_react2.useCallback)(() => {
|
|
202
|
+
setData(null);
|
|
203
|
+
setError(null);
|
|
204
|
+
setIsLoading(false);
|
|
205
|
+
}, []);
|
|
206
|
+
return {
|
|
207
|
+
mutate,
|
|
208
|
+
mutateAsync,
|
|
209
|
+
data,
|
|
210
|
+
isLoading,
|
|
211
|
+
error,
|
|
212
|
+
reset
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function usePagination(object, options = {}) {
|
|
216
|
+
const { pageSize = 20, initialPage = 1, ...queryOptions } = options;
|
|
217
|
+
const [page, setPage] = (0, import_react2.useState)(initialPage);
|
|
218
|
+
const queryResult = useQuery(object, {
|
|
219
|
+
...queryOptions,
|
|
220
|
+
top: pageSize,
|
|
221
|
+
skip: (page - 1) * pageSize
|
|
222
|
+
});
|
|
223
|
+
const totalCount = queryResult.data?.count || 0;
|
|
224
|
+
const totalPages = Math.ceil(totalCount / pageSize);
|
|
225
|
+
const hasNextPage = page < totalPages;
|
|
226
|
+
const hasPreviousPage = page > 1;
|
|
227
|
+
const nextPage = (0, import_react2.useCallback)(() => {
|
|
228
|
+
if (hasNextPage) {
|
|
229
|
+
setPage((p) => p + 1);
|
|
230
|
+
}
|
|
231
|
+
}, [hasNextPage]);
|
|
232
|
+
const previousPage = (0, import_react2.useCallback)(() => {
|
|
233
|
+
if (hasPreviousPage) {
|
|
234
|
+
setPage((p) => p - 1);
|
|
235
|
+
}
|
|
236
|
+
}, [hasPreviousPage]);
|
|
237
|
+
const goToPage = (0, import_react2.useCallback)((newPage) => {
|
|
238
|
+
const clampedPage = Math.max(1, Math.min(newPage, totalPages));
|
|
239
|
+
setPage(clampedPage);
|
|
240
|
+
}, [totalPages]);
|
|
241
|
+
return {
|
|
242
|
+
...queryResult,
|
|
243
|
+
page,
|
|
244
|
+
totalPages,
|
|
245
|
+
totalCount,
|
|
246
|
+
nextPage,
|
|
247
|
+
previousPage,
|
|
248
|
+
goToPage,
|
|
249
|
+
hasNextPage,
|
|
250
|
+
hasPreviousPage
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function useInfiniteQuery(object, options = {}) {
|
|
254
|
+
const client = useClient();
|
|
255
|
+
const {
|
|
256
|
+
pageSize = 20,
|
|
257
|
+
// getNextPageParam is reserved for future use
|
|
258
|
+
query,
|
|
259
|
+
select,
|
|
260
|
+
filters,
|
|
261
|
+
sort,
|
|
262
|
+
enabled = true,
|
|
263
|
+
onSuccess,
|
|
264
|
+
onError
|
|
265
|
+
} = options;
|
|
266
|
+
const [pages, setPages] = (0, import_react2.useState)([]);
|
|
267
|
+
const [isLoading, setIsLoading] = (0, import_react2.useState)(true);
|
|
268
|
+
const [isFetchingNextPage, setIsFetchingNextPage] = (0, import_react2.useState)(false);
|
|
269
|
+
const [error, setError] = (0, import_react2.useState)(null);
|
|
270
|
+
const [hasNextPage, setHasNextPage] = (0, import_react2.useState)(true);
|
|
271
|
+
const fetchPage = (0, import_react2.useCallback)(async (skip, isNextPage = false) => {
|
|
272
|
+
try {
|
|
273
|
+
if (isNextPage) {
|
|
274
|
+
setIsFetchingNextPage(true);
|
|
275
|
+
} else {
|
|
276
|
+
setIsLoading(true);
|
|
277
|
+
}
|
|
278
|
+
setError(null);
|
|
279
|
+
let result;
|
|
280
|
+
if (query) {
|
|
281
|
+
result = await client.data.query(object, {
|
|
282
|
+
...query,
|
|
283
|
+
limit: pageSize,
|
|
284
|
+
offset: skip
|
|
285
|
+
});
|
|
286
|
+
} else {
|
|
287
|
+
result = await client.data.find(object, {
|
|
288
|
+
select,
|
|
289
|
+
filters,
|
|
290
|
+
sort,
|
|
291
|
+
top: pageSize,
|
|
292
|
+
skip
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
if (isNextPage) {
|
|
296
|
+
setPages((prev) => [...prev, result]);
|
|
297
|
+
} else {
|
|
298
|
+
setPages([result]);
|
|
299
|
+
}
|
|
300
|
+
const fetchedCount = result.value.length;
|
|
301
|
+
const hasMore = fetchedCount === pageSize;
|
|
302
|
+
setHasNextPage(hasMore);
|
|
303
|
+
onSuccess?.(result);
|
|
304
|
+
} catch (err) {
|
|
305
|
+
const error2 = err instanceof Error ? err : new Error("Query failed");
|
|
306
|
+
setError(error2);
|
|
307
|
+
onError?.(error2);
|
|
308
|
+
} finally {
|
|
309
|
+
setIsLoading(false);
|
|
310
|
+
setIsFetchingNextPage(false);
|
|
311
|
+
}
|
|
312
|
+
}, [client, object, query, select, filters, sort, pageSize, onSuccess, onError]);
|
|
313
|
+
(0, import_react2.useEffect)(() => {
|
|
314
|
+
if (enabled) {
|
|
315
|
+
fetchPage(0);
|
|
316
|
+
}
|
|
317
|
+
}, [enabled, fetchPage]);
|
|
318
|
+
const fetchNextPage = (0, import_react2.useCallback)(async () => {
|
|
319
|
+
if (!hasNextPage || isFetchingNextPage) return;
|
|
320
|
+
const nextSkip = pages.length * pageSize;
|
|
321
|
+
await fetchPage(nextSkip, true);
|
|
322
|
+
}, [hasNextPage, isFetchingNextPage, pages.length, pageSize, fetchPage]);
|
|
323
|
+
const refetch = (0, import_react2.useCallback)(async () => {
|
|
324
|
+
setPages([]);
|
|
325
|
+
await fetchPage(0);
|
|
326
|
+
}, [fetchPage]);
|
|
327
|
+
const flatData = pages.flatMap((page) => page.value);
|
|
328
|
+
return {
|
|
329
|
+
data: pages,
|
|
330
|
+
flatData,
|
|
331
|
+
isLoading,
|
|
332
|
+
error,
|
|
333
|
+
fetchNextPage,
|
|
334
|
+
hasNextPage,
|
|
335
|
+
isFetchingNextPage,
|
|
336
|
+
refetch
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// src/metadata-hooks.tsx
|
|
341
|
+
var import_react3 = require("react");
|
|
342
|
+
function useObject(objectName, options = {}) {
|
|
343
|
+
const client = useClient();
|
|
344
|
+
const [data, setData] = (0, import_react3.useState)(null);
|
|
345
|
+
const [isLoading, setIsLoading] = (0, import_react3.useState)(true);
|
|
346
|
+
const [error, setError] = (0, import_react3.useState)(null);
|
|
347
|
+
const [etag, setEtag] = (0, import_react3.useState)();
|
|
348
|
+
const [fromCache, setFromCache] = (0, import_react3.useState)(false);
|
|
349
|
+
const {
|
|
350
|
+
enabled = true,
|
|
351
|
+
useCache = true,
|
|
352
|
+
ifNoneMatch,
|
|
353
|
+
ifModifiedSince,
|
|
354
|
+
onSuccess,
|
|
355
|
+
onError
|
|
356
|
+
} = options;
|
|
357
|
+
const fetchMetadata = (0, import_react3.useCallback)(async () => {
|
|
358
|
+
if (!enabled) return;
|
|
359
|
+
try {
|
|
360
|
+
setIsLoading(true);
|
|
361
|
+
setError(null);
|
|
362
|
+
setFromCache(false);
|
|
363
|
+
if (useCache) {
|
|
364
|
+
const result = await client.meta.getCached(objectName, {
|
|
365
|
+
ifNoneMatch: ifNoneMatch || etag,
|
|
366
|
+
ifModifiedSince
|
|
367
|
+
});
|
|
368
|
+
if (result.notModified) {
|
|
369
|
+
setFromCache(true);
|
|
370
|
+
} else {
|
|
371
|
+
setData(result.data);
|
|
372
|
+
if (result.etag) {
|
|
373
|
+
setEtag(result.etag.value);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
onSuccess?.(result.data || data);
|
|
377
|
+
} else {
|
|
378
|
+
const result = await client.meta.getObject(objectName);
|
|
379
|
+
setData(result);
|
|
380
|
+
onSuccess?.(result);
|
|
381
|
+
}
|
|
382
|
+
} catch (err) {
|
|
383
|
+
const error2 = err instanceof Error ? err : new Error("Failed to fetch object metadata");
|
|
384
|
+
setError(error2);
|
|
385
|
+
onError?.(error2);
|
|
386
|
+
} finally {
|
|
387
|
+
setIsLoading(false);
|
|
388
|
+
}
|
|
389
|
+
}, [client, objectName, enabled, useCache, ifNoneMatch, ifModifiedSince, etag, data, onSuccess, onError]);
|
|
390
|
+
(0, import_react3.useEffect)(() => {
|
|
391
|
+
fetchMetadata();
|
|
392
|
+
}, [fetchMetadata]);
|
|
393
|
+
const refetch = (0, import_react3.useCallback)(async () => {
|
|
394
|
+
await fetchMetadata();
|
|
395
|
+
}, [fetchMetadata]);
|
|
396
|
+
return {
|
|
397
|
+
data,
|
|
398
|
+
isLoading,
|
|
399
|
+
error,
|
|
400
|
+
refetch,
|
|
401
|
+
etag,
|
|
402
|
+
fromCache
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function useView(objectName, viewType = "list", options = {}) {
|
|
406
|
+
const client = useClient();
|
|
407
|
+
const [data, setData] = (0, import_react3.useState)(null);
|
|
408
|
+
const [isLoading, setIsLoading] = (0, import_react3.useState)(true);
|
|
409
|
+
const [error, setError] = (0, import_react3.useState)(null);
|
|
410
|
+
const { enabled = true, onSuccess, onError } = options;
|
|
411
|
+
const fetchView = (0, import_react3.useCallback)(async () => {
|
|
412
|
+
if (!enabled) return;
|
|
413
|
+
try {
|
|
414
|
+
setIsLoading(true);
|
|
415
|
+
setError(null);
|
|
416
|
+
const result = await client.meta.getView(objectName, viewType);
|
|
417
|
+
setData(result);
|
|
418
|
+
onSuccess?.(result);
|
|
419
|
+
} catch (err) {
|
|
420
|
+
const error2 = err instanceof Error ? err : new Error("Failed to fetch view configuration");
|
|
421
|
+
setError(error2);
|
|
422
|
+
onError?.(error2);
|
|
423
|
+
} finally {
|
|
424
|
+
setIsLoading(false);
|
|
425
|
+
}
|
|
426
|
+
}, [client, objectName, viewType, enabled, onSuccess, onError]);
|
|
427
|
+
(0, import_react3.useEffect)(() => {
|
|
428
|
+
fetchView();
|
|
429
|
+
}, [fetchView]);
|
|
430
|
+
const refetch = (0, import_react3.useCallback)(async () => {
|
|
431
|
+
await fetchView();
|
|
432
|
+
}, [fetchView]);
|
|
433
|
+
return {
|
|
434
|
+
data,
|
|
435
|
+
isLoading,
|
|
436
|
+
error,
|
|
437
|
+
refetch,
|
|
438
|
+
fromCache: false
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
function useFields(objectName, options = {}) {
|
|
442
|
+
const objectResult = useObject(objectName, options);
|
|
443
|
+
const fields = objectResult.data?.fields ? Object.entries(objectResult.data.fields).map(([name, field]) => ({
|
|
444
|
+
name,
|
|
445
|
+
...field
|
|
446
|
+
})) : null;
|
|
447
|
+
return {
|
|
448
|
+
...objectResult,
|
|
449
|
+
data: fields
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
function useMetadata(fetcher, options = {}) {
|
|
453
|
+
const client = useClient();
|
|
454
|
+
const [data, setData] = (0, import_react3.useState)(null);
|
|
455
|
+
const [isLoading, setIsLoading] = (0, import_react3.useState)(true);
|
|
456
|
+
const [error, setError] = (0, import_react3.useState)(null);
|
|
457
|
+
const { enabled = true, onSuccess, onError } = options;
|
|
458
|
+
const fetchMetadata = (0, import_react3.useCallback)(async () => {
|
|
459
|
+
if (!enabled) return;
|
|
460
|
+
try {
|
|
461
|
+
setIsLoading(true);
|
|
462
|
+
setError(null);
|
|
463
|
+
const result = await fetcher(client);
|
|
464
|
+
setData(result);
|
|
465
|
+
onSuccess?.(result);
|
|
466
|
+
} catch (err) {
|
|
467
|
+
const error2 = err instanceof Error ? err : new Error("Failed to fetch metadata");
|
|
468
|
+
setError(error2);
|
|
469
|
+
onError?.(error2);
|
|
470
|
+
} finally {
|
|
471
|
+
setIsLoading(false);
|
|
472
|
+
}
|
|
473
|
+
}, [client, fetcher, enabled, onSuccess, onError]);
|
|
474
|
+
(0, import_react3.useEffect)(() => {
|
|
475
|
+
fetchMetadata();
|
|
476
|
+
}, [fetchMetadata]);
|
|
477
|
+
const refetch = (0, import_react3.useCallback)(async () => {
|
|
478
|
+
await fetchMetadata();
|
|
479
|
+
}, [fetchMetadata]);
|
|
480
|
+
return {
|
|
481
|
+
data,
|
|
482
|
+
isLoading,
|
|
483
|
+
error,
|
|
484
|
+
refetch,
|
|
485
|
+
fromCache: false
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// src/index.tsx
|
|
490
|
+
var import_client = require("@objectstack/client");
|
|
491
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
492
|
+
0 && (module.exports = {
|
|
493
|
+
ObjectStackClient,
|
|
494
|
+
ObjectStackContext,
|
|
495
|
+
ObjectStackProvider,
|
|
496
|
+
useClient,
|
|
497
|
+
useFields,
|
|
498
|
+
useInfiniteQuery,
|
|
499
|
+
useMetadata,
|
|
500
|
+
useMutation,
|
|
501
|
+
useObject,
|
|
502
|
+
usePagination,
|
|
503
|
+
useQuery,
|
|
504
|
+
useView
|
|
505
|
+
});
|
|
506
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/context.tsx","../src/data-hooks.tsx","../src/metadata-hooks.tsx"],"sourcesContent":["/**\n * @objectstack/client-react\n * \n * React hooks for ObjectStack Client SDK\n * \n * Provides type-safe React hooks for:\n * - Data queries (useQuery, useMutation, usePagination, useInfiniteQuery)\n * - Metadata access (useObject, useView, useFields, useMetadata)\n * - Client context (ObjectStackProvider, useClient)\n */\n\n// Context & Provider\nexport {\n ObjectStackProvider,\n ObjectStackContext,\n useClient,\n type ObjectStackProviderProps\n} from './context';\n\n// Data Hooks\nexport {\n useQuery,\n useMutation,\n usePagination,\n useInfiniteQuery,\n type UseQueryOptions,\n type UseQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n type UsePaginationOptions,\n type UsePaginationResult,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryResult\n} from './data-hooks';\n\n// Metadata Hooks\nexport {\n useObject,\n useView,\n useFields,\n useMetadata,\n type UseMetadataOptions,\n type UseMetadataResult\n} from './metadata-hooks';\n\n// Re-export ObjectStackClient and types from @objectstack/client\nexport { ObjectStackClient, type ClientConfig } from '@objectstack/client';\n","/**\n * ObjectStack React Context\n * \n * Provides ObjectStackClient instance to React components via Context API\n */\n\nimport * as React from 'react';\nimport { createContext, useContext, ReactNode } from 'react';\nimport { ObjectStackClient } from '@objectstack/client';\n\nexport interface ObjectStackProviderProps {\n client: ObjectStackClient;\n children: ReactNode;\n}\n\nexport const ObjectStackContext = createContext<ObjectStackClient | null>(null);\n\n/**\n * Provider component that makes ObjectStackClient available to all child components\n * \n * @example\n * ```tsx\n * const client = new ObjectStackClient({ baseUrl: 'http://localhost:3000' });\n * \n * function App() {\n * return (\n * <ObjectStackProvider client={client}>\n * <YourComponents />\n * </ObjectStackProvider>\n * );\n * }\n * ```\n */\nexport function ObjectStackProvider({ client, children }: ObjectStackProviderProps) {\n return (\n <ObjectStackContext.Provider value={client}>\n {children}\n </ObjectStackContext.Provider>\n );\n}\n\n/**\n * Hook to access the ObjectStackClient instance from context\n * \n * @throws Error if used outside of ObjectStackProvider\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const client = useClient();\n * // Use client.data.find(), etc.\n * }\n * ```\n */\nexport function useClient(): ObjectStackClient {\n const client = useContext(ObjectStackContext);\n \n if (!client) {\n throw new Error(\n 'useClient must be used within an ObjectStackProvider. ' +\n 'Make sure your component is wrapped with <ObjectStackProvider client={...}>.'\n );\n }\n \n return client;\n}\n","/**\n * Data Query Hooks\n * \n * React hooks for querying and mutating ObjectStack data\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { QueryAST, FilterCondition } from '@objectstack/spec/data';\nimport { PaginatedResult } from '@objectstack/client';\nimport { useClient } from './context';\n\n/**\n * Query options for useQuery hook\n */\nexport interface UseQueryOptions<T = any> {\n /** Query AST or simplified query options */\n query?: Partial<QueryAST>;\n /** Simple field selection */\n select?: string[];\n /** Simple filters */\n filters?: FilterCondition;\n /** Sort configuration */\n sort?: string | string[];\n /** Limit results */\n top?: number;\n /** Skip results (for pagination) */\n skip?: number;\n /** Enable/disable automatic query execution */\n enabled?: boolean;\n /** Refetch interval in milliseconds */\n refetchInterval?: number;\n /** Callback on successful query */\n onSuccess?: (data: PaginatedResult<T>) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Query result for useQuery hook\n */\nexport interface UseQueryResult<T = any> {\n /** Query result data */\n data: PaginatedResult<T> | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch the query */\n refetch: () => Promise<void>;\n /** Is currently refetching */\n isRefetching: boolean;\n}\n\n/**\n * Hook for querying ObjectStack data with automatic caching and refetching\n * \n * @example\n * ```tsx\n * function TaskList() {\n * const { data, isLoading, error, refetch } = useQuery('todo_task', {\n * select: ['id', 'subject', 'priority'],\n * sort: ['-created_at'],\n * top: 20\n * });\n * \n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * \n * return (\n * <div>\n * {data?.value.map(task => (\n * <div key={task.id}>{task.subject}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuery<T = any>(\n object: string,\n options: UseQueryOptions<T> = {}\n): UseQueryResult<T> {\n const client = useClient();\n const [data, setData] = useState<PaginatedResult<T> | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isRefetching, setIsRefetching] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const intervalRef = useRef<NodeJS.Timeout | undefined>(undefined);\n \n const {\n query,\n select,\n filters,\n sort,\n top,\n skip,\n enabled = true,\n refetchInterval,\n onSuccess,\n onError\n } = options;\n\n const fetchData = useCallback(async (isRefetch = false) => {\n if (!enabled) return;\n \n try {\n if (isRefetch) {\n setIsRefetching(true);\n } else {\n setIsLoading(true);\n }\n setError(null);\n\n let result: PaginatedResult<T>;\n \n if (query) {\n // Use advanced query API\n result = await client.data.query<T>(object, query);\n } else {\n // Use simplified find API\n result = await client.data.find<T>(object, {\n select,\n filters: filters as any,\n sort,\n top,\n skip\n });\n }\n\n setData(result);\n onSuccess?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Query failed');\n setError(error);\n onError?.(error);\n } finally {\n setIsLoading(false);\n setIsRefetching(false);\n }\n }, [client, object, query, select, filters, sort, top, skip, enabled, onSuccess, onError]);\n\n // Initial fetch and dependency-based refetch\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n // Setup refetch interval\n useEffect(() => {\n if (refetchInterval && enabled) {\n intervalRef.current = setInterval(() => {\n fetchData(true);\n }, refetchInterval);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }\n return undefined;\n }, [refetchInterval, enabled, fetchData]);\n\n const refetch = useCallback(async () => {\n await fetchData(true);\n }, [fetchData]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n isRefetching\n };\n}\n\n/**\n * Mutation options for useMutation hook\n */\nexport interface UseMutationOptions<TData = any, TVariables = any> {\n /** Callback on successful mutation */\n onSuccess?: (data: TData, variables: TVariables) => void;\n /** Callback on error */\n onError?: (error: Error, variables: TVariables) => void;\n /** Callback when mutation is settled (success or error) */\n onSettled?: (data: TData | undefined, error: Error | null, variables: TVariables) => void;\n}\n\n/**\n * Mutation result for useMutation hook\n */\nexport interface UseMutationResult<TData = any, TVariables = any> {\n /** Execute the mutation */\n mutate: (variables: TVariables) => Promise<TData>;\n /** Async version of mutate that throws errors */\n mutateAsync: (variables: TVariables) => Promise<TData>;\n /** Mutation result data */\n data: TData | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n}\n\n/**\n * Hook for creating, updating, or deleting ObjectStack data\n * \n * @example\n * ```tsx\n * function CreateTaskForm() {\n * const { mutate, isLoading, error } = useMutation('todo_task', 'create', {\n * onSuccess: (data) => {\n * console.log('Task created:', data);\n * }\n * });\n * \n * const handleSubmit = (formData) => {\n * mutate(formData);\n * };\n * \n * return <form onSubmit={handleSubmit}>...</form>;\n * }\n * ```\n */\nexport function useMutation<TData = any, TVariables = any>(\n object: string,\n operation: 'create' | 'update' | 'delete' | 'createMany' | 'updateMany' | 'deleteMany',\n options: UseMutationOptions<TData, TVariables> = {}\n): UseMutationResult<TData, TVariables> {\n const client = useClient();\n const [data, setData] = useState<TData | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const { onSuccess, onError, onSettled } = options;\n\n const mutateAsync = useCallback(async (variables: TVariables): Promise<TData> => {\n setIsLoading(true);\n setError(null);\n\n try {\n let result: TData;\n\n switch (operation) {\n case 'create':\n result = await client.data.create<TData>(object, variables as any);\n break;\n case 'update':\n // Expect variables to be { id: string, data: Partial<T> }\n const updateVars = variables as any;\n result = await client.data.update<TData>(object, updateVars.id, updateVars.data);\n break;\n case 'delete':\n // Expect variables to be { id: string }\n const deleteVars = variables as any;\n result = await client.data.delete(object, deleteVars.id) as any;\n break;\n case 'createMany':\n // createMany returns an array, which may not match TData type\n result = await client.data.createMany(object, variables as any) as any;\n break;\n case 'updateMany':\n // Expect variables to be { records: Array<{ id: string, data: Partial<T> }> }\n const updateManyVars = variables as any;\n result = await client.data.updateMany(object, updateManyVars.records, updateManyVars.options) as any;\n break;\n case 'deleteMany':\n // Expect variables to be { ids: string[] }\n const deleteManyVars = variables as any;\n result = await client.data.deleteMany(object, deleteManyVars.ids, deleteManyVars.options) as any;\n break;\n default:\n throw new Error(`Unknown operation: ${operation}`);\n }\n\n setData(result);\n onSuccess?.(result, variables);\n onSettled?.(result, null, variables);\n \n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Mutation failed');\n setError(error);\n onError?.(error, variables);\n onSettled?.(undefined, error, variables);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [client, object, operation, onSuccess, onError, onSettled]);\n\n const mutate = useCallback((variables: TVariables): Promise<TData> => {\n return mutateAsync(variables).catch(() => {\n // Swallow error for non-async version\n // Error is still available in the error state\n return null as any;\n });\n }, [mutateAsync]);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setIsLoading(false);\n }, []);\n\n return {\n mutate,\n mutateAsync,\n data,\n isLoading,\n error,\n reset\n };\n}\n\n/**\n * Pagination options for usePagination hook\n */\nexport interface UsePaginationOptions<T = any> extends Omit<UseQueryOptions<T>, 'top' | 'skip'> {\n /** Page size */\n pageSize?: number;\n /** Initial page (1-based) */\n initialPage?: number;\n}\n\n/**\n * Pagination result for usePagination hook\n */\nexport interface UsePaginationResult<T = any> extends UseQueryResult<T> {\n /** Current page (1-based) */\n page: number;\n /** Total number of pages */\n totalPages: number;\n /** Total number of records */\n totalCount: number;\n /** Go to next page */\n nextPage: () => void;\n /** Go to previous page */\n previousPage: () => void;\n /** Go to specific page */\n goToPage: (page: number) => void;\n /** Whether there is a next page */\n hasNextPage: boolean;\n /** Whether there is a previous page */\n hasPreviousPage: boolean;\n}\n\n/**\n * Hook for paginated data queries\n * \n * @example\n * ```tsx\n * function PaginatedTaskList() {\n * const {\n * data,\n * isLoading,\n * page,\n * totalPages,\n * nextPage,\n * previousPage,\n * hasNextPage,\n * hasPreviousPage\n * } = usePagination('todo_task', {\n * pageSize: 10,\n * sort: ['-created_at']\n * });\n * \n * return (\n * <div>\n * {data?.value.map(task => <div key={task.id}>{task.subject}</div>)}\n * <button onClick={previousPage} disabled={!hasPreviousPage}>Previous</button>\n * <span>Page {page} of {totalPages}</span>\n * <button onClick={nextPage} disabled={!hasNextPage}>Next</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePagination<T = any>(\n object: string,\n options: UsePaginationOptions<T> = {}\n): UsePaginationResult<T> {\n const { pageSize = 20, initialPage = 1, ...queryOptions } = options;\n const [page, setPage] = useState(initialPage);\n\n const queryResult = useQuery<T>(object, {\n ...queryOptions,\n top: pageSize,\n skip: (page - 1) * pageSize\n });\n\n const totalCount = queryResult.data?.count || 0;\n const totalPages = Math.ceil(totalCount / pageSize);\n const hasNextPage = page < totalPages;\n const hasPreviousPage = page > 1;\n\n const nextPage = useCallback(() => {\n if (hasNextPage) {\n setPage(p => p + 1);\n }\n }, [hasNextPage]);\n\n const previousPage = useCallback(() => {\n if (hasPreviousPage) {\n setPage(p => p - 1);\n }\n }, [hasPreviousPage]);\n\n const goToPage = useCallback((newPage: number) => {\n const clampedPage = Math.max(1, Math.min(newPage, totalPages));\n setPage(clampedPage);\n }, [totalPages]);\n\n return {\n ...queryResult,\n page,\n totalPages,\n totalCount,\n nextPage,\n previousPage,\n goToPage,\n hasNextPage,\n hasPreviousPage\n };\n}\n\n/**\n * Infinite query options for useInfiniteQuery hook\n */\nexport interface UseInfiniteQueryOptions<T = any> extends Omit<UseQueryOptions<T>, 'skip'> {\n /** Page size for each fetch */\n pageSize?: number;\n /** Get next page parameter */\n getNextPageParam?: (lastPage: PaginatedResult<T>, allPages: PaginatedResult<T>[]) => number | undefined;\n}\n\n/**\n * Infinite query result for useInfiniteQuery hook\n */\nexport interface UseInfiniteQueryResult<T = any> {\n /** All pages of data */\n data: PaginatedResult<T>[];\n /** Flattened data from all pages */\n flatData: T[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Load the next page */\n fetchNextPage: () => Promise<void>;\n /** Whether there are more pages */\n hasNextPage: boolean;\n /** Is currently fetching next page */\n isFetchingNextPage: boolean;\n /** Refetch all pages */\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for infinite scrolling / load more functionality\n * \n * @example\n * ```tsx\n * function InfiniteTaskList() {\n * const {\n * flatData,\n * isLoading,\n * fetchNextPage,\n * hasNextPage,\n * isFetchingNextPage\n * } = useInfiniteQuery('todo_task', {\n * pageSize: 20,\n * sort: ['-created_at']\n * });\n * \n * return (\n * <div>\n * {flatData.map(task => <div key={task.id}>{task.subject}</div>)}\n * {hasNextPage && (\n * <button onClick={fetchNextPage} disabled={isFetchingNextPage}>\n * {isFetchingNextPage ? 'Loading...' : 'Load More'}\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useInfiniteQuery<T = any>(\n object: string,\n options: UseInfiniteQueryOptions<T> = {}\n): UseInfiniteQueryResult<T> {\n const client = useClient();\n const {\n pageSize = 20,\n // getNextPageParam is reserved for future use\n query,\n select,\n filters,\n sort,\n enabled = true,\n onSuccess,\n onError\n } = options;\n\n const [pages, setPages] = useState<PaginatedResult<T>[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [hasNextPage, setHasNextPage] = useState(true);\n\n const fetchPage = useCallback(async (skip: number, isNextPage = false) => {\n try {\n if (isNextPage) {\n setIsFetchingNextPage(true);\n } else {\n setIsLoading(true);\n }\n setError(null);\n\n let result: PaginatedResult<T>;\n\n if (query) {\n result = await client.data.query<T>(object, {\n ...query,\n limit: pageSize,\n offset: skip\n });\n } else {\n result = await client.data.find<T>(object, {\n select,\n filters: filters as any,\n sort,\n top: pageSize,\n skip\n });\n }\n\n if (isNextPage) {\n setPages(prev => [...prev, result]);\n } else {\n setPages([result]);\n }\n\n // Determine if there's a next page\n const fetchedCount = result.value.length;\n const hasMore = fetchedCount === pageSize;\n setHasNextPage(hasMore);\n\n onSuccess?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Query failed');\n setError(error);\n onError?.(error);\n } finally {\n setIsLoading(false);\n setIsFetchingNextPage(false);\n }\n }, [client, object, query, select, filters, sort, pageSize, onSuccess, onError]);\n\n // Initial fetch\n useEffect(() => {\n if (enabled) {\n fetchPage(0);\n }\n }, [enabled, fetchPage]);\n\n const fetchNextPage = useCallback(async () => {\n if (!hasNextPage || isFetchingNextPage) return;\n\n const nextSkip = pages.length * pageSize;\n await fetchPage(nextSkip, true);\n }, [hasNextPage, isFetchingNextPage, pages.length, pageSize, fetchPage]);\n\n const refetch = useCallback(async () => {\n setPages([]);\n await fetchPage(0);\n }, [fetchPage]);\n\n const flatData = pages.flatMap(page => page.value);\n\n return {\n data: pages,\n flatData,\n isLoading,\n error,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n refetch\n };\n}\n","/**\n * Metadata Hooks\n * \n * React hooks for accessing ObjectStack metadata (schemas, views, fields)\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useClient } from './context';\n\n/**\n * Metadata query options\n */\nexport interface UseMetadataOptions {\n /** Enable/disable automatic query execution */\n enabled?: boolean;\n /** Use cached metadata if available */\n useCache?: boolean;\n /** ETag for conditional requests */\n ifNoneMatch?: string;\n /** If-Modified-Since header for conditional requests */\n ifModifiedSince?: string;\n /** Callback on successful query */\n onSuccess?: (data: any) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Metadata query result\n */\nexport interface UseMetadataResult<T = any> {\n /** Metadata data */\n data: T | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch the metadata */\n refetch: () => Promise<void>;\n /** ETag from last fetch */\n etag?: string;\n /** Whether data came from cache (304 Not Modified) */\n fromCache: boolean;\n}\n\n/**\n * Hook for fetching object schema/metadata\n * \n * @example\n * ```tsx\n * function ObjectSchemaViewer({ objectName }: { objectName: string }) {\n * const { data: schema, isLoading, error } = useObject(objectName);\n * \n * if (isLoading) return <div>Loading schema...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * \n * return (\n * <div>\n * <h2>{schema.label}</h2>\n * <p>Fields: {Object.keys(schema.fields).length}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useObject(\n objectName: string,\n options: UseMetadataOptions = {}\n): UseMetadataResult {\n const client = useClient();\n const [data, setData] = useState<any>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [etag, setEtag] = useState<string>();\n const [fromCache, setFromCache] = useState(false);\n\n const {\n enabled = true,\n useCache = true,\n ifNoneMatch,\n ifModifiedSince,\n onSuccess,\n onError\n } = options;\n\n const fetchMetadata = useCallback(async () => {\n if (!enabled) return;\n\n try {\n setIsLoading(true);\n setError(null);\n setFromCache(false);\n\n if (useCache) {\n // Use cached metadata endpoint\n const result = await client.meta.getCached(objectName, {\n ifNoneMatch: ifNoneMatch || etag,\n ifModifiedSince\n });\n\n if (result.notModified) {\n setFromCache(true);\n } else {\n setData(result.data);\n if (result.etag) {\n setEtag(result.etag.value);\n }\n }\n\n onSuccess?.(result.data || data);\n } else {\n // Direct fetch without cache\n const result = await client.meta.getObject(objectName);\n setData(result);\n onSuccess?.(result);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch object metadata');\n setError(error);\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n }, [client, objectName, enabled, useCache, ifNoneMatch, ifModifiedSince, etag, data, onSuccess, onError]);\n\n useEffect(() => {\n fetchMetadata();\n }, [fetchMetadata]);\n\n const refetch = useCallback(async () => {\n await fetchMetadata();\n }, [fetchMetadata]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n etag,\n fromCache\n };\n}\n\n/**\n * Hook for fetching view configuration\n * \n * @example\n * ```tsx\n * function ViewConfiguration({ objectName }: { objectName: string }) {\n * const { data: view, isLoading } = useView(objectName, 'list');\n * \n * if (isLoading) return <div>Loading view...</div>;\n * \n * return (\n * <div>\n * <h3>List View for {objectName}</h3>\n * <p>Columns: {view?.columns?.length}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useView(\n objectName: string,\n viewType: 'list' | 'form' = 'list',\n options: UseMetadataOptions = {}\n): UseMetadataResult {\n const client = useClient();\n const [data, setData] = useState<any>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const { enabled = true, onSuccess, onError } = options;\n\n const fetchView = useCallback(async () => {\n if (!enabled) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const result = await client.meta.getView(objectName, viewType);\n setData(result);\n onSuccess?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch view configuration');\n setError(error);\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n }, [client, objectName, viewType, enabled, onSuccess, onError]);\n\n useEffect(() => {\n fetchView();\n }, [fetchView]);\n\n const refetch = useCallback(async () => {\n await fetchView();\n }, [fetchView]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n fromCache: false\n };\n}\n\n/**\n * Hook for extracting fields from object schema\n * \n * @example\n * ```tsx\n * function FieldList({ objectName }: { objectName: string }) {\n * const { data: fields, isLoading } = useFields(objectName);\n * \n * if (isLoading) return <div>Loading fields...</div>;\n * \n * return (\n * <ul>\n * {fields?.map(field => (\n * <li key={field.name}>{field.label} ({field.type})</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useFields(\n objectName: string,\n options: UseMetadataOptions = {}\n): UseMetadataResult<any[]> {\n const objectResult = useObject(objectName, options);\n\n const fields = objectResult.data?.fields\n ? Object.entries(objectResult.data.fields).map(([name, field]: [string, any]) => ({\n name,\n ...field\n }))\n : null;\n\n return {\n ...objectResult,\n data: fields\n };\n}\n\n/**\n * Generic metadata hook for custom metadata queries\n * \n * @example\n * ```tsx\n * function CustomMetadata() {\n * const { data, isLoading } = useMetadata(async (client) => {\n * // Custom metadata fetching logic\n * const object = await client.meta.getObject('custom_object');\n * const view = await client.meta.getView('custom_object', 'list');\n * return { object, view };\n * });\n * \n * return <pre>{JSON.stringify(data, null, 2)}</pre>;\n * }\n * ```\n */\nexport function useMetadata<T = any>(\n fetcher: (client: ReturnType<typeof useClient>) => Promise<T>,\n options: Omit<UseMetadataOptions, 'useCache' | 'ifNoneMatch' | 'ifModifiedSince'> = {}\n): UseMetadataResult<T> {\n const client = useClient();\n const [data, setData] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const { enabled = true, onSuccess, onError } = options;\n\n const fetchMetadata = useCallback(async () => {\n if (!enabled) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const result = await fetcher(client);\n setData(result);\n onSuccess?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch metadata');\n setError(error);\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n }, [client, fetcher, enabled, onSuccess, onError]);\n\n useEffect(() => {\n fetchMetadata();\n }, [fetchMetadata]);\n\n const refetch = useCallback(async () => {\n await fetchMetadata();\n }, [fetchMetadata]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n fromCache: false\n };\n}\n"],"mappings":"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","names":["import_react","error","import_react","error"]}
|