@calimero-network/mero-react 4.4.1 → 4.5.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
@@ -1296,6 +1296,29 @@ function ConnectButton({
1296
1296
  }
1297
1297
  );
1298
1298
  }
1299
+
1300
+ // src/utils/base58.ts
1301
+ var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
1302
+ function base58ToHex(input) {
1303
+ const bytes = [];
1304
+ for (const char of input) {
1305
+ let carry = ALPHABET.indexOf(char);
1306
+ if (carry === -1) throw new Error(`invalid base58 character: ${char}`);
1307
+ for (let i = 0; i < bytes.length; i++) {
1308
+ carry += bytes[i] * 58;
1309
+ bytes[i] = carry & 255;
1310
+ carry >>= 8;
1311
+ }
1312
+ while (carry > 0) {
1313
+ bytes.push(carry & 255);
1314
+ carry >>= 8;
1315
+ }
1316
+ }
1317
+ for (let k = 0; k < input.length && input[k] === "1"; k++) bytes.push(0);
1318
+ return bytes.reverse().map((b) => b.toString(16).padStart(2, "0")).join("");
1319
+ }
1320
+
1321
+ // src/hooks/index.ts
1299
1322
  function toError(err) {
1300
1323
  return err instanceof Error ? err : new Error(String(err));
1301
1324
  }
@@ -2117,6 +2140,18 @@ function useUpgradeGroup() {
2117
2140
  );
2118
2141
  return { upgradeGroup, loading, error };
2119
2142
  }
2143
+ function useInstallFromRegistry() {
2144
+ const { mero } = useMero();
2145
+ const { loading, error, run } = useAsyncMutation();
2146
+ const installFromRegistry = react.useCallback(
2147
+ async (registryUrl, packageName, version) => {
2148
+ if (!mero) return null;
2149
+ return run(() => mero.admin.installFromRegistry(registryUrl, packageName, version));
2150
+ },
2151
+ [mero, run]
2152
+ );
2153
+ return { installFromRegistry, loading, error };
2154
+ }
2120
2155
  function useResyncContext() {
2121
2156
  const { mero } = useMero();
2122
2157
  const { loading, error, run } = useAsyncMutation();
@@ -2393,6 +2428,96 @@ function useLatestVersion(registryUrl, packageName, currentVersion) {
2393
2428
  const updateAvailable = latestVersion != null && currentVersion != null && meroJs.compareSemver(latestVersion, currentVersion) > 0;
2394
2429
  return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };
2395
2430
  }
