@calimero-network/mero-react 2.4.0 → 2.6.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.d.cts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import React__default, { CSSProperties } from 'react';
3
+ import React__default, { CSSProperties, ReactNode } from 'react';
4
4
  import * as _calimero_network_mero_js from '@calimero-network/mero-js';
5
- import { MeroJs, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, GroupMember, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, Namespace, SubgroupEntry, NamespaceIdentity, NestGroupRequest, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UnnestGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
5
+ import { MeroJs, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, GroupMember, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, NestGroupRequest, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UnnestGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
6
6
  export * from '@calimero-network/mero-js';
7
7
  export { CAPABILITIES, MetadataRecord, hasCap, withCap, withoutCap } from '@calimero-network/mero-js';
8
8
 
@@ -267,6 +267,36 @@ interface CalimeroLogoProps extends React__default.SVGAttributes<SVGSVGElement>
267
267
  }
268
268
  declare function CalimeroLogo({ size, color, style, ...rest }: CalimeroLogoProps): react_jsx_runtime.JSX.Element;
269
269
 
270
+ interface MigrationPendingBannerProps {
271
+ /** Context whose authored entries to check / convert. */
272
+ contextId: string;
273
+ className?: string;
274
+ /** Override the default prompt text. */
275
+ children?: ReactNode;
276
+ /** Fired once a convert leaves nothing pending (`remaining === 0`). */
277
+ onMigrated?: () => void;
278
+ }
279
+ /**
280
+ * Shows only when the current identity has entries below the target schema
281
+ * (skew #1). A single button runs the one-tap `migrate_my_entries` convert and
282
+ * the banner clears itself once nothing is pending.
283
+ */
284
+ declare function MigrationPendingBanner({ contextId, className, children, onMigrated, }: MigrationPendingBannerProps): react_jsx_runtime.JSX.Element | null;
285
+
286
+ interface MigrationAdminPanelProps {
287
+ /** Namespace whose migration rollup to display. */
288
+ namespaceId: string;
289
+ /** Re-fetch interval; migration facts arrive via heartbeat gossip. */
290
+ pollIntervalMs?: number;
291
+ className?: string;
292
+ }
293
+ /**
294
+ * Operator view of a namespace's migration rollup (skew #3): the cohort
295
+ * counters, `membersPendingSignature`, and a per-member table. Read-only —
296
+ * pair with the upgrade-trigger hooks to drive a migration.
297
+ */
298
+ declare function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps): react_jsx_runtime.JSX.Element;
299
+
270
300
  /**
271
301
  * Shape accepted by the metadata-setter hooks — re-exported from mero-js so
272
302
  * callers have one canonical type. A `set*Metadata` call **replaces the whole
@@ -548,6 +578,72 @@ declare function useDetachContextFromGroup(): {
548
578
  loading: boolean;
549
579
  error: Error | null;
550
580
  };
581
+ /**
582
+ * Migration-status rollup for a namespace (skew #3). Migration facts arrive via
583
+ * heartbeat gossip (no SSE), so liveness is polling: pass `pollIntervalMs` to
584
+ * re-fetch on an interval. Derived counters are null-safe before the first load.
585
+ */
586
+ declare function useMigrationStatus(namespaceId?: string | null, options?: {
587
+ pollIntervalMs?: number;
588
+ }): {
589
+ status: MigrationStatus | null;
590
+ rollup: MigrationStatusRollup | null;
591
+ members: MemberMigrationStatusEntry[];
592
+ allMigrated: boolean;
593
+ membersPendingSignature: number;
594
+ /** Members whose migrate aborted (migration-check failed or apply errored). */
595
+ failed: number;
596
+ loading: boolean;
597
+ error: Error | null;
598
+ refetch: () => Promise<void>;
599
+ };
600
+ /**
601
+ * Bundle-version skew (#2): reads the context's installed `applicationVersion`
602
+ * (semver) and compares it to the app-declared `expected` build constant. Any
603
+ * mismatch (either direction) is `isStale` → "reload to update". Subscribes to
604
+ * `AppVersionChanged` so a live flip updates `appVersion` without a refetch.
605
+ */
606
+ declare function useAppVersion(contextId?: string | null, expected?: string): {
607
+ appVersion: string | undefined;
608
+ expected: string | undefined;
609
+ isStale: boolean;
610
+ loading: boolean;
611
+ error: Error | null;
612
+ refetch: () => Promise<void>;
613
+ };
614
+ /**
615
+ * "Is a newer version available?" for an Updates view. Reads a package's
616
+ * published versions from the registry and compares the newest to the running
617
+ * `currentVersion` (e.g. a context's `applicationVersion`). `updateAvailable`
618
+ * is true only when the registry's newest is strictly greater. This is the
619
+ * registry-side check the admin acts on; gate rendering on admin status at the
620
+ * call site. Pure read — fetching nothing until both `registryUrl` and
621
+ * `packageName` are provided.
622
+ */
623
+ declare function useLatestVersion(registryUrl?: string | null, packageName?: string | null, currentVersion?: string | null): {
624
+ versions: string[];
625
+ latestVersion: string;
626
+ currentVersion: string | null | undefined;
627
+ updateAvailable: boolean;
628
+ loading: boolean;
629
+ error: Error | null;
630
+ refetch: () => Promise<void>;
631
+ };
632
+ /**
633
+ * The caller's own identity-gated entries pending re-signature (skew #1).
634
+ * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
635
+ * the one-tap `migrate_my_entries` convert and folds the resulting `remaining`
636
+ * back into the count.
637
+ */
638
+ declare function useMyAuthoredMigration(contextId?: string | null): {
639
+ summary: MigrateMyEntriesSummary | null;
640
+ pendingCount: number;
641
+ pending: boolean;
642
+ authorize: () => Promise<MigrateMyEntriesSummary | null>;
643
+ loading: boolean;
644
+ error: Error | null;
645
+ refresh: () => Promise<void>;
646
+ };
551
647
 
