@calimero-network/mero-react 1.0.0-beta.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -125
- package/dist/index.cjs +1301 -201
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +296 -31
- package/dist/index.d.ts +296 -31
- package/dist/index.js +1248 -199
- package/dist/index.js.map +1 -1
- package/package.json +24 -10
package/dist/index.cjs
CHANGED
|
@@ -7,6 +7,21 @@ var reactDom = require('react-dom');
|
|
|
7
7
|
|
|
8
8
|
// src/context/MeroContext.tsx
|
|
9
9
|
|
|
10
|
+
// src/types.ts
|
|
11
|
+
var AppMode = /* @__PURE__ */ ((AppMode2) => {
|
|
12
|
+
AppMode2["SingleContext"] = "single-context";
|
|
13
|
+
AppMode2["MultiContext"] = "multi-context";
|
|
14
|
+
AppMode2["Admin"] = "admin";
|
|
15
|
+
return AppMode2;
|
|
16
|
+
})(AppMode || {});
|
|
17
|
+
var ConnectionType = /* @__PURE__ */ ((ConnectionType2) => {
|
|
18
|
+
ConnectionType2["RemoteAndLocal"] = "remote-and-local";
|
|
19
|
+
ConnectionType2["Remote"] = "remote";
|
|
20
|
+
ConnectionType2["Local"] = "local";
|
|
21
|
+
ConnectionType2["Custom"] = "custom";
|
|
22
|
+
return ConnectionType2;
|
|
23
|
+
})(ConnectionType || {});
|
|
24
|
+
|
|
10
25
|
// src/storage/index.ts
|
|
11
26
|
var STORAGE_KEYS = {
|
|
12
27
|
ACCESS_TOKEN: "mero:access_token",
|
|
@@ -14,20 +29,25 @@ var STORAGE_KEYS = {
|
|
|
14
29
|
EXPIRES_AT: "mero:expires_at",
|
|
15
30
|
NODE_URL: "mero:node_url",
|
|
16
31
|
APPLICATION_ID: "mero:application_id",
|
|
17
|
-
CONTEXT_ID: "mero:context_id"
|
|
32
|
+
CONTEXT_ID: "mero:context_id",
|
|
33
|
+
CONTEXT_IDENTITY: "mero:context_identity"
|
|
18
34
|
};
|
|
35
|
+
var _storageAvailable = null;
|
|
19
36
|
function isLocalStorageAvailable() {
|
|
37
|
+
if (_storageAvailable !== null) return _storageAvailable;
|
|
20
38
|
try {
|
|
21
39
|
if (typeof window === "undefined" || !window.localStorage) {
|
|
40
|
+
_storageAvailable = false;
|
|
22
41
|
return false;
|
|
23
42
|
}
|
|
24
43
|
const testKey = "__mero_test__";
|
|
25
44
|
localStorage.setItem(testKey, "test");
|
|
26
45
|
localStorage.removeItem(testKey);
|
|
27
|
-
|
|
46
|
+
_storageAvailable = true;
|
|
28
47
|
} catch {
|
|
29
|
-
|
|
48
|
+
_storageAvailable = false;
|
|
30
49
|
}
|
|
50
|
+
return _storageAvailable;
|
|
31
51
|
}
|
|
32
52
|
var localStorageTokenStorage = {
|
|
33
53
|
async get() {
|
|
@@ -108,46 +128,37 @@ function setContextId(id) {
|
|
|
108
128
|
if (!isLocalStorageAvailable()) return;
|
|
109
129
|
localStorage.setItem(STORAGE_KEYS.CONTEXT_ID, id);
|
|
110
130
|
}
|
|
131
|
+
function clearContextId() {
|
|
132
|
+
if (!isLocalStorageAvailable()) return;
|
|
133
|
+
localStorage.removeItem(STORAGE_KEYS.CONTEXT_ID);
|
|
134
|
+
}
|
|
135
|
+
function getContextIdentity() {
|
|
136
|
+
if (!isLocalStorageAvailable()) return null;
|
|
137
|
+
return localStorage.getItem(STORAGE_KEYS.CONTEXT_IDENTITY);
|
|
138
|
+
}
|
|
139
|
+
function setContextIdentity(id) {
|
|
140
|
+
if (!isLocalStorageAvailable()) return;
|
|
141
|
+
localStorage.setItem(STORAGE_KEYS.CONTEXT_IDENTITY, id);
|
|
142
|
+
}
|
|
143
|
+
function clearContextIdentity() {
|
|
144
|
+
if (!isLocalStorageAvailable()) return;
|
|
145
|
+
localStorage.removeItem(STORAGE_KEYS.CONTEXT_IDENTITY);
|
|
146
|
+
}
|
|
111
147
|
function clearAllStorage() {
|
|
112
148
|
if (!isLocalStorageAvailable()) return;
|
|
113
149
|
Object.values(STORAGE_KEYS).forEach((key) => {
|
|
114
150
|
localStorage.removeItem(key);
|
|
115
151
|
});
|
|
116
152
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
var
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
ConnectionType2["RemoteAndLocal"] = "remote-and-local";
|
|
127
|
-
ConnectionType2["Remote"] = "remote";
|
|
128
|
-
ConnectionType2["Local"] = "local";
|
|
129
|
-
ConnectionType2["Custom"] = "custom";
|
|
130
|
-
return ConnectionType2;
|
|
131
|
-
})(ConnectionType || {});
|
|
132
|
-
var EventStreamMode = /* @__PURE__ */ ((EventStreamMode2) => {
|
|
133
|
-
EventStreamMode2["WebSocket"] = "websocket";
|
|
134
|
-
EventStreamMode2["SSE"] = "sse";
|
|
135
|
-
return EventStreamMode2;
|
|
136
|
-
})(EventStreamMode || {});
|
|
137
|
-
var defaultContextValue = {
|
|
138
|
-
mero: null,
|
|
139
|
-
isAuthenticated: false,
|
|
140
|
-
isOnline: true,
|
|
141
|
-
nodeUrl: null,
|
|
142
|
-
applicationId: null,
|
|
143
|
-
contextId: null,
|
|
144
|
-
connectToNode: () => {
|
|
145
|
-
},
|
|
146
|
-
logout: () => {
|
|
147
|
-
},
|
|
148
|
-
isLoading: true
|
|
149
|
-
};
|
|
150
|
-
var MeroContext = react.createContext(defaultContextValue);
|
|
153
|
+
var MeroContext = react.createContext(null);
|
|
154
|
+
var isBrowser = typeof window !== "undefined";
|
|
155
|
+
var _tokenStore = null;
|
|
156
|
+
function getTokenStore() {
|
|
157
|
+
if (!_tokenStore) {
|
|
158
|
+
_tokenStore = new meroJs.LocalStorageTokenStore();
|
|
159
|
+
}
|
|
160
|
+
return _tokenStore;
|
|
161
|
+
}
|
|
151
162
|
function getPermissionsForMode(mode) {
|
|
152
163
|
switch (mode) {
|
|
153
164
|
case "single-context" /* SingleContext */:
|
|
@@ -160,27 +171,20 @@ function getPermissionsForMode(mode) {
|
|
|
160
171
|
throw new Error(`Unsupported application mode: ${mode}`);
|
|
161
172
|
}
|
|
162
173
|
}
|
|
163
|
-
function
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
} else if (params.applicationId) {
|
|
177
|
-
authParams.append("application-id", params.applicationId);
|
|
178
|
-
}
|
|
179
|
-
if (params.applicationPath) {
|
|
180
|
-
authParams.append("application-path", params.applicationPath);
|
|
174
|
+
function parseJwtExpiry(token) {
|
|
175
|
+
try {
|
|
176
|
+
const parts = token.split(".");
|
|
177
|
+
if (parts.length === 3) {
|
|
178
|
+
let b64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
|
|
179
|
+
while (b64.length % 4) b64 += "=";
|
|
180
|
+
const payload = JSON.parse(atob(b64));
|
|
181
|
+
if (payload.exp && payload.exp > 0) {
|
|
182
|
+
return payload.exp * 1e3;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
} catch {
|
|
181
186
|
}
|
|
182
|
-
|
|
183
|
-
window.location.href = `${params.nodeUrl}/auth/login?${authParams.toString()}`;
|
|
187
|
+
return Date.now() + 36e5;
|
|
184
188
|
}
|
|
185
189
|
function MeroProvider({
|
|
186
190
|
children,
|
|
@@ -188,8 +192,6 @@ function MeroProvider({
|
|
|
188
192
|
packageName,
|
|
189
193
|
packageVersion,
|
|
190
194
|
registryUrl,
|
|
191
|
-
applicationId: propApplicationId,
|
|
192
|
-
applicationPath,
|
|
193
195
|
timeoutMs = 3e4
|
|
194
196
|
}) {
|
|
195
197
|
const [mero, setMero] = react.useState(null);
|
|
@@ -198,15 +200,23 @@ function MeroProvider({
|
|
|
198
200
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
199
201
|
const [nodeUrl, setNodeUrlState] = react.useState(() => getNodeUrl());
|
|
200
202
|
const [applicationId, setApplicationIdState] = react.useState(
|
|
201
|
-
() => getApplicationId() ||
|
|
203
|
+
() => getApplicationId() || null
|
|
202
204
|
);
|
|
203
205
|
const [contextId, setContextIdState] = react.useState(() => getContextId());
|
|
206
|
+
const [contextIdentity, setContextIdentityState] = react.useState(() => getContextIdentity());
|
|
204
207
|
const meroRef = react.useRef(null);
|
|
208
|
+
const callbackRef = react.useRef(void 0);
|
|
209
|
+
if (callbackRef.current === void 0 && isBrowser) {
|
|
210
|
+
callbackRef.current = meroJs.parseAuthCallback(window.location.href);
|
|
211
|
+
}
|
|
205
212
|
const createMeroInstance = react.useCallback(
|
|
206
213
|
(url) => {
|
|
214
|
+
if (meroRef.current) {
|
|
215
|
+
meroRef.current.close();
|
|
216
|
+
}
|
|
207
217
|
const instance = new meroJs.MeroJs({
|
|
208
218
|
baseUrl: url,
|
|
209
|
-
|
|
219
|
+
tokenStore: getTokenStore(),
|
|
210
220
|
timeoutMs
|
|
211
221
|
});
|
|
212
222
|
meroRef.current = instance;
|
|
@@ -216,127 +226,35 @@ function MeroProvider({
|
|
|
216
226
|
);
|
|
217
227
|
const checkAuth = react.useCallback(async (instance) => {
|
|
218
228
|
try {
|
|
219
|
-
await instance.admin.
|
|
229
|
+
await instance.admin.getContexts();
|
|
220
230
|
return true;
|
|
221
231
|
} catch {
|
|
222
232
|
return false;
|
|
223
233
|
}
|
|
224
234
|
}, []);
|
|
225
|
-
const processAuthCallback = react.useCallback(() => {
|
|
226
|
-
const url = new URL(window.location.href);
|
|
227
|
-
const rawHash = url.hash;
|
|
228
|
-
const hash = rawHash.slice(1);
|
|
229
|
-
console.log("========== AUTH CALLBACK DEBUG ==========");
|
|
230
|
-
console.log("Raw URL:", window.location.href);
|
|
231
|
-
console.log("Raw hash:", rawHash);
|
|
232
|
-
console.log("Hash (without #):", hash);
|
|
233
|
-
if (!hash) {
|
|
234
|
-
console.log("No hash found, skipping auth callback");
|
|
235
|
-
console.log("==========================================");
|
|
236
|
-
return false;
|
|
237
|
-
}
|
|
238
|
-
const params = new URLSearchParams(hash);
|
|
239
|
-
console.log("All hash params:");
|
|
240
|
-
for (const [key, value] of params.entries()) {
|
|
241
|
-
console.log(` ${key}: ${value.substring(0, 50)}${value.length > 50 ? "..." : ""}`);
|
|
242
|
-
}
|
|
243
|
-
console.log("==========================================");
|
|
244
|
-
const accessToken = params.get("access_token");
|
|
245
|
-
const refreshToken = params.get("refresh_token");
|
|
246
|
-
const appId = params.get("application_id") || params.get("applicationId") || params.get("app_id");
|
|
247
|
-
const ctxId = params.get("context_id") || params.get("contextId") || params.get("context");
|
|
248
|
-
const expiresIn = params.get("expires_in");
|
|
249
|
-
const nodeUrlParam = params.get("node_url") || params.get("nodeUrl") || params.get("node");
|
|
250
|
-
if (!accessToken || !refreshToken) return false;
|
|
251
|
-
if (nodeUrlParam) {
|
|
252
|
-
const decodedNodeUrl = decodeURIComponent(nodeUrlParam);
|
|
253
|
-
setNodeUrl(decodedNodeUrl);
|
|
254
|
-
setNodeUrlState(decodedNodeUrl);
|
|
255
|
-
console.log("[mero-react] SSO: Node URL from hash params:", decodedNodeUrl);
|
|
256
|
-
}
|
|
257
|
-
try {
|
|
258
|
-
const decodedAccess = decodeURIComponent(accessToken);
|
|
259
|
-
const decodedRefresh = decodeURIComponent(refreshToken);
|
|
260
|
-
let expiresAt = Date.now() + 36e5;
|
|
261
|
-
if (expiresIn) {
|
|
262
|
-
expiresAt = Date.now() + parseInt(expiresIn, 10) * 1e3;
|
|
263
|
-
} else {
|
|
264
|
-
try {
|
|
265
|
-
const parts = decodedAccess.split(".");
|
|
266
|
-
if (parts.length === 3) {
|
|
267
|
-
const payload = JSON.parse(atob(parts[1]));
|
|
268
|
-
if (payload.exp) {
|
|
269
|
-
expiresAt = payload.exp * 1e3;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
} catch {
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
localStorageTokenStorage.set({
|
|
276
|
-
access_token: decodedAccess,
|
|
277
|
-
refresh_token: decodedRefresh,
|
|
278
|
-
expires_at: expiresAt
|
|
279
|
-
});
|
|
280
|
-
if (appId) {
|
|
281
|
-
setApplicationId(appId);
|
|
282
|
-
setApplicationIdState(appId);
|
|
283
|
-
}
|
|
284
|
-
if (ctxId) {
|
|
285
|
-
setContextId(ctxId);
|
|
286
|
-
setContextIdState(ctxId);
|
|
287
|
-
}
|
|
288
|
-
params.delete("access_token");
|
|
289
|
-
params.delete("refresh_token");
|
|
290
|
-
params.delete("application_id");
|
|
291
|
-
params.delete("applicationId");
|
|
292
|
-
params.delete("app_id");
|
|
293
|
-
params.delete("context_id");
|
|
294
|
-
params.delete("contextId");
|
|
295
|
-
params.delete("context");
|
|
296
|
-
params.delete("expires_in");
|
|
297
|
-
params.delete("node_url");
|
|
298
|
-
params.delete("nodeUrl");
|
|
299
|
-
params.delete("node");
|
|
300
|
-
const newHash = params.toString();
|
|
301
|
-
url.hash = newHash ? `#${newHash}` : "";
|
|
302
|
-
window.history.replaceState({}, document.title, url.toString());
|
|
303
|
-
console.log("[mero-react] Stored contextId:", ctxId, "applicationId:", appId);
|
|
304
|
-
return true;
|
|
305
|
-
} catch (e) {
|
|
306
|
-
console.error("[mero-react] Failed to process auth callback:", e);
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
}, []);
|
|
310
235
|
const connectToNode = react.useCallback(
|
|
311
236
|
(url) => {
|
|
237
|
+
if (!isBrowser) return;
|
|
312
238
|
setNodeUrl(url);
|
|
313
239
|
setNodeUrlState(url);
|
|
314
240
|
const callbackUrl = new URL(window.location.href);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
hashParams.delete("access_token");
|
|
318
|
-
hashParams.delete("refresh_token");
|
|
319
|
-
hashParams.delete("application_id");
|
|
320
|
-
callbackUrl.hash = hashParams.toString() ? `#${hashParams.toString()}` : "";
|
|
321
|
-
}
|
|
322
|
-
const permissions = getPermissionsForMode(mode);
|
|
323
|
-
redirectToAuthLogin({
|
|
324
|
-
nodeUrl: url,
|
|
241
|
+
callbackUrl.hash = "";
|
|
242
|
+
const loginUrl = meroJs.buildAuthLoginUrl(url, {
|
|
325
243
|
callbackUrl: callbackUrl.toString(),
|
|
326
|
-
permissions,
|
|
244
|
+
permissions: getPermissionsForMode(mode),
|
|
327
245
|
mode,
|
|
328
246
|
packageName,
|
|
329
247
|
packageVersion,
|
|
330
|
-
registryUrl
|
|
331
|
-
applicationId: propApplicationId,
|
|
332
|
-
applicationPath
|
|
248
|
+
registryUrl
|
|
333
249
|
});
|
|
250
|
+
window.location.href = loginUrl;
|
|
334
251
|
},
|
|
335
|
-
[mode, packageName, packageVersion, registryUrl
|
|
252
|
+
[mode, packageName, packageVersion, registryUrl]
|
|
336
253
|
);
|
|
337
|
-
const logout = react.useCallback(
|
|
254
|
+
const logout = react.useCallback(() => {
|
|
338
255
|
if (meroRef.current) {
|
|
339
|
-
|
|
256
|
+
meroRef.current.clearToken();
|
|
257
|
+
meroRef.current.close();
|
|
340
258
|
}
|
|
341
259
|
clearAllStorage();
|
|
342
260
|
setMero(null);
|
|
@@ -344,56 +262,90 @@ function MeroProvider({
|
|
|
344
262
|
setNodeUrlState(null);
|
|
345
263
|
setApplicationIdState(null);
|
|
346
264
|
setContextIdState(null);
|
|
265
|
+
setContextIdentityState(null);
|
|
347
266
|
meroRef.current = null;
|
|
348
267
|
}, []);
|
|
349
268
|
react.useEffect(() => {
|
|
269
|
+
let active = true;
|
|
350
270
|
const init = async () => {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
271
|
+
const callback = callbackRef.current;
|
|
272
|
+
if (callback) {
|
|
273
|
+
getTokenStore().setTokens({
|
|
274
|
+
access_token: callback.accessToken,
|
|
275
|
+
refresh_token: callback.refreshToken,
|
|
276
|
+
expires_at: parseJwtExpiry(callback.accessToken)
|
|
277
|
+
});
|
|
278
|
+
if (callback.applicationId) {
|
|
279
|
+
setApplicationId(callback.applicationId);
|
|
280
|
+
if (active) setApplicationIdState(callback.applicationId);
|
|
281
|
+
}
|
|
282
|
+
if (callback.contextId) {
|
|
283
|
+
setContextId(callback.contextId);
|
|
284
|
+
if (active) setContextIdState(callback.contextId);
|
|
285
|
+
}
|
|
286
|
+
if (callback.contextIdentity) {
|
|
287
|
+
setContextIdentity(callback.contextIdentity);
|
|
288
|
+
if (active) setContextIdentityState(callback.contextIdentity);
|
|
289
|
+
}
|
|
290
|
+
if (callback.nodeUrl) {
|
|
291
|
+
setNodeUrl(callback.nodeUrl);
|
|
292
|
+
if (active) setNodeUrlState(callback.nodeUrl);
|
|
293
|
+
}
|
|
294
|
+
if (isBrowser) {
|
|
295
|
+
window.history.replaceState({}, "", window.location.pathname + window.location.search);
|
|
296
|
+
}
|
|
297
|
+
callbackRef.current = null;
|
|
298
|
+
}
|
|
299
|
+
const savedUrl = callback?.nodeUrl || getNodeUrl();
|
|
359
300
|
if (!savedUrl) {
|
|
360
|
-
setIsLoading(false);
|
|
301
|
+
if (active) setIsLoading(false);
|
|
361
302
|
return;
|
|
362
303
|
}
|
|
363
304
|
const instance = createMeroInstance(savedUrl);
|
|
364
|
-
await instance.init();
|
|
365
305
|
const authed = await checkAuth(instance);
|
|
306
|
+
if (!active) return;
|
|
366
307
|
if (authed) {
|
|
367
308
|
setMero(instance);
|
|
368
309
|
setIsAuthenticated(true);
|
|
369
310
|
setIsOnline(true);
|
|
370
|
-
} else if (
|
|
311
|
+
} else if (callback) {
|
|
371
312
|
setMero(instance);
|
|
372
|
-
setIsAuthenticated(false);
|
|
373
313
|
}
|
|
374
314
|
setIsLoading(false);
|
|
375
315
|
};
|
|
376
|
-
init()
|
|
377
|
-
|
|
316
|
+
init().catch((err) => {
|
|
317
|
+
console.error("[MeroProvider] Initialization failed:", err);
|
|
318
|
+
if (active) setIsLoading(false);
|
|
319
|
+
});
|
|
320
|
+
return () => {
|
|
321
|
+
active = false;
|
|
322
|
+
};
|
|
323
|
+
}, [createMeroInstance, checkAuth]);
|
|
378
324
|
react.useEffect(() => {
|
|
379
325
|
if (!isAuthenticated || !meroRef.current) return;
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
326
|
+
let active = true;
|
|
327
|
+
const sse = meroRef.current.events;
|
|
328
|
+
const onConnect = () => {
|
|
329
|
+
if (active) setIsOnline(true);
|
|
330
|
+
};
|
|
331
|
+
const onError = (err) => {
|
|
332
|
+
if (!active) return;
|
|
333
|
+
setIsOnline(false);
|
|
334
|
+
if (err.message.includes("401")) {
|
|
335
|
+
logout();
|
|
388
336
|
}
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
337
|
+
};
|
|
338
|
+
sse.on("connect", onConnect);
|
|
339
|
+
sse.on("error", onError);
|
|
340
|
+
sse.connect().catch(() => {
|
|
341
|
+
if (active) setIsOnline(false);
|
|
342
|
+
});
|
|
343
|
+
return () => {
|
|
344
|
+
active = false;
|
|
345
|
+
sse.off("connect", onConnect);
|
|
346
|
+
sse.off("error", onError);
|
|
347
|
+
};
|
|
348
|
+
}, [isAuthenticated, mero]);
|
|
397
349
|
const contextValue = react.useMemo(
|
|
398
350
|
() => ({
|
|
399
351
|
mero,
|
|
@@ -402,17 +354,18 @@ function MeroProvider({
|
|
|
402
354
|
nodeUrl,
|
|
403
355
|
applicationId,
|
|
404
356
|
contextId,
|
|
357
|
+
contextIdentity,
|
|
405
358
|
connectToNode,
|
|
406
359
|
logout,
|
|
407
360
|
isLoading
|
|
408
361
|
}),
|
|
409
|
-
[mero, isAuthenticated, isOnline, nodeUrl, applicationId, contextId, connectToNode, logout, isLoading]
|
|
362
|
+
[mero, isAuthenticated, isOnline, nodeUrl, applicationId, contextId, contextIdentity, connectToNode, logout, isLoading]
|
|
410
363
|
);
|
|
411
364
|
return /* @__PURE__ */ jsxRuntime.jsx(MeroContext.Provider, { value: contextValue, children });
|
|
412
365
|
}
|
|
413
366
|
function useMero() {
|
|
414
367
|
const context = react.useContext(MeroContext);
|
|
415
|
-
if (context
|
|
368
|
+
if (!context) {
|
|
416
369
|
throw new Error("useMero must be used within a MeroProvider");
|
|
417
370
|
}
|
|
418
371
|
return context;
|
|
@@ -888,26 +841,1173 @@ function MeroLogo2() {
|
|
|
888
841
|
}
|
|
889
842
|
);
|
|
890
843
|
}
|
|
844
|
+
function toError(err) {
|
|
845
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
846
|
+
}
|
|
847
|
+
function mapApplicationContexts(contexts) {
|
|
848
|
+
return contexts.map((context) => ({
|
|
849
|
+
contextId: context.id,
|
|
850
|
+
applicationId: context.applicationId
|
|
851
|
+
}));
|
|
852
|
+
}
|
|
853
|
+
function useMountedRef() {
|
|
854
|
+
const mountedRef = react.useRef(true);
|
|
855
|
+
react.useEffect(() => {
|
|
856
|
+
mountedRef.current = true;
|
|
857
|
+
return () => {
|
|
858
|
+
mountedRef.current = false;
|
|
859
|
+
};
|
|
860
|
+
}, []);
|
|
861
|
+
return mountedRef;
|
|
862
|
+
}
|
|
863
|
+
function useAsyncMutation() {
|
|
864
|
+
const mountedRef = useMountedRef();
|
|
865
|
+
const [loading, setLoading] = react.useState(false);
|
|
866
|
+
const [error, setError] = react.useState(null);
|
|
867
|
+
const run = react.useCallback(
|
|
868
|
+
async (action) => {
|
|
869
|
+
if (mountedRef.current) {
|
|
870
|
+
setLoading(true);
|
|
871
|
+
setError(null);
|
|
872
|
+
}
|
|
873
|
+
try {
|
|
874
|
+
return await action();
|
|
875
|
+
} catch (err) {
|
|
876
|
+
const errorValue = toError(err);
|
|
877
|
+
if (mountedRef.current) {
|
|
878
|
+
setError(errorValue);
|
|
879
|
+
}
|
|
880
|
+
return null;
|
|
881
|
+
} finally {
|
|
882
|
+
if (mountedRef.current) {
|
|
883
|
+
setLoading(false);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
[mountedRef]
|
|
888
|
+
);
|
|
889
|
+
return { loading, error, run, setError };
|
|
890
|
+
}
|
|
891
|
+
function sleep(ms) {
|
|
892
|
+
return new Promise((resolve) => {
|
|
893
|
+
setTimeout(resolve, ms);
|
|
894
|
+
});
|
|
895
|
+
}
|
|
896
|
+
function extractAliasContextId(value) {
|
|
897
|
+
if (typeof value === "string") {
|
|
898
|
+
return value;
|
|
899
|
+
}
|
|
900
|
+
if (!value || typeof value !== "object") {
|
|
901
|
+
return null;
|
|
902
|
+
}
|
|
903
|
+
if ("value" in value && typeof value.value === "string") {
|
|
904
|
+
return value.value;
|
|
905
|
+
}
|
|
906
|
+
if ("contextId" in value && typeof value.contextId === "string") {
|
|
907
|
+
return value.contextId;
|
|
908
|
+
}
|
|
909
|
+
return null;
|
|
910
|
+
}
|
|
911
|
+
function useExecute(contextId, executorId) {
|
|
912
|
+
const { mero } = useMero();
|
|
913
|
+
const [loading, setLoading] = react.useState(false);
|
|
914
|
+
const [error, setError] = react.useState(null);
|
|
915
|
+
const mountedRef = react.useRef(true);
|
|
916
|
+
react.useEffect(() => {
|
|
917
|
+
mountedRef.current = true;
|
|
918
|
+
return () => {
|
|
919
|
+
mountedRef.current = false;
|
|
920
|
+
};
|
|
921
|
+
}, []);
|
|
922
|
+
const execute = react.useCallback(
|
|
923
|
+
async (method, params) => {
|
|
924
|
+
if (!mero || !contextId || !executorId) {
|
|
925
|
+
if (mountedRef.current) setError(new Error("Not connected"));
|
|
926
|
+
return null;
|
|
927
|
+
}
|
|
928
|
+
if (mountedRef.current) {
|
|
929
|
+
setLoading(true);
|
|
930
|
+
setError(null);
|
|
931
|
+
}
|
|
932
|
+
try {
|
|
933
|
+
const result = await mero.rpc.execute({
|
|
934
|
+
contextId,
|
|
935
|
+
method,
|
|
936
|
+
argsJson: params,
|
|
937
|
+
executorPublicKey: executorId
|
|
938
|
+
});
|
|
939
|
+
return result;
|
|
940
|
+
} catch (err) {
|
|
941
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
942
|
+
if (mountedRef.current) setError(e);
|
|
943
|
+
return null;
|
|
944
|
+
} finally {
|
|
945
|
+
if (mountedRef.current) setLoading(false);
|
|
946
|
+
}
|
|
947
|
+
},
|
|
948
|
+
[mero, contextId, executorId]
|
|
949
|
+
);
|
|
950
|
+
return { execute, loading, error };
|
|
951
|
+
}
|
|
952
|
+
function useSubscription(contextIds, callback) {
|
|
953
|
+
const { mero } = useMero();
|
|
954
|
+
const callbackRef = react.useRef(callback);
|
|
955
|
+
callbackRef.current = callback;
|
|
956
|
+
const contextIdsKey = JSON.stringify(contextIds);
|
|
957
|
+
react.useEffect(() => {
|
|
958
|
+
if (!mero || contextIds.length === 0) return;
|
|
959
|
+
const sse = mero.events;
|
|
960
|
+
const handler = (event) => {
|
|
961
|
+
callbackRef.current(event);
|
|
962
|
+
};
|
|
963
|
+
sse.on("event", handler);
|
|
964
|
+
sse.connect().catch(() => {
|
|
965
|
+
});
|
|
966
|
+
sse.subscribe(contextIds).catch(() => {
|
|
967
|
+
});
|
|
968
|
+
return () => {
|
|
969
|
+
sse.off("event", handler);
|
|
970
|
+
};
|
|
971
|
+
}, [mero, contextIdsKey]);
|
|
972
|
+
}
|
|
973
|
+
function useContexts(applicationId) {
|
|
974
|
+
const { mero } = useMero();
|
|
975
|
+
const [contexts, setContexts] = react.useState([]);
|
|
976
|
+
const [loading, setLoading] = react.useState(false);
|
|
977
|
+
const [error, setError] = react.useState(null);
|
|
978
|
+
const mountedRef = useMountedRef();
|
|
979
|
+
const refetch = react.useCallback(async () => {
|
|
980
|
+
if (!mero) return;
|
|
981
|
+
if (mountedRef.current) {
|
|
982
|
+
setLoading(true);
|
|
983
|
+
setError(null);
|
|
984
|
+
}
|
|
985
|
+
try {
|
|
986
|
+
const response = applicationId ? await mero.admin.getContextsForApplication(applicationId) : await mero.admin.getContexts();
|
|
987
|
+
const list = mapApplicationContexts(response.contexts ?? []);
|
|
988
|
+
if (mountedRef.current) {
|
|
989
|
+
setContexts(list);
|
|
990
|
+
}
|
|
991
|
+
} catch (err) {
|
|
992
|
+
const errorValue = toError(err);
|
|
993
|
+
if (mountedRef.current) {
|
|
994
|
+
setError(errorValue);
|
|
995
|
+
}
|
|
996
|
+
} finally {
|
|
997
|
+
if (mountedRef.current) {
|
|
998
|
+
setLoading(false);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}, [mero, applicationId]);
|
|
1002
|
+
react.useEffect(() => {
|
|
1003
|
+
void refetch();
|
|
1004
|
+
}, [refetch]);
|
|
1005
|
+
return { contexts, loading, error, refetch };
|
|
1006
|
+
}
|
|
1007
|
+
function useApplicationContexts(applicationId) {
|
|
1008
|
+
return useContexts(applicationId);
|
|
1009
|
+
}
|
|
1010
|
+
function useGroupMembers(groupId) {
|
|
1011
|
+
const { mero } = useMero();
|
|
1012
|
+
const [members, setMembers] = react.useState([]);
|
|
1013
|
+
const [selfIdentity, setSelfIdentity] = react.useState(null);
|
|
1014
|
+
const [loading, setLoading] = react.useState(false);
|
|
1015
|
+
const [error, setError] = react.useState(null);
|
|
1016
|
+
const mountedRef = useMountedRef();
|
|
1017
|
+
const refetch = react.useCallback(async () => {
|
|
1018
|
+
if (!mero || !groupId) {
|
|
1019
|
+
if (mountedRef.current) {
|
|
1020
|
+
setMembers([]);
|
|
1021
|
+
setSelfIdentity(null);
|
|
1022
|
+
setError(null);
|
|
1023
|
+
setLoading(false);
|
|
1024
|
+
}
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
if (mountedRef.current) {
|
|
1028
|
+
setLoading(true);
|
|
1029
|
+
setError(null);
|
|
1030
|
+
}
|
|
1031
|
+
try {
|
|
1032
|
+
const response = await mero.admin.listGroupMembers(groupId);
|
|
1033
|
+
if (mountedRef.current) {
|
|
1034
|
+
setMembers(response.data ?? []);
|
|
1035
|
+
setSelfIdentity(response.selfIdentity ?? null);
|
|
1036
|
+
}
|
|
1037
|
+
} catch (err) {
|
|
1038
|
+
const errorValue = toError(err);
|
|
1039
|
+
if (mountedRef.current) {
|
|
1040
|
+
setError(errorValue);
|
|
1041
|
+
}
|
|
1042
|
+
} finally {
|
|
1043
|
+
if (mountedRef.current) {
|
|
1044
|
+
setLoading(false);
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
}, [groupId, mero, mountedRef]);
|
|
1048
|
+
react.useEffect(() => {
|
|
1049
|
+
void refetch();
|
|
1050
|
+
}, [refetch]);
|
|
1051
|
+
return { members, selfIdentity, loading, error, refetch };
|
|
1052
|
+
}
|
|
1053
|
+
function useGroupContexts(groupId) {
|
|
1054
|
+
const { mero } = useMero();
|
|
1055
|
+
const [contexts, setContexts] = react.useState([]);
|
|
1056
|
+
const [loading, setLoading] = react.useState(false);
|
|
1057
|
+
const [error, setError] = react.useState(null);
|
|
1058
|
+
const mountedRef = useMountedRef();
|
|
1059
|
+
const refetch = react.useCallback(async () => {
|
|
1060
|
+
if (!mero || !groupId) {
|
|
1061
|
+
if (mountedRef.current) {
|
|
1062
|
+
setContexts([]);
|
|
1063
|
+
setError(null);
|
|
1064
|
+
setLoading(false);
|
|
1065
|
+
}
|
|
1066
|
+
return;
|
|
1067
|
+
}
|
|
1068
|
+
if (mountedRef.current) {
|
|
1069
|
+
setLoading(true);
|
|
1070
|
+
setError(null);
|
|
1071
|
+
}
|
|
1072
|
+
try {
|
|
1073
|
+
const nextContexts = await mero.admin.listGroupContexts(groupId);
|
|
1074
|
+
if (mountedRef.current) {
|
|
1075
|
+
setContexts(nextContexts);
|
|
1076
|
+
}
|
|
1077
|
+
} catch (err) {
|
|
1078
|
+
const errorValue = toError(err);
|
|
1079
|
+
if (mountedRef.current) {
|
|
1080
|
+
setError(errorValue);
|
|
1081
|
+
}
|
|
1082
|
+
} finally {
|
|
1083
|
+
if (mountedRef.current) {
|
|
1084
|
+
setLoading(false);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
}, [groupId, mero, mountedRef]);
|
|
1088
|
+
react.useEffect(() => {
|
|
1089
|
+
void refetch();
|
|
1090
|
+
}, [refetch]);
|
|
1091
|
+
return { contexts, loading, error, refetch };
|
|
1092
|
+
}
|
|
1093
|
+
function useGroupInvitations() {
|
|
1094
|
+
const { mero } = useMero();
|
|
1095
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1096
|
+
const createInvitation = react.useCallback(
|
|
1097
|
+
async (groupId, request) => {
|
|
1098
|
+
if (!mero) {
|
|
1099
|
+
return null;
|
|
1100
|
+
}
|
|
1101
|
+
return run(() => mero.admin.createGroupInvitation(groupId, request));
|
|
1102
|
+
},
|
|
1103
|
+
[mero, run]
|
|
1104
|
+
);
|
|
1105
|
+
return { createInvitation, loading, error };
|
|
1106
|
+
}
|
|
1107
|
+
function useJoinGroup() {
|
|
1108
|
+
const { mero } = useMero();
|
|
1109
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1110
|
+
const joinGroup = react.useCallback(
|
|
1111
|
+
async (request) => {
|
|
1112
|
+
if (!mero) {
|
|
1113
|
+
return null;
|
|
1114
|
+
}
|
|
1115
|
+
return run(() => mero.admin.joinGroup(request));
|
|
1116
|
+
},
|
|
1117
|
+
[mero, run]
|
|
1118
|
+
);
|
|
1119
|
+
return { joinGroup, loading, error };
|
|
1120
|
+
}
|
|
1121
|
+
function useGroupCapabilities(groupId, memberId) {
|
|
1122
|
+
const { mero } = useMero();
|
|
1123
|
+
const [capabilities, setCapabilitiesState] = react.useState(null);
|
|
1124
|
+
const [loading, setLoading] = react.useState(false);
|
|
1125
|
+
const [error, setError] = react.useState(null);
|
|
1126
|
+
const mountedRef = useMountedRef();
|
|
1127
|
+
const refetch = react.useCallback(async () => {
|
|
1128
|
+
if (!mero || !groupId || !memberId) {
|
|
1129
|
+
if (mountedRef.current) {
|
|
1130
|
+
setCapabilitiesState(null);
|
|
1131
|
+
setError(null);
|
|
1132
|
+
setLoading(false);
|
|
1133
|
+
}
|
|
1134
|
+
return null;
|
|
1135
|
+
}
|
|
1136
|
+
if (mountedRef.current) {
|
|
1137
|
+
setLoading(true);
|
|
1138
|
+
setError(null);
|
|
1139
|
+
}
|
|
1140
|
+
try {
|
|
1141
|
+
const response = await mero.admin.getMemberCapabilities(groupId, memberId);
|
|
1142
|
+
if (mountedRef.current) {
|
|
1143
|
+
setCapabilitiesState(response.capabilities);
|
|
1144
|
+
}
|
|
1145
|
+
return response.capabilities;
|
|
1146
|
+
} catch (err) {
|
|
1147
|
+
const errorValue = toError(err);
|
|
1148
|
+
if (mountedRef.current) {
|
|
1149
|
+
setError(errorValue);
|
|
1150
|
+
}
|
|
1151
|
+
return null;
|
|
1152
|
+
} finally {
|
|
1153
|
+
if (mountedRef.current) {
|
|
1154
|
+
setLoading(false);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
}, [groupId, memberId, mero, mountedRef]);
|
|
1158
|
+
react.useEffect(() => {
|
|
1159
|
+
void refetch();
|
|
1160
|
+
}, [refetch]);
|
|
1161
|
+
const setCapabilities = react.useCallback(
|
|
1162
|
+
async (nextCapabilities) => {
|
|
1163
|
+
if (!mero || !groupId || !memberId) {
|
|
1164
|
+
return null;
|
|
1165
|
+
}
|
|
1166
|
+
if (mountedRef.current) {
|
|
1167
|
+
setLoading(true);
|
|
1168
|
+
setError(null);
|
|
1169
|
+
}
|
|
1170
|
+
try {
|
|
1171
|
+
await mero.admin.setMemberCapabilities(groupId, memberId, { capabilities: nextCapabilities });
|
|
1172
|
+
if (mountedRef.current) {
|
|
1173
|
+
setCapabilitiesState(nextCapabilities);
|
|
1174
|
+
}
|
|
1175
|
+
return nextCapabilities;
|
|
1176
|
+
} catch (err) {
|
|
1177
|
+
const errorValue = toError(err);
|
|
1178
|
+
if (mountedRef.current) {
|
|
1179
|
+
setError(errorValue);
|
|
1180
|
+
}
|
|
1181
|
+
return null;
|
|
1182
|
+
} finally {
|
|
1183
|
+
if (mountedRef.current) {
|
|
1184
|
+
setLoading(false);
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
},
|
|
1188
|
+
[groupId, memberId, mero, mountedRef]
|
|
1189
|
+
);
|
|
1190
|
+
return { capabilities, loading, error, refetch, setCapabilities };
|
|
1191
|
+
}
|
|
1192
|
+
function useContextDiscovery(options) {
|
|
1193
|
+
const { mero } = useMero();
|
|
1194
|
+
const [context, setContext] = react.useState(null);
|
|
1195
|
+
const [loading, setLoading] = react.useState(false);
|
|
1196
|
+
const [error, setError] = react.useState(null);
|
|
1197
|
+
const mountedRef = useMountedRef();
|
|
1198
|
+
const knownContextIdsKey = JSON.stringify(options.knownContextIds ?? []);
|
|
1199
|
+
const discover = react.useCallback(async () => {
|
|
1200
|
+
if (!mero) {
|
|
1201
|
+
const notConnectedError = new Error("Not connected");
|
|
1202
|
+
if (mountedRef.current) {
|
|
1203
|
+
setError(notConnectedError);
|
|
1204
|
+
}
|
|
1205
|
+
return null;
|
|
1206
|
+
}
|
|
1207
|
+
const knownContextIds = new Set(options.knownContextIds ?? []);
|
|
1208
|
+
const pollIntervalMs = options.pollIntervalMs ?? 1e3;
|
|
1209
|
+
const timeoutMs = options.timeoutMs ?? 3e4;
|
|
1210
|
+
const deadline = Date.now() + timeoutMs;
|
|
1211
|
+
if (mountedRef.current) {
|
|
1212
|
+
setLoading(true);
|
|
1213
|
+
setError(null);
|
|
1214
|
+
}
|
|
1215
|
+
try {
|
|
1216
|
+
while (Date.now() <= deadline) {
|
|
1217
|
+
if (options.targetAlias) {
|
|
1218
|
+
const aliasMatch = extractAliasContextId(
|
|
1219
|
+
await mero.admin.lookupContextAlias(options.targetAlias)
|
|
1220
|
+
);
|
|
1221
|
+
if (aliasMatch && !knownContextIds.has(aliasMatch)) {
|
|
1222
|
+
const discoveredFromAlias = {
|
|
1223
|
+
contextId: aliasMatch,
|
|
1224
|
+
applicationId: options.applicationId
|
|
1225
|
+
};
|
|
1226
|
+
if (mountedRef.current) {
|
|
1227
|
+
setContext(discoveredFromAlias);
|
|
1228
|
+
}
|
|
1229
|
+
return discoveredFromAlias;
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
const response = await mero.admin.getContextsForApplication(options.applicationId);
|
|
1233
|
+
const contexts = mapApplicationContexts(response.contexts ?? []);
|
|
1234
|
+
const discovered = contexts.find(
|
|
1235
|
+
(applicationContext) => !knownContextIds.has(applicationContext.contextId)
|
|
1236
|
+
);
|
|
1237
|
+
if (discovered) {
|
|
1238
|
+
if (mountedRef.current) {
|
|
1239
|
+
setContext(discovered);
|
|
1240
|
+
}
|
|
1241
|
+
return discovered;
|
|
1242
|
+
}
|
|
1243
|
+
if (Date.now() + pollIntervalMs > deadline) {
|
|
1244
|
+
break;
|
|
1245
|
+
}
|
|
1246
|
+
await sleep(pollIntervalMs);
|
|
1247
|
+
}
|
|
1248
|
+
const timeoutError = new Error(
|
|
1249
|
+
`Timed out discovering a context for application ${options.applicationId}`
|
|
1250
|
+
);
|
|
1251
|
+
if (mountedRef.current) {
|
|
1252
|
+
setContext(null);
|
|
1253
|
+
setError(timeoutError);
|
|
1254
|
+
}
|
|
1255
|
+
return null;
|
|
1256
|
+
} catch (err) {
|
|
1257
|
+
const errorValue = toError(err);
|
|
1258
|
+
if (mountedRef.current) {
|
|
1259
|
+
setContext(null);
|
|
1260
|
+
setError(errorValue);
|
|
1261
|
+
}
|
|
1262
|
+
return null;
|
|
1263
|
+
} finally {
|
|
1264
|
+
if (mountedRef.current) {
|
|
1265
|
+
setLoading(false);
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
}, [
|
|
1269
|
+
knownContextIdsKey,
|
|
1270
|
+
mero,
|
|
1271
|
+
mountedRef,
|
|
1272
|
+
options.applicationId,
|
|
1273
|
+
options.knownContextIds,
|
|
1274
|
+
options.pollIntervalMs,
|
|
1275
|
+
options.targetAlias,
|
|
1276
|
+
options.timeoutMs
|
|
1277
|
+
]);
|
|
1278
|
+
const reset = react.useCallback(() => {
|
|
1279
|
+
if (mountedRef.current) {
|
|
1280
|
+
setContext(null);
|
|
1281
|
+
setError(null);
|
|
1282
|
+
setLoading(false);
|
|
1283
|
+
}
|
|
1284
|
+
}, [mountedRef]);
|
|
1285
|
+
return { context, loading, error, discover, reset };
|
|
1286
|
+
}
|
|
1287
|
+
function useCreateContext() {
|
|
1288
|
+
const { mero } = useMero();
|
|
1289
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1290
|
+
const createContext2 = react.useCallback(
|
|
1291
|
+
async (request) => {
|
|
1292
|
+
if (!mero) return null;
|
|
1293
|
+
return run(() => mero.admin.createContext(request));
|
|
1294
|
+
},
|
|
1295
|
+
[mero, run]
|
|
1296
|
+
);
|
|
1297
|
+
return { createContext: createContext2, loading, error };
|
|
1298
|
+
}
|
|
1299
|
+
function useDeleteContext() {
|
|
1300
|
+
const { mero } = useMero();
|
|
1301
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1302
|
+
const deleteContext = react.useCallback(
|
|
1303
|
+
async (contextId) => {
|
|
1304
|
+
if (!mero) return null;
|
|
1305
|
+
return run(() => mero.admin.deleteContext(contextId));
|
|
1306
|
+
},
|
|
1307
|
+
[mero, run]
|
|
1308
|
+
);
|
|
1309
|
+
return { deleteContext, loading, error };
|
|
1310
|
+
}
|
|
1311
|
+
function useJoinContext() {
|
|
1312
|
+
const { mero } = useMero();
|
|
1313
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1314
|
+
const joinContext = react.useCallback(
|
|
1315
|
+
async (contextId) => {
|
|
1316
|
+
if (!mero) return null;
|
|
1317
|
+
return run(() => mero.admin.joinContext(contextId));
|
|
1318
|
+
},
|
|
1319
|
+
[mero, run]
|
|
1320
|
+
);
|
|
1321
|
+
return { joinContext, loading, error };
|
|
1322
|
+
}
|
|
1323
|
+
function useContextGroup(contextId) {
|
|
1324
|
+
const { mero } = useMero();
|
|
1325
|
+
const [groupId, setGroupId] = react.useState(null);
|
|
1326
|
+
const [loading, setLoading] = react.useState(false);
|
|
1327
|
+
const [error, setError] = react.useState(null);
|
|
1328
|
+
const mountedRef = useMountedRef();
|
|
1329
|
+
const refetch = react.useCallback(async () => {
|
|
1330
|
+
if (!mero || !contextId) {
|
|
1331
|
+
if (mountedRef.current) {
|
|
1332
|
+
setGroupId(null);
|
|
1333
|
+
setError(null);
|
|
1334
|
+
setLoading(false);
|
|
1335
|
+
}
|
|
1336
|
+
return;
|
|
1337
|
+
}
|
|
1338
|
+
if (mountedRef.current) {
|
|
1339
|
+
setLoading(true);
|
|
1340
|
+
setError(null);
|
|
1341
|
+
}
|
|
1342
|
+
try {
|
|
1343
|
+
const result = await mero.admin.getContextGroup(contextId);
|
|
1344
|
+
if (mountedRef.current) {
|
|
1345
|
+
setGroupId(result);
|
|
1346
|
+
}
|
|
1347
|
+
} catch (err) {
|
|
1348
|
+
const errorValue = toError(err);
|
|
1349
|
+
if (mountedRef.current) {
|
|
1350
|
+
setError(errorValue);
|
|
1351
|
+
}
|
|
1352
|
+
} finally {
|
|
1353
|
+
if (mountedRef.current) {
|
|
1354
|
+
setLoading(false);
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
}, [contextId, mero, mountedRef]);
|
|
1358
|
+
react.useEffect(() => {
|
|
1359
|
+
void refetch();
|
|
1360
|
+
}, [refetch]);
|
|
1361
|
+
return { groupId, loading, error, refetch };
|
|
1362
|
+
}
|
|
1363
|
+
function useGroupInfo(groupId) {
|
|
1364
|
+
const { mero } = useMero();
|
|
1365
|
+
const [groupInfo, setGroupInfo] = react.useState(null);
|
|
1366
|
+
const [loading, setLoading] = react.useState(false);
|
|
1367
|
+
const [error, setError] = react.useState(null);
|
|
1368
|
+
const mountedRef = useMountedRef();
|
|
1369
|
+
const refetch = react.useCallback(async () => {
|
|
1370
|
+
if (!mero || !groupId) {
|
|
1371
|
+
if (mountedRef.current) {
|
|
1372
|
+
setGroupInfo(null);
|
|
1373
|
+
setError(null);
|
|
1374
|
+
setLoading(false);
|
|
1375
|
+
}
|
|
1376
|
+
return;
|
|
1377
|
+
}
|
|
1378
|
+
if (mountedRef.current) {
|
|
1379
|
+
setLoading(true);
|
|
1380
|
+
setError(null);
|
|
1381
|
+
}
|
|
1382
|
+
try {
|
|
1383
|
+
const result = await mero.admin.getGroupInfo(groupId);
|
|
1384
|
+
if (mountedRef.current) {
|
|
1385
|
+
setGroupInfo(result);
|
|
1386
|
+
}
|
|
1387
|
+
} catch (err) {
|
|
1388
|
+
const errorValue = toError(err);
|
|
1389
|
+
if (mountedRef.current) {
|
|
1390
|
+
setError(errorValue);
|
|
1391
|
+
}
|
|
1392
|
+
} finally {
|
|
1393
|
+
if (mountedRef.current) {
|
|
1394
|
+
setLoading(false);
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
}, [groupId, mero, mountedRef]);
|
|
1398
|
+
react.useEffect(() => {
|
|
1399
|
+
void refetch();
|
|
1400
|
+
}, [refetch]);
|
|
1401
|
+
return { groupInfo, loading, error, refetch };
|
|
1402
|
+
}
|
|
1403
|
+
function useDeleteGroup() {
|
|
1404
|
+
const { mero } = useMero();
|
|
1405
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1406
|
+
const deleteGroup = react.useCallback(
|
|
1407
|
+
async (groupId, request) => {
|
|
1408
|
+
if (!mero) return null;
|
|
1409
|
+
return run(() => mero.admin.deleteGroup(groupId, request));
|
|
1410
|
+
},
|
|
1411
|
+
[mero, run]
|
|
1412
|
+
);
|
|
1413
|
+
return { deleteGroup, loading, error };
|
|
1414
|
+
}
|
|
1415
|
+
function useSyncGroup() {
|
|
1416
|
+
const { mero } = useMero();
|
|
1417
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1418
|
+
const syncGroup = react.useCallback(
|
|
1419
|
+
async (groupId, request) => {
|
|
1420
|
+
if (!mero) return null;
|
|
1421
|
+
return run(() => mero.admin.syncGroup(groupId, request));
|
|
1422
|
+
},
|
|
1423
|
+
[mero, run]
|
|
1424
|
+
);
|
|
1425
|
+
return { syncGroup, loading, error };
|
|
1426
|
+
}
|
|
1427
|
+
function useAddGroupMembers() {
|
|
1428
|
+
const { mero } = useMero();
|
|
1429
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1430
|
+
const addGroupMembers = react.useCallback(
|
|
1431
|
+
async (groupId, request) => {
|
|
1432
|
+
if (!mero) return null;
|
|
1433
|
+
return run(() => mero.admin.addGroupMembers(groupId, request));
|
|
1434
|
+
},
|
|
1435
|
+
[mero, run]
|
|
1436
|
+
);
|
|
1437
|
+
return { addGroupMembers, loading, error };
|
|
1438
|
+
}
|
|
1439
|
+
function useRemoveGroupMembers() {
|
|
1440
|
+
const { mero } = useMero();
|
|
1441
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1442
|
+
const removeGroupMembers = react.useCallback(
|
|
1443
|
+
async (groupId, request) => {
|
|
1444
|
+
if (!mero) return null;
|
|
1445
|
+
return run(() => mero.admin.removeGroupMembers(groupId, request));
|
|
1446
|
+
},
|
|
1447
|
+
[mero, run]
|
|
1448
|
+
);
|
|
1449
|
+
return { removeGroupMembers, loading, error };
|
|
1450
|
+
}
|
|
1451
|
+
function useNamespaces() {
|
|
1452
|
+
const { mero } = useMero();
|
|
1453
|
+
const [namespaces, setNamespaces] = react.useState([]);
|
|
1454
|
+
const [loading, setLoading] = react.useState(false);
|
|
1455
|
+
const [error, setError] = react.useState(null);
|
|
1456
|
+
const mountedRef = useMountedRef();
|
|
1457
|
+
const refetch = react.useCallback(async () => {
|
|
1458
|
+
if (!mero) return;
|
|
1459
|
+
if (mountedRef.current) {
|
|
1460
|
+
setLoading(true);
|
|
1461
|
+
setError(null);
|
|
1462
|
+
}
|
|
1463
|
+
try {
|
|
1464
|
+
const result = await mero.admin.listNamespaces();
|
|
1465
|
+
if (mountedRef.current) {
|
|
1466
|
+
setNamespaces(result);
|
|
1467
|
+
}
|
|
1468
|
+
} catch (err) {
|
|
1469
|
+
const errorValue = toError(err);
|
|
1470
|
+
if (mountedRef.current) {
|
|
1471
|
+
setError(errorValue);
|
|
1472
|
+
}
|
|
1473
|
+
} finally {
|
|
1474
|
+
if (mountedRef.current) {
|
|
1475
|
+
setLoading(false);
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
}, [mero, mountedRef]);
|
|
1479
|
+
react.useEffect(() => {
|
|
1480
|
+
void refetch();
|
|
1481
|
+
}, [refetch]);
|
|
1482
|
+
return { namespaces, loading, error, refetch };
|
|
1483
|
+
}
|
|
1484
|
+
function useNamespace(namespaceId) {
|
|
1485
|
+
const { mero } = useMero();
|
|
1486
|
+
const [namespace, setNamespace] = react.useState(null);
|
|
1487
|
+
const [loading, setLoading] = react.useState(false);
|
|
1488
|
+
const [error, setError] = react.useState(null);
|
|
1489
|
+
const mountedRef = useMountedRef();
|
|
1490
|
+
const refetch = react.useCallback(async () => {
|
|
1491
|
+
if (!mero || !namespaceId) {
|
|
1492
|
+
if (mountedRef.current) {
|
|
1493
|
+
setNamespace(null);
|
|
1494
|
+
setError(null);
|
|
1495
|
+
setLoading(false);
|
|
1496
|
+
}
|
|
1497
|
+
return;
|
|
1498
|
+
}
|
|
1499
|
+
if (mountedRef.current) {
|
|
1500
|
+
setLoading(true);
|
|
1501
|
+
setError(null);
|
|
1502
|
+
}
|
|
1503
|
+
try {
|
|
1504
|
+
const result = await mero.admin.getNamespace(namespaceId);
|
|
1505
|
+
if (mountedRef.current) {
|
|
1506
|
+
setNamespace(result);
|
|
1507
|
+
}
|
|
1508
|
+
} catch (err) {
|
|
1509
|
+
const errorValue = toError(err);
|
|
1510
|
+
if (mountedRef.current) {
|
|
1511
|
+
setError(errorValue);
|
|
1512
|
+
}
|
|
1513
|
+
} finally {
|
|
1514
|
+
if (mountedRef.current) {
|
|
1515
|
+
setLoading(false);
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1519
|
+
react.useEffect(() => {
|
|
1520
|
+
void refetch();
|
|
1521
|
+
}, [refetch]);
|
|
1522
|
+
return { namespace, loading, error, refetch };
|
|
1523
|
+
}
|
|
1524
|
+
function useNamespaceIdentity(namespaceId) {
|
|
1525
|
+
const { mero } = useMero();
|
|
1526
|
+
const [identity, setIdentity] = react.useState(null);
|
|
1527
|
+
const [loading, setLoading] = react.useState(false);
|
|
1528
|
+
const [error, setError] = react.useState(null);
|
|
1529
|
+
const mountedRef = useMountedRef();
|
|
1530
|
+
const refetch = react.useCallback(async () => {
|
|
1531
|
+
if (!mero || !namespaceId) {
|
|
1532
|
+
if (mountedRef.current) {
|
|
1533
|
+
setIdentity(null);
|
|
1534
|
+
setError(null);
|
|
1535
|
+
setLoading(false);
|
|
1536
|
+
}
|
|
1537
|
+
return;
|
|
1538
|
+
}
|
|
1539
|
+
if (mountedRef.current) {
|
|
1540
|
+
setLoading(true);
|
|
1541
|
+
setError(null);
|
|
1542
|
+
}
|
|
1543
|
+
try {
|
|
1544
|
+
const result = await mero.admin.getNamespaceIdentity(namespaceId);
|
|
1545
|
+
if (mountedRef.current) {
|
|
1546
|
+
setIdentity(result);
|
|
1547
|
+
}
|
|
1548
|
+
} catch (err) {
|
|
1549
|
+
const errorValue = toError(err);
|
|
1550
|
+
if (mountedRef.current) {
|
|
1551
|
+
setError(errorValue);
|
|
1552
|
+
}
|
|
1553
|
+
} finally {
|
|
1554
|
+
if (mountedRef.current) {
|
|
1555
|
+
setLoading(false);
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1559
|
+
react.useEffect(() => {
|
|
1560
|
+
void refetch();
|
|
1561
|
+
}, [refetch]);
|
|
1562
|
+
return { identity, loading, error, refetch };
|
|
1563
|
+
}
|
|
1564
|
+
function useNamespacesForApplication(applicationId) {
|
|
1565
|
+
const { mero } = useMero();
|
|
1566
|
+
const [namespaces, setNamespaces] = react.useState([]);
|
|
1567
|
+
const [loading, setLoading] = react.useState(false);
|
|
1568
|
+
const [error, setError] = react.useState(null);
|
|
1569
|
+
const mountedRef = useMountedRef();
|
|
1570
|
+
const refetch = react.useCallback(async () => {
|
|
1571
|
+
if (!mero || !applicationId) {
|
|
1572
|
+
if (mountedRef.current) {
|
|
1573
|
+
setNamespaces([]);
|
|
1574
|
+
setError(null);
|
|
1575
|
+
setLoading(false);
|
|
1576
|
+
}
|
|
1577
|
+
return;
|
|
1578
|
+
}
|
|
1579
|
+
if (mountedRef.current) {
|
|
1580
|
+
setLoading(true);
|
|
1581
|
+
setError(null);
|
|
1582
|
+
}
|
|
1583
|
+
try {
|
|
1584
|
+
const result = await mero.admin.listNamespacesForApplication(applicationId);
|
|
1585
|
+
if (mountedRef.current) {
|
|
1586
|
+
setNamespaces(result);
|
|
1587
|
+
}
|
|
1588
|
+
} catch (err) {
|
|
1589
|
+
const errorValue = toError(err);
|
|
1590
|
+
if (mountedRef.current) {
|
|
1591
|
+
setError(errorValue);
|
|
1592
|
+
}
|
|
1593
|
+
} finally {
|
|
1594
|
+
if (mountedRef.current) {
|
|
1595
|
+
setLoading(false);
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
}, [applicationId, mero, mountedRef]);
|
|
1599
|
+
react.useEffect(() => {
|
|
1600
|
+
void refetch();
|
|
1601
|
+
}, [refetch]);
|
|
1602
|
+
return { namespaces, loading, error, refetch };
|
|
1603
|
+
}
|
|
1604
|
+
function useCreateNamespace() {
|
|
1605
|
+
const { mero } = useMero();
|
|
1606
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1607
|
+
const createNamespace = react.useCallback(
|
|
1608
|
+
async (request) => {
|
|
1609
|
+
if (!mero) return null;
|
|
1610
|
+
return run(() => mero.admin.createNamespace(request));
|
|
1611
|
+
},
|
|
1612
|
+
[mero, run]
|
|
1613
|
+
);
|
|
1614
|
+
return { createNamespace, loading, error };
|
|
1615
|
+
}
|
|
1616
|
+
function useDeleteNamespace() {
|
|
1617
|
+
const { mero } = useMero();
|
|
1618
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1619
|
+
const deleteNamespace = react.useCallback(
|
|
1620
|
+
async (namespaceId, request) => {
|
|
1621
|
+
if (!mero) return null;
|
|
1622
|
+
return run(() => mero.admin.deleteNamespace(namespaceId, request));
|
|
1623
|
+
},
|
|
1624
|
+
[mero, run]
|
|
1625
|
+
);
|
|
1626
|
+
return { deleteNamespace, loading, error };
|
|
1627
|
+
}
|
|
1628
|
+
function useCreateNamespaceInvitation() {
|
|
1629
|
+
const { mero } = useMero();
|
|
1630
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1631
|
+
const createNamespaceInvitation = react.useCallback(
|
|
1632
|
+
async (namespaceId, request) => {
|
|
1633
|
+
if (!mero) return null;
|
|
1634
|
+
return run(() => mero.admin.createNamespaceInvitation(namespaceId, request));
|
|
1635
|
+
},
|
|
1636
|
+
[mero, run]
|
|
1637
|
+
);
|
|
1638
|
+
return { createNamespaceInvitation, loading, error };
|
|
1639
|
+
}
|
|
1640
|
+
function useJoinNamespace() {
|
|
1641
|
+
const { mero } = useMero();
|
|
1642
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1643
|
+
const joinNamespace = react.useCallback(
|
|
1644
|
+
async (namespaceId, request) => {
|
|
1645
|
+
if (!mero) return null;
|
|
1646
|
+
return run(() => mero.admin.joinNamespace(namespaceId, request));
|
|
1647
|
+
},
|
|
1648
|
+
[mero, run]
|
|
1649
|
+
);
|
|
1650
|
+
return { joinNamespace, loading, error };
|
|
1651
|
+
}
|
|
1652
|
+
function useCreateGroupInNamespace() {
|
|
1653
|
+
const { mero } = useMero();
|
|
1654
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1655
|
+
const createGroupInNamespace = react.useCallback(
|
|
1656
|
+
async (namespaceId, request) => {
|
|
1657
|
+
if (!mero) return null;
|
|
1658
|
+
return run(() => mero.admin.createGroupInNamespace(namespaceId, request));
|
|
1659
|
+
},
|
|
1660
|
+
[mero, run]
|
|
1661
|
+
);
|
|
1662
|
+
return { createGroupInNamespace, loading, error };
|
|
1663
|
+
}
|
|
1664
|
+
function useNamespaceGroups(namespaceId) {
|
|
1665
|
+
const { mero } = useMero();
|
|
1666
|
+
const [groups, setGroups] = react.useState([]);
|
|
1667
|
+
const [loading, setLoading] = react.useState(false);
|
|
1668
|
+
const [error, setError] = react.useState(null);
|
|
1669
|
+
const mountedRef = useMountedRef();
|
|
1670
|
+
const refetch = react.useCallback(async () => {
|
|
1671
|
+
if (!mero || !namespaceId) {
|
|
1672
|
+
if (mountedRef.current) {
|
|
1673
|
+
setGroups([]);
|
|
1674
|
+
setError(null);
|
|
1675
|
+
setLoading(false);
|
|
1676
|
+
}
|
|
1677
|
+
return;
|
|
1678
|
+
}
|
|
1679
|
+
if (mountedRef.current) {
|
|
1680
|
+
setLoading(true);
|
|
1681
|
+
setError(null);
|
|
1682
|
+
}
|
|
1683
|
+
try {
|
|
1684
|
+
const result = await mero.admin.listNamespaceGroups(namespaceId);
|
|
1685
|
+
if (mountedRef.current) {
|
|
1686
|
+
setGroups(result);
|
|
1687
|
+
}
|
|
1688
|
+
} catch (err) {
|
|
1689
|
+
const errorValue = toError(err);
|
|
1690
|
+
if (mountedRef.current) {
|
|
1691
|
+
setError(errorValue);
|
|
1692
|
+
}
|
|
1693
|
+
} finally {
|
|
1694
|
+
if (mountedRef.current) {
|
|
1695
|
+
setLoading(false);
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1699
|
+
react.useEffect(() => {
|
|
1700
|
+
void refetch();
|
|
1701
|
+
}, [refetch]);
|
|
1702
|
+
return { groups, loading, error, refetch };
|
|
1703
|
+
}
|
|
1704
|
+
function useUpdateMemberRole() {
|
|
1705
|
+
const { mero } = useMero();
|
|
1706
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1707
|
+
const updateMemberRole = react.useCallback(
|
|
1708
|
+
async (groupId, identity, request) => {
|
|
1709
|
+
if (!mero) return null;
|
|
1710
|
+
return run(() => mero.admin.updateMemberRole(groupId, identity, request));
|
|
1711
|
+
},
|
|
1712
|
+
[mero, run]
|
|
1713
|
+
);
|
|
1714
|
+
return { updateMemberRole, loading, error };
|
|
1715
|
+
}
|
|
1716
|
+
function useSetDefaultCapabilities() {
|
|
1717
|
+
const { mero } = useMero();
|
|
1718
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1719
|
+
const setDefaultCapabilities = react.useCallback(
|
|
1720
|
+
async (groupId, request) => {
|
|
1721
|
+
if (!mero) return null;
|
|
1722
|
+
return run(() => mero.admin.setDefaultCapabilities(groupId, request));
|
|
1723
|
+
},
|
|
1724
|
+
[mero, run]
|
|
1725
|
+
);
|
|
1726
|
+
return { setDefaultCapabilities, loading, error };
|
|
1727
|
+
}
|
|
1728
|
+
function useSetDefaultVisibility() {
|
|
1729
|
+
const { mero } = useMero();
|
|
1730
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1731
|
+
const setDefaultVisibility = react.useCallback(
|
|
1732
|
+
async (groupId, request) => {
|
|
1733
|
+
if (!mero) return null;
|
|
1734
|
+
return run(() => mero.admin.setDefaultVisibility(groupId, request));
|
|
1735
|
+
},
|
|
1736
|
+
[mero, run]
|
|
1737
|
+
);
|
|
1738
|
+
return { setDefaultVisibility, loading, error };
|
|
1739
|
+
}
|
|
1740
|
+
function useSetTeeAdmissionPolicy() {
|
|
1741
|
+
const { mero } = useMero();
|
|
1742
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1743
|
+
const setTeeAdmissionPolicy = react.useCallback(
|
|
1744
|
+
async (groupId, request) => {
|
|
1745
|
+
if (!mero) return null;
|
|
1746
|
+
return run(() => mero.admin.setTeeAdmissionPolicy(groupId, request));
|
|
1747
|
+
},
|
|
1748
|
+
[mero, run]
|
|
1749
|
+
);
|
|
1750
|
+
return { setTeeAdmissionPolicy, loading, error };
|
|
1751
|
+
}
|
|
1752
|
+
function useUpdateGroupSettings() {
|
|
1753
|
+
const { mero } = useMero();
|
|
1754
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1755
|
+
const updateGroupSettings = react.useCallback(
|
|
1756
|
+
async (groupId, request) => {
|
|
1757
|
+
if (!mero) return null;
|
|
1758
|
+
return run(() => mero.admin.updateGroupSettings(groupId, request));
|
|
1759
|
+
},
|
|
1760
|
+
[mero, run]
|
|
1761
|
+
);
|
|
1762
|
+
return { updateGroupSettings, loading, error };
|
|
1763
|
+
}
|
|
1764
|
+
function useSetGroupAlias() {
|
|
1765
|
+
const { mero } = useMero();
|
|
1766
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1767
|
+
const setGroupAlias = react.useCallback(
|
|
1768
|
+
async (groupId, request) => {
|
|
1769
|
+
if (!mero) return null;
|
|
1770
|
+
return run(() => mero.admin.setGroupAlias(groupId, request));
|
|
1771
|
+
},
|
|
1772
|
+
[mero, run]
|
|
1773
|
+
);
|
|
1774
|
+
return { setGroupAlias, loading, error };
|
|
1775
|
+
}
|
|
1776
|
+
function useSetMemberAlias() {
|
|
1777
|
+
const { mero } = useMero();
|
|
1778
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1779
|
+
const setMemberAlias = react.useCallback(
|
|
1780
|
+
async (groupId, identity, request) => {
|
|
1781
|
+
if (!mero) return null;
|
|
1782
|
+
return run(() => mero.admin.setMemberAlias(groupId, identity, request));
|
|
1783
|
+
},
|
|
1784
|
+
[mero, run]
|
|
1785
|
+
);
|
|
1786
|
+
return { setMemberAlias, loading, error };
|
|
1787
|
+
}
|
|
1788
|
+
function useRegisterGroupSigningKey() {
|
|
1789
|
+
const { mero } = useMero();
|
|
1790
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1791
|
+
const registerGroupSigningKey = react.useCallback(
|
|
1792
|
+
async (groupId, request) => {
|
|
1793
|
+
if (!mero) return null;
|
|
1794
|
+
return run(() => mero.admin.registerGroupSigningKey(groupId, request));
|
|
1795
|
+
},
|
|
1796
|
+
[mero, run]
|
|
1797
|
+
);
|
|
1798
|
+
return { registerGroupSigningKey, loading, error };
|
|
1799
|
+
}
|
|
1800
|
+
function useUpgradeGroup() {
|
|
1801
|
+
const { mero } = useMero();
|
|
1802
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1803
|
+
const upgradeGroup = react.useCallback(
|
|
1804
|
+
async (groupId, request) => {
|
|
1805
|
+
if (!mero) return null;
|
|
1806
|
+
return run(() => mero.admin.upgradeGroup(groupId, request));
|
|
1807
|
+
},
|
|
1808
|
+
[mero, run]
|
|
1809
|
+
);
|
|
1810
|
+
return { upgradeGroup, loading, error };
|
|
1811
|
+
}
|
|
1812
|
+
function useGroupUpgradeStatus(groupId) {
|
|
1813
|
+
const { mero } = useMero();
|
|
1814
|
+
const [upgradeStatus, setUpgradeStatus] = react.useState(null);
|
|
1815
|
+
const [loading, setLoading] = react.useState(false);
|
|
1816
|
+
const [error, setError] = react.useState(null);
|
|
1817
|
+
const mountedRef = useMountedRef();
|
|
1818
|
+
const refetch = react.useCallback(async () => {
|
|
1819
|
+
if (!mero || !groupId) {
|
|
1820
|
+
if (mountedRef.current) {
|
|
1821
|
+
setUpgradeStatus(null);
|
|
1822
|
+
setError(null);
|
|
1823
|
+
setLoading(false);
|
|
1824
|
+
}
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
if (mountedRef.current) {
|
|
1828
|
+
setLoading(true);
|
|
1829
|
+
setError(null);
|
|
1830
|
+
}
|
|
1831
|
+
try {
|
|
1832
|
+
const result = await mero.admin.getGroupUpgradeStatus(groupId);
|
|
1833
|
+
if (mountedRef.current) {
|
|
1834
|
+
setUpgradeStatus(result);
|
|
1835
|
+
}
|
|
1836
|
+
} catch (err) {
|
|
1837
|
+
const errorValue = toError(err);
|
|
1838
|
+
if (mountedRef.current) {
|
|
1839
|
+
setError(errorValue);
|
|
1840
|
+
}
|
|
1841
|
+
} finally {
|
|
1842
|
+
if (mountedRef.current) {
|
|
1843
|
+
setLoading(false);
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
}, [groupId, mero, mountedRef]);
|
|
1847
|
+
react.useEffect(() => {
|
|
1848
|
+
void refetch();
|
|
1849
|
+
}, [refetch]);
|
|
1850
|
+
return { upgradeStatus, loading, error, refetch };
|
|
1851
|
+
}
|
|
1852
|
+
function useRetryGroupUpgrade() {
|
|
1853
|
+
const { mero } = useMero();
|
|
1854
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1855
|
+
const retryGroupUpgrade = react.useCallback(
|
|
1856
|
+
async (groupId, request) => {
|
|
1857
|
+
if (!mero) return null;
|
|
1858
|
+
return run(() => mero.admin.retryGroupUpgrade(groupId, request));
|
|
1859
|
+
},
|
|
1860
|
+
[mero, run]
|
|
1861
|
+
);
|
|
1862
|
+
return { retryGroupUpgrade, loading, error };
|
|
1863
|
+
}
|
|
1864
|
+
function useNestGroup() {
|
|
1865
|
+
const { mero } = useMero();
|
|
1866
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1867
|
+
const nestGroup = react.useCallback(
|
|
1868
|
+
async (parentGroupId, request) => {
|
|
1869
|
+
if (!mero) return null;
|
|
1870
|
+
return run(() => mero.admin.nestGroup(parentGroupId, request));
|
|
1871
|
+
},
|
|
1872
|
+
[mero, run]
|
|
1873
|
+
);
|
|
1874
|
+
return { nestGroup, loading, error };
|
|
1875
|
+
}
|
|
1876
|
+
function useUnnestGroup() {
|
|
1877
|
+
const { mero } = useMero();
|
|
1878
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1879
|
+
const unnestGroup = react.useCallback(
|
|
1880
|
+
async (parentGroupId, request) => {
|
|
1881
|
+
if (!mero) return null;
|
|
1882
|
+
return run(() => mero.admin.unnestGroup(parentGroupId, request));
|
|
1883
|
+
},
|
|
1884
|
+
[mero, run]
|
|
1885
|
+
);
|
|
1886
|
+
return { unnestGroup, loading, error };
|
|
1887
|
+
}
|
|
1888
|
+
function useSubgroups(groupId) {
|
|
1889
|
+
const { mero } = useMero();
|
|
1890
|
+
const [subgroups, setSubgroups] = react.useState([]);
|
|
1891
|
+
const [loading, setLoading] = react.useState(false);
|
|
1892
|
+
const [error, setError] = react.useState(null);
|
|
1893
|
+
const mountedRef = useMountedRef();
|
|
1894
|
+
const refetch = react.useCallback(async () => {
|
|
1895
|
+
if (!mero || !groupId) {
|
|
1896
|
+
if (mountedRef.current) {
|
|
1897
|
+
setSubgroups([]);
|
|
1898
|
+
setError(null);
|
|
1899
|
+
setLoading(false);
|
|
1900
|
+
}
|
|
1901
|
+
return;
|
|
1902
|
+
}
|
|
1903
|
+
if (mountedRef.current) {
|
|
1904
|
+
setLoading(true);
|
|
1905
|
+
setError(null);
|
|
1906
|
+
}
|
|
1907
|
+
try {
|
|
1908
|
+
const result = await mero.admin.listSubgroups(groupId);
|
|
1909
|
+
if (mountedRef.current) {
|
|
1910
|
+
setSubgroups(result);
|
|
1911
|
+
}
|
|
1912
|
+
} catch (err) {
|
|
1913
|
+
const errorValue = toError(err);
|
|
1914
|
+
if (mountedRef.current) {
|
|
1915
|
+
setError(errorValue);
|
|
1916
|
+
}
|
|
1917
|
+
} finally {
|
|
1918
|
+
if (mountedRef.current) {
|
|
1919
|
+
setLoading(false);
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
}, [groupId, mero, mountedRef]);
|
|
1923
|
+
react.useEffect(() => {
|
|
1924
|
+
void refetch();
|
|
1925
|
+
}, [refetch]);
|
|
1926
|
+
return { subgroups, loading, error, refetch };
|
|
1927
|
+
}
|
|
1928
|
+
function useDetachContextFromGroup() {
|
|
1929
|
+
const { mero } = useMero();
|
|
1930
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1931
|
+
const detachContextFromGroup = react.useCallback(
|
|
1932
|
+
async (groupId, contextId, request) => {
|
|
1933
|
+
if (!mero) return null;
|
|
1934
|
+
return run(() => mero.admin.detachContextFromGroup(groupId, contextId, request));
|
|
1935
|
+
},
|
|
1936
|
+
[mero, run]
|
|
1937
|
+
);
|
|
1938
|
+
return { detachContextFromGroup, loading, error };
|
|
1939
|
+
}
|
|
891
1940
|
|
|
892
|
-
Object.defineProperty(exports, "MeroJs", {
|
|
893
|
-
enumerable: true,
|
|
894
|
-
get: function () { return meroJs.MeroJs; }
|
|
895
|
-
});
|
|
896
1941
|
exports.AppMode = AppMode;
|
|
897
1942
|
exports.ConnectButton = ConnectButton;
|
|
898
1943
|
exports.ConnectionType = ConnectionType;
|
|
899
|
-
exports.EventStreamMode = EventStreamMode;
|
|
900
1944
|
exports.LoginModal = LoginModal;
|
|
901
1945
|
exports.MeroContext = MeroContext;
|
|
902
1946
|
exports.MeroProvider = MeroProvider;
|
|
903
1947
|
exports.clearAllStorage = clearAllStorage;
|
|
904
1948
|
exports.clearApplicationId = clearApplicationId;
|
|
1949
|
+
exports.clearContextId = clearContextId;
|
|
1950
|
+
exports.clearContextIdentity = clearContextIdentity;
|
|
905
1951
|
exports.clearNodeUrl = clearNodeUrl;
|
|
906
1952
|
exports.getApplicationId = getApplicationId;
|
|
1953
|
+
exports.getContextId = getContextId;
|
|
1954
|
+
exports.getContextIdentity = getContextIdentity;
|
|
907
1955
|
exports.getNodeUrl = getNodeUrl;
|
|
908
1956
|
exports.localStorageTokenStorage = localStorageTokenStorage;
|
|
909
1957
|
exports.setApplicationId = setApplicationId;
|
|
1958
|
+
exports.setContextId = setContextId;
|
|
1959
|
+
exports.setContextIdentity = setContextIdentity;
|
|
910
1960
|
exports.setNodeUrl = setNodeUrl;
|
|
1961
|
+
exports.useAddGroupMembers = useAddGroupMembers;
|
|
1962
|
+
exports.useApplicationContexts = useApplicationContexts;
|
|
1963
|
+
exports.useContextDiscovery = useContextDiscovery;
|
|
1964
|
+
exports.useContextGroup = useContextGroup;
|
|
1965
|
+
exports.useContexts = useContexts;
|
|
1966
|
+
exports.useCreateContext = useCreateContext;
|
|
1967
|
+
exports.useCreateGroupInNamespace = useCreateGroupInNamespace;
|
|
1968
|
+
exports.useCreateNamespace = useCreateNamespace;
|
|
1969
|
+
exports.useCreateNamespaceInvitation = useCreateNamespaceInvitation;
|
|
1970
|
+
exports.useDeleteContext = useDeleteContext;
|
|
1971
|
+
exports.useDeleteGroup = useDeleteGroup;
|
|
1972
|
+
exports.useDeleteNamespace = useDeleteNamespace;
|
|
1973
|
+
exports.useDetachContextFromGroup = useDetachContextFromGroup;
|
|
1974
|
+
exports.useExecute = useExecute;
|
|
1975
|
+
exports.useGroupCapabilities = useGroupCapabilities;
|
|
1976
|
+
exports.useGroupContexts = useGroupContexts;
|
|
1977
|
+
exports.useGroupInfo = useGroupInfo;
|
|
1978
|
+
exports.useGroupInvitations = useGroupInvitations;
|
|
1979
|
+
exports.useGroupMembers = useGroupMembers;
|
|
1980
|
+
exports.useGroupUpgradeStatus = useGroupUpgradeStatus;
|
|
1981
|
+
exports.useJoinContext = useJoinContext;
|
|
1982
|
+
exports.useJoinGroup = useJoinGroup;
|
|
1983
|
+
exports.useJoinNamespace = useJoinNamespace;
|
|
911
1984
|
exports.useMero = useMero;
|
|
1985
|
+
exports.useNamespace = useNamespace;
|
|
1986
|
+
exports.useNamespaceGroups = useNamespaceGroups;
|
|
1987
|
+
exports.useNamespaceIdentity = useNamespaceIdentity;
|
|
1988
|
+
exports.useNamespaces = useNamespaces;
|
|
1989
|
+
exports.useNamespacesForApplication = useNamespacesForApplication;
|
|
1990
|
+
exports.useNestGroup = useNestGroup;
|
|
1991
|
+
exports.useRegisterGroupSigningKey = useRegisterGroupSigningKey;
|
|
1992
|
+
exports.useRemoveGroupMembers = useRemoveGroupMembers;
|
|
1993
|
+
exports.useRetryGroupUpgrade = useRetryGroupUpgrade;
|
|
1994
|
+
exports.useSetDefaultCapabilities = useSetDefaultCapabilities;
|
|
1995
|
+
exports.useSetDefaultVisibility = useSetDefaultVisibility;
|
|
1996
|
+
exports.useSetGroupAlias = useSetGroupAlias;
|
|
1997
|
+
exports.useSetMemberAlias = useSetMemberAlias;
|
|
1998
|
+
exports.useSetTeeAdmissionPolicy = useSetTeeAdmissionPolicy;
|
|
1999
|
+
exports.useSubgroups = useSubgroups;
|
|
2000
|
+
exports.useSubscription = useSubscription;
|
|
2001
|
+
exports.useSyncGroup = useSyncGroup;
|
|
2002
|
+
exports.useUnnestGroup = useUnnestGroup;
|
|
2003
|
+
exports.useUpdateGroupSettings = useUpdateGroupSettings;
|
|
2004
|
+
exports.useUpdateMemberRole = useUpdateMemberRole;
|
|
2005
|
+
exports.useUpgradeGroup = useUpgradeGroup;
|
|
2006
|
+
Object.keys(meroJs).forEach(function (k) {
|
|
2007
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
2008
|
+
enumerable: true,
|
|
2009
|
+
get: function () { return meroJs[k]; }
|
|
2010
|
+
});
|
|
2011
|
+
});
|
|
912
2012
|
//# sourceMappingURL=index.cjs.map
|
|
913
2013
|
//# sourceMappingURL=index.cjs.map
|