@calimero-network/mero-react 4.4.0 → 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 +127 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -2
- package/dist/index.d.ts +42 -2
- package/dist/index.js +126 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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;
|