@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/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
- return true;
46
+ _storageAvailable = true;
28
47
  } catch {
29
- return false;
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
- // src/types.ts
119
- var AppMode = /* @__PURE__ */ ((AppMode2) => {
120
- AppMode2["SingleContext"] = "single-context";
121
- AppMode2["MultiContext"] = "multi-context";
122
- AppMode2["Admin"] = "admin";
123
- return AppMode2;
124
- })(AppMode || {});
125
- var ConnectionType = /* @__PURE__ */ ((ConnectionType2) => {
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 redirectToAuthLogin(params) {
164
- const authParams = new URLSearchParams();
165
- authParams.append("callback-url", params.callbackUrl);
166
- authParams.append("permissions", params.permissions.join(","));
167
- authParams.append("mode", params.mode);
168
- if (params.packageName) {
169
- authParams.append("package-name", params.packageName);
170
- if (params.packageVersion) {
171
- authParams.append("package-version", params.packageVersion);
172
- }
173
- if (params.registryUrl) {
174
- authParams.append("registry-url", params.registryUrl);
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
- authParams.append("app-url", params.nodeUrl);
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() || propApplicationId || null
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
- tokenStorage: localStorageTokenStorage,
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.contexts.listContexts();
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
- if (callbackUrl.hash) {
316
- const hashParams = new URLSearchParams(callbackUrl.hash.substring(1));
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, propApplicationId, applicationPath]
252
+ [mode, packageName, packageVersion, registryUrl]
336
253
  );
337
- const logout = react.useCallback(async () => {
254
+ const logout = react.useCallback(() => {
338
255
  if (meroRef.current) {
339
- await meroRef.current.clearToken();
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
- console.log("[mero-react] Init starting...");
352
- console.log("[mero-react] Current URL:", window.location.href);
353
- console.log("[mero-react] Stored nodeUrl:", getNodeUrl());
354
- console.log("[mero-react] Stored contextId:", getContextId());
355
- console.log("[mero-react] Stored applicationId:", getApplicationId());
356
- const hasCallback = processAuthCallback();
357
- console.log("[mero-react] hasCallback:", hasCallback);
358
- const savedUrl = getNodeUrl();
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 (hasCallback) {
311
+ } else if (callback) {
371
312
  setMero(instance);
372
- setIsAuthenticated(false);
373
313
  }
374
314
  setIsLoading(false);
375
315
  };
376
- init();
377
- }, [createMeroInstance, checkAuth, processAuthCallback]);
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
- const interval = setInterval(async () => {
381
- const instance = meroRef.current;
382
- if (!instance) return;
383
- const healthy = await checkAuth(instance);
384
- if (!healthy && isOnline) {
385
- setIsOnline(false);
386
- } else if (healthy && !isOnline) {
387
- setIsOnline(true);
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
- }, 5e3);
390
- return () => clearInterval(interval);
391
- }, [isAuthenticated, isOnline, checkAuth]);
392
- react.useEffect(() => {
393
- if (propApplicationId && !applicationId) {
394
- setApplicationIdState(propApplicationId);
395
- }
396
- }, [propApplicationId, applicationId]);
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 === void 0) {
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