552
648
  /**
553
649
  * Storage utilities for mero-react
@@ -613,4 +709,4 @@ declare function clearContextIdentity(): void;
613
709
  */
614
710
  declare function clearAllStorage(): void;
615
711
 
616
- export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useMemberMetadata, useMero, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
712
+ export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import React__default, { CSSProperties } from 'react';
3
+ import React__default, { CSSProperties, ReactNode } from 'react';
4
4
  import * as _calimero_network_mero_js from '@calimero-network/mero-js';
5
- import { MeroJs, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, GroupMember, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, Namespace, SubgroupEntry, NamespaceIdentity, NestGroupRequest, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UnnestGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
5
+ import { MeroJs, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, GroupMember, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, NestGroupRequest, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UnnestGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
6
6
  export * from '@calimero-network/mero-js';
7
7
  export { CAPABILITIES, MetadataRecord, hasCap, withCap, withoutCap } from '@calimero-network/mero-js';
8
8
 
@@ -267,6 +267,36 @@ interface CalimeroLogoProps extends React__default.SVGAttributes<SVGSVGElement>
267
267
  }
268
268
  declare function CalimeroLogo({ size, color, style, ...rest }: CalimeroLogoProps): react_jsx_runtime.JSX.Element;
269
269
 
270
+ interface MigrationPendingBannerProps {
271
+ /** Context whose authored entries to check / convert. */
272
+ contextId: string;
273
+ className?: string;
274
+ /** Override the default prompt text. */
275
+ children?: ReactNode;
276
+ /** Fired once a convert leaves nothing pending (`remaining === 0`). */
277
+ onMigrated?: () => void;
278
+ }
279
+ /**
280
+ * Shows only when the current identity has entries below the target schema
281
+ * (skew #1). A single button runs the one-tap `migrate_my_entries` convert and
282
+ * the banner clears itself once nothing is pending.
283
+ */
284
+ declare function MigrationPendingBanner({ contextId, className, children, onMigrated, }: MigrationPendingBannerProps): react_jsx_runtime.JSX.Element | null;
285
+
286
+ interface MigrationAdminPanelProps {
287
+ /** Namespace whose migration rollup to display. */
288
+ namespaceId: string;
289
+ /** Re-fetch interval; migration facts arrive via heartbeat gossip. */
290
+ pollIntervalMs?: number;
291
+ className?: string;
292
+ }
293
+ /**
294
+ * Operator view of a namespace's migration rollup (skew #3): the cohort
295
+ * counters, `membersPendingSignature`, and a per-member table. Read-only —
296
+ * pair with the upgrade-trigger hooks to drive a migration.
297
+ */
298
+ declare function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps): react_jsx_runtime.JSX.Element;
299
+
270
300
  /**
271
301
  * Shape accepted by the metadata-setter hooks — re-exported from mero-js so
272
302
  * callers have one canonical type. A `set*Metadata` call **replaces the whole
@@ -548,6 +578,72 @@ declare function useDetachContextFromGroup(): {
548
578
  loading: boolean;
549
579
  error: Error | null;
550
580
  };
581
+ /**
582
+ * Migration-status rollup for a namespace (skew #3). Migration facts arrive via
583
+ * heartbeat gossip (no SSE), so liveness is polling: pass `pollIntervalMs` to
584
+ * re-fetch on an interval. Derived counters are null-safe before the first load.
585
+ */
586
+ declare function useMigrationStatus(namespaceId?: string | null, options?: {
587
+ pollIntervalMs?: number;
588
+ }): {
589
+ status: MigrationStatus | null;
590
+ rollup: MigrationStatusRollup | null;
591
+ members: MemberMigrationStatusEntry[];
592
+ allMigrated: boolean;
593
+ membersPendingSignature: number;
594
+ /** Members whose migrate aborted (migration-check failed or apply errored). */
595
+ failed: number;
596
+ loading: boolean;
597
+ error: Error | null;
598
+ refetch: () => Promise<void>;
599
+ };
600
+ /**
601
+ * Bundle-version skew (#2): reads the context's installed `applicationVersion`
602
+ * (semver) and compares it to the app-declared `expected` build constant. Any
603
+ * mismatch (either direction) is `isStale` → "reload to update". Subscribes to
604
+ * `AppVersionChanged` so a live flip updates `appVersion` without a refetch.
605
+ */
606
+ declare function useAppVersion(contextId?: string | null, expected?: string): {
607
+ appVersion: string | undefined;
608
+ expected: string | undefined;
609
+ isStale: boolean;
610
+ loading: boolean;
611
+ error: Error | null;
612
+ refetch: () => Promise<void>;
613
+ };
614
+ /**
615
+ * "Is a newer version available?" for an Updates view. Reads a package's
616
+ * published versions from the registry and compares the newest to the running
617
+ * `currentVersion` (e.g. a context's `applicationVersion`). `updateAvailable`
618
+ * is true only when the registry's newest is strictly greater. This is the
619
+ * registry-side check the admin acts on; gate rendering on admin status at the
620
+ * call site. Pure read — fetching nothing until both `registryUrl` and
621
+ * `packageName` are provided.
622
+ */
623
+ declare function useLatestVersion(registryUrl?: string | null, packageName?: string | null, currentVersion?: string | null): {
624
+ versions: string[];
625
+ latestVersion: string;
626
+ currentVersion: string | null | undefined;
627
+ updateAvailable: boolean;
628
+ loading: boolean;
629
+ error: Error | null;
630
+ refetch: () => Promise<void>;
631
+ };
632
+ /**
633
+ * The caller's own identity-gated entries pending re-signature (skew #1).
634
+ * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
635
+ * the one-tap `migrate_my_entries` convert and folds the resulting `remaining`
636
+ * back into the count.
637
+ */
638
+ declare function useMyAuthoredMigration(contextId?: string | null): {
639
+ summary: MigrateMyEntriesSummary | null;
640
+ pendingCount: number;
641
+ pending: boolean;
642
+ authorize: () => Promise<MigrateMyEntriesSummary | null>;
643
+ loading: boolean;
644
+ error: Error | null;
645
+ refresh: () => Promise<void>;
646
+ };
551
647
 
552
648
  /**
553
649
  * Storage utilities for mero-react
@@ -613,4 +709,4 @@ declare function clearContextIdentity(): void;
613
709
  */
614
710
  declare function clearAllStorage(): void;
615
711
 
616
- export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useMemberMetadata, useMero, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
712
+ export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createContext, useState, useRef, useCallback, useEffect, useMemo, useContext } from 'react';
2
- import { parseAuthCallback, MeroJs, buildAuthLoginUrl, LocalStorageTokenStore } from '@calimero-network/mero-js';
2
+ import { parseAuthCallback, MeroJs, buildAuthLoginUrl, compareSemver, LocalStorageTokenStore } from '@calimero-network/mero-js';
3
3
  export * from '@calimero-network/mero-js';
4
4
  export { CAPABILITIES, hasCap, withCap, withoutCap } from '@calimero-network/mero-js';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -2294,7 +2294,314 @@ function useDetachContextFromGroup() {
2294
2294
  );
2295
2295
  return { detachContextFromGroup, loading, error };
2296
2296
  }
2297
+ function useMigrationStatus(namespaceId, options) {
2298
+ const { mero } = useMero();
2299
+ const [status, setStatus] = useState(null);
2300
+ const [loading, setLoading] = useState(false);
2301
+ const [error, setError] = useState(null);
2302
+ const mountedRef = useMountedRef();
2303
+ const reqRef = useRef(0);
2304
+ const refetch = useCallback(async () => {
2305
+ if (!mero || !namespaceId) {
2306
+ if (mountedRef.current) {
2307
+ setStatus(null);
2308
+ setError(null);
2309
+ setLoading(false);
2310
+ }
2311
+ return;
2312
+ }
2313
+ const seq = ++reqRef.current;
2314
+ if (mountedRef.current) {
2315
+ setLoading(true);
2316
+ setError(null);
2317
+ }
2318
+ try {
2319
+ const result = await mero.admin.getMigrationStatus(namespaceId);
2320
+ if (mountedRef.current && seq === reqRef.current) {
2321
+ setStatus(result);
2322
+ }
2323
+ } catch (err) {
2324
+ const errorValue = toError(err);
2325
+ if (mountedRef.current && seq === reqRef.current) {
2326
+ setError(errorValue);
2327
+ }
2328
+ } finally {
2329
+ if (mountedRef.current && seq === reqRef.current) {
2330
+ setLoading(false);
2331
+ }
2332
+ }
2333
+ }, [namespaceId, mero, mountedRef]);
2334
+ useEffect(() => {
2335
+ setStatus(null);
2336
+ setError(null);
2337
+ }, [namespaceId]);
2338
+ useEffect(() => {
2339
+ void refetch();
2340
+ }, [refetch]);
2341
+ const pollIntervalMs = options?.pollIntervalMs;
2342
+ useEffect(() => {
2343
+ if (!pollIntervalMs || !mero || !namespaceId) return;
2344
+ const handle = setInterval(() => void refetch(), pollIntervalMs);
2345
+ return () => clearInterval(handle);
2346
+ }, [pollIntervalMs, mero, namespaceId, refetch]);
2347
+ const rollup = status?.rollup ?? null;
2348
+ const members = status?.members ?? [];
2349
+ return {
2350
+ status,
2351
+ rollup,
2352
+ members,
2353
+ allMigrated: rollup?.allMigrated ?? false,
2354
+ membersPendingSignature: rollup?.membersPendingSignature ?? 0,
2355
+ /** Members whose migrate aborted (migration-check failed or apply errored). */
2356
+ failed: rollup?.failed ?? 0,
2357
+ loading,
2358
+ error,
2359
+ refetch
2360
+ };
2361
+ }
2362
+ function useAppVersion(contextId, expected) {
2363
+ const { mero } = useMero();
2364
+ const [appVersion, setAppVersion] = useState(void 0);
2365
+ const [loading, setLoading] = useState(false);
2366
+ const [error, setError] = useState(null);
2367
+ const mountedRef = useMountedRef();
2368
+ const reqRef = useRef(0);
2369
+ const refetch = useCallback(async () => {
2370
+ if (!mero || !contextId) {
2371
+ if (mountedRef.current) {
2372
+ setAppVersion(void 0);
2373
+ setError(null);
2374
+ setLoading(false);
2375
+ }
2376
+ return;
2377
+ }
2378
+ const seq = ++reqRef.current;
2379
+ if (mountedRef.current) {
2380
+ setLoading(true);
2381
+ setError(null);
2382
+ }
2383
+ try {
2384
+ const context = await mero.admin.getContext(contextId);
2385
+ if (mountedRef.current && seq === reqRef.current) {
2386
+ setAppVersion(context.applicationVersion);
2387
+ }
2388
+ } catch (err) {
2389
+ const errorValue = toError(err);
2390
+ if (mountedRef.current && seq === reqRef.current) {
2391
+ setError(errorValue);
2392
+ }
2393
+ } finally {
2394
+ if (mountedRef.current && seq === reqRef.current) {
2395
+ setLoading(false);
2396
+ }
2397
+ }
2398
+ }, [contextId, mero, mountedRef]);
2399
+ useEffect(() => {
2400
+ setAppVersion(void 0);
2401
+ setError(null);
2402
+ }, [contextId]);
2403
+ useEffect(() => {
2404
+ void refetch();
2405
+ }, [refetch]);
2406
+ useEffect(() => {
2407
+ if (!mero?.events || !contextId) return;
2408
+ const off = mero.events.onAppVersionChanged((event) => {
2409
+ if (event.contextId !== contextId) return;
2410
+ if (mountedRef.current && event.toVersion) {
2411
+ reqRef.current += 1;
2412
+ setAppVersion(event.toVersion);
2413
+ }
2414
+ });
2415
+ return off;
2416
+ }, [mero, contextId, mountedRef]);
2417
+ const isStale = appVersion != null && expected != null && appVersion !== expected;
2418
+ return { appVersion, expected, isStale, loading, error, refetch };
2419
+ }
2420
+ function useLatestVersion(registryUrl, packageName, currentVersion) {
2421
+ const { mero } = useMero();
2422
+ const [versions, setVersions] = useState([]);
2423
+ const [loading, setLoading] = useState(false);
2424
+ const [error, setError] = useState(null);
2425
+ const mountedRef = useMountedRef();
2426
+ const reqRef = useRef(0);
2427
+ const refetch = useCallback(async () => {
2428
+ if (!mero || !registryUrl || !packageName) {
2429
+ reqRef.current += 1;
2430
+ if (mountedRef.current) {
2431
+ setVersions([]);
2432
+ setError(null);
2433
+ setLoading(false);
2434
+ }
2435
+ return;
2436
+ }
2437
+ const seq = ++reqRef.current;
2438
+ if (mountedRef.current) {
2439
+ setLoading(true);
2440
+ setError(null);
2441
+ }
2442
+ try {
2443
+ const result = await mero.admin.getRegistryVersions(registryUrl, packageName);
2444
+ if (mountedRef.current && seq === reqRef.current) {
2445
+ setVersions(result);
2446
+ }
2447
+ } catch (err) {
2448
+ const errorValue = toError(err);
2449
+ if (mountedRef.current && seq === reqRef.current) {
2450
+ setError(errorValue);
2451
+ }
2452
+ } finally {
2453
+ if (mountedRef.current && seq === reqRef.current) {
2454
+ setLoading(false);
2455
+ }
2456
+ }
2457
+ }, [mero, registryUrl, packageName, mountedRef]);
2458
+ useEffect(() => {
2459
+ setVersions([]);
2460
+ setError(null);
2461
+ }, [registryUrl, packageName]);
2462
+ useEffect(() => {
2463
+ void refetch();
2464
+ }, [refetch]);
2465
+ const latestVersion = versions[0] ?? null;
2466
+ const updateAvailable = latestVersion != null && currentVersion != null && compareSemver(latestVersion, currentVersion) > 0;
2467
+ return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };
2468
+ }
2469
+ function useMyAuthoredMigration(contextId) {
2470
+ const { mero } = useMero();
2471
+ const [summary, setSummary] = useState(null);
2472
+ const [pendingCount, setPendingCount] = useState(0);
2473
+ const mountedRef = useMountedRef();
2474
+ const { loading, error, run } = useAsyncMutation();
2475
+ const reqRef = useRef(0);
2476
+ const refresh = useCallback(async () => {
2477
+ if (!mero || !contextId) {
2478
+ if (mountedRef.current) setPendingCount(0);
2479
+ return;
2480
+ }
2481
+ const seq = ++reqRef.current;
2482
+ try {
2483
+ const count = await mero.rpc.countMyPending(contextId);
2484
+ if (mountedRef.current && seq === reqRef.current) setPendingCount(count);
2485
+ } catch {
2486
+ }
2487
+ }, [mero, contextId, mountedRef]);
2488
+ useEffect(() => {
2489
+ void refresh();
2490
+ }, [refresh]);
2491
+ const authorize = useCallback(async () => {
2492
+ if (!mero || !contextId) return null;
2493
+ const result = await run(() => mero.rpc.migrateMyEntries(contextId));
2494
+ if (result && mountedRef.current) {
2495
+ reqRef.current += 1;
2496
+ setSummary(result);
2497
+ setPendingCount(result.remaining);
2498
+ }
2499
+ return result;
2500
+ }, [mero, contextId, run, mountedRef]);
2501
+ return {
2502
+ summary,
2503
+ pendingCount,
2504
+ pending: pendingCount > 0,
2505
+ authorize,
2506
+ loading,
2507
+ error,
2508
+ refresh
2509
+ };
2510
+ }
2511
+ function MigrationPendingBanner({
2512
+ contextId,
2513
+ className,
2514
+ children,
2515
+ onMigrated
2516
+ }) {
2517
+ const { pending, pendingCount, authorize, loading } = useMyAuthoredMigration(contextId);
2518
+ if (!pending) return null;
2519
+ const handleClick = async () => {
2520
+ const result = await authorize();
2521
+ if (result && result.remaining === 0) {
2522
+ onMigrated?.();
2523
+ }
2524
+ };
2525
+ const message = children ?? `You have ${pendingCount} ${pendingCount === 1 ? "entry" : "entries"} to re-sign after a recent upgrade.`;
2526
+ return /* @__PURE__ */ jsxs("div", { className, "data-testid": "migration-pending-banner", role: "status", children: [
2527
+ /* @__PURE__ */ jsx("span", { children: message }),
2528
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: handleClick, disabled: loading, children: loading ? "Migrating\u2026" : "Migrate my data" })
2529
+ ] });
2530
+ }
2531
+ function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }) {
2532
+ const { status, rollup, members, membersPendingSignature, failed, error } = useMigrationStatus(
2533
+ namespaceId,
2534
+ { pollIntervalMs }
2535
+ );
2536
+ if (error && !status) {
2537
+ return /* @__PURE__ */ jsxs("div", { className, "data-testid": "migration-admin-panel", children: [
2538
+ "Failed to load migration status: ",
2539
+ error.message
2540
+ ] });
2541
+ }
2542
+ if (!status || !rollup) {
2543
+ return /* @__PURE__ */ jsx("div", { className, "data-testid": "migration-admin-panel", children: "Loading migration status\u2026" });
2544
+ }
2545
+ return /* @__PURE__ */ jsxs("div", { className, "data-testid": "migration-admin-panel", children: [
2546
+ error && // A poll failed after data was already loaded — keep showing the last
2547
+ // good rollup but flag that it may be stale.
2548
+ /* @__PURE__ */ jsxs("div", { "data-testid": "migration-status-error", role: "alert", children: [
2549
+ "Could not refresh migration status: ",
2550
+ error.message
2551
+ ] }),
2552
+ /* @__PURE__ */ jsxs("dl", { children: [
2553
+ /* @__PURE__ */ jsxs("div", { children: [
2554
+ /* @__PURE__ */ jsx("dt", { children: "Target version" }),
2555
+ /* @__PURE__ */ jsx("dd", { children: status.targetVersion })
2556
+ ] }),
2557
+ /* @__PURE__ */ jsxs("div", { children: [
2558
+ /* @__PURE__ */ jsx("dt", { children: "Migrated" }),
2559
+ /* @__PURE__ */ jsx("dd", { children: rollup.migrated })
2560
+ ] }),
2561
+ /* @__PURE__ */ jsxs("div", { children: [
2562
+ /* @__PURE__ */ jsx("dt", { children: "In progress" }),
2563
+ /* @__PURE__ */ jsx("dd", { children: rollup.inProgress })
2564
+ ] }),
2565
+ /* @__PURE__ */ jsxs("div", { children: [
2566
+ /* @__PURE__ */ jsx("dt", { children: "Unknown" }),
2567
+ /* @__PURE__ */ jsx("dd", { children: rollup.unknown })
2568
+ ] }),
2569
+ /* @__PURE__ */ jsxs("div", { children: [
2570
+ /* @__PURE__ */ jsx("dt", { children: "Failed" }),
2571
+ /* @__PURE__ */ jsx("dd", { "data-testid": "migration-failed-count", children: failed })
2572
+ ] }),
2573
+ /* @__PURE__ */ jsxs("div", { children: [
2574
+ /* @__PURE__ */ jsx("dt", { children: "Total" }),
2575
+ /* @__PURE__ */ jsx("dd", { children: rollup.total })
2576
+ ] }),
2577
+ /* @__PURE__ */ jsxs("div", { children: [
2578
+ /* @__PURE__ */ jsx("dt", { children: "All migrated" }),
2579
+ /* @__PURE__ */ jsx("dd", { children: rollup.allMigrated ? "yes" : "no" })
2580
+ ] }),
2581
+ /* @__PURE__ */ jsxs("div", { children: [
2582
+ /* @__PURE__ */ jsx("dt", { children: "Members pending signature" }),
2583
+ /* @__PURE__ */ jsx("dd", { "data-testid": "members-pending-signature", children: membersPendingSignature })
2584
+ ] })
2585
+ ] }),
2586
+ /* @__PURE__ */ jsxs("table", { children: [
2587
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
2588
+ /* @__PURE__ */ jsx("th", { children: "Peer" }),
2589
+ /* @__PURE__ */ jsx("th", { children: "State" }),
2590
+ /* @__PURE__ */ jsx("th", { children: "Schema" }),
2591
+ /* @__PURE__ */ jsx("th", { children: "Pending" }),
2592
+ /* @__PURE__ */ jsx("th", { children: "Reason" })
2593
+ ] }) }),
2594
+ /* @__PURE__ */ jsx("tbody", { children: members.map((m) => /* @__PURE__ */ jsxs("tr", { "data-testid": "migration-member-row", children: [
2595
+ /* @__PURE__ */ jsx("td", { children: m.peer }),
2596
+ /* @__PURE__ */ jsx("td", { children: m.state }),
2597
+ /* @__PURE__ */ jsx("td", { children: m.report?.schemaVersion ?? "\u2014" }),
2598
+ /* @__PURE__ */ jsx("td", { children: m.report?.authoredRemaining ?? "\u2014" }),
2599
+ /* @__PURE__ */ jsx("td", { children: m.report?.migrationFailed ?? "\u2014" })
2600
+ ] }, m.peer)) })
2601
+ ] })
2602
+ ] });
2603
+ }
2297
2604
 
2298
- export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useMemberMetadata, useMero, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
2605
+ export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, MigrationAdminPanel, MigrationPendingBanner, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
2299
2606
  //# sourceMappingURL=index.js.map
2300
2607
  //# sourceMappingURL=index.js.map