2431
+ var EMPTY_GROUP_APP_VERSION = {
2432
+ version: null,
2433
+ applicationId: null,
2434
+ pendingApply: false,
2435
+ upgradePolicy: null,
2436
+ activeUpgrade: null
2437
+ };
2438
+ function isZeroAppKey(appKey) {
2439
+ return !appKey || /^0+$/.test(appKey);
2440
+ }
2441
+ function useGroupAppVersion(groupId) {
2442
+ const { mero } = useMero();
2443
+ const [data, setData] = react.useState(EMPTY_GROUP_APP_VERSION);
2444
+ const [loading, setLoading] = react.useState(false);
2445
+ const [error, setError] = react.useState(null);
2446
+ const mountedRef = useMountedRef();
2447
+ const reqRef = react.useRef(0);
2448
+ const refetch = react.useCallback(async () => {
2449
+ const seq = ++reqRef.current;
2450
+ if (!mero || !groupId) {
2451
+ if (mountedRef.current) {
2452
+ setData(EMPTY_GROUP_APP_VERSION);
2453
+ setError(null);
2454
+ setLoading(false);
2455
+ }
2456
+ return;
2457
+ }
2458
+ if (mountedRef.current) {
2459
+ setLoading(true);
2460
+ setError(null);
2461
+ }
2462
+ try {
2463
+ const namespaces = await mero.admin.listNamespaces();
2464
+ const namespace = namespaces.find((entry) => entry.namespaceId === groupId);
2465
+ let appKey;
2466
+ let applicationId;
2467
+ let upgradePolicy;
2468
+ let activeUpgrade = null;
2469
+ if (namespace) {
2470
+ appKey = namespace.appKey;
2471
+ applicationId = namespace.targetApplicationId;
2472
+ upgradePolicy = namespace.upgradePolicy;
2473
+ } else {
2474
+ const info = await mero.admin.getGroupInfo(groupId);
2475
+ appKey = info.appKey;
2476
+ applicationId = info.targetApplicationId;
2477
+ upgradePolicy = info.upgradePolicy;
2478
+ activeUpgrade = info.activeUpgrade ?? null;
2479
+ }
2480
+ let version = null;
2481
+ let pendingApply = false;
2482
+ if (applicationId) {
2483
+ const { application } = await mero.admin.getApplication(applicationId);
2484
+ version = application?.version ?? null;
2485
+ if (application && !isZeroAppKey(appKey)) {
2486
+ const installedHex = base58ToHex(application.blob.bytecode).toLowerCase();
2487
+ pendingApply = appKey.toLowerCase() !== installedHex;
2488
+ }
2489
+ }
2490
+ if (mountedRef.current && seq === reqRef.current) {
2491
+ setData({ version, applicationId, pendingApply, upgradePolicy, activeUpgrade });
2492
+ }
2493
+ } catch (err) {
2494
+ const errorValue = toError(err);
2495
+ if (mountedRef.current && seq === reqRef.current) {
2496
+ setError(errorValue);
2497
+ }
2498
+ } finally {
2499
+ if (mountedRef.current && seq === reqRef.current) {
2500
+ setLoading(false);
2501
+ }
2502
+ }
2503
+ }, [groupId, mero, mountedRef]);
2504
+ react.useEffect(() => {
2505
+ reqRef.current += 1;
2506
+ setData(EMPTY_GROUP_APP_VERSION);
2507
+ setError(null);
2508
+ }, [groupId]);
2509
+ react.useEffect(() => {
2510
+ void refetch();
2511
+ }, [refetch]);
2512
+ react.useEffect(() => {
2513
+ if (!mero?.events || !groupId) return;
2514
+ const off = mero.events.onAppVersionChanged(() => {
2515
+ if (mountedRef.current) void refetch();
2516
+ });
2517
+ return off;
2518
+ }, [mero, groupId, refetch, mountedRef]);
2519
+ return { ...data, loading, error, refetch };
2520
+ }
2396
2521
  function useMyAuthoredMigration(contextId) {
2397
2522
  const { mero } = useMero();
2398
2523
  const [summary, setSummary] = react.useState(null);
@@ -2602,6 +2727,7 @@ exports.useDeleteGroup = useDeleteGroup;
2602
2727
  exports.useDeleteNamespace = useDeleteNamespace;
2603
2728
  exports.useDetachContextFromGroup = useDetachContextFromGroup;
2604
2729
  exports.useExecute = useExecute;
2730
+ exports.useGroupAppVersion = useGroupAppVersion;
2605
2731
  exports.useGroupCapabilities = useGroupCapabilities;
2606
2732
  exports.useGroupContexts = useGroupContexts;
2607
2733
  exports.useGroupInfo = useGroupInfo;
@@ -2609,6 +2735,7 @@ exports.useGroupInvitations = useGroupInvitations;
2609
2735
  exports.useGroupMembers = useGroupMembers;
2610
2736
  exports.useGroupMetadata = useGroupMetadata;
2611
2737
  exports.useGroupUpgradeStatus = useGroupUpgradeStatus;
2738
+ exports.useInstallFromRegistry = useInstallFromRegistry;
2612
2739
  exports.useJoinContext = useJoinContext;
2613
2740
  exports.useJoinGroup = useJoinGroup;
2614
2741
  exports.useJoinNamespace = useJoinNamespace;