@dxos/plugin-client 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.13.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/lib/Account.mjs +29 -10
- package/dist/lib/Account.mjs.map +1 -1
- package/dist/lib/CliLogin.mjs +78 -0
- package/dist/lib/CliLogin.mjs.map +1 -0
- package/dist/lib/ClientCapabilities.mjs +25 -1
- package/dist/lib/ClientCapabilities.mjs.map +1 -1
- package/dist/lib/ClientEvents.mjs +7 -3
- package/dist/lib/ClientEvents.mjs.map +1 -1
- package/dist/lib/{chunk-definitions.mjs → ClientOperation.mjs} +11 -7
- package/dist/lib/ClientOperation.mjs.map +1 -0
- package/dist/lib/ClientOptions.mjs.map +1 -1
- package/dist/lib/PasskeyError.mjs +69 -12
- package/dist/lib/PasskeyError.mjs.map +1 -1
- package/dist/lib/capabilities.browser.mjs +134 -0
- package/dist/lib/capabilities.browser.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +47 -10
- package/dist/lib/capabilities.mjs.map +1 -1
- package/dist/lib/capabilities.node.mjs +40 -7
- package/dist/lib/capabilities.node.mjs.map +1 -1
- package/dist/lib/capabilities.tauri.mjs +134 -0
- package/dist/lib/capabilities.tauri.mjs.map +1 -0
- package/dist/lib/capabilities.workerd.mjs +24 -4
- package/dist/lib/capabilities.workerd.mjs.map +1 -1
- package/dist/lib/chunk-AccountContainer.mjs +53 -41
- package/dist/lib/chunk-AccountContainer.mjs.map +1 -1
- package/dist/lib/chunk-CliLoginDialog.mjs +146 -0
- package/dist/lib/chunk-CliLoginDialog.mjs.map +1 -0
- package/dist/lib/chunk-ContactPickerContainer.mjs +120 -0
- package/dist/lib/chunk-ContactPickerContainer.mjs.map +1 -0
- package/dist/lib/chunk-ContactsContainer.mjs +53 -0
- package/dist/lib/chunk-ContactsContainer.mjs.map +1 -0
- package/dist/lib/chunk-DevicesContainer.mjs +48 -112
- package/dist/lib/chunk-DevicesContainer.mjs.map +1 -1
- package/dist/lib/chunk-HaloServices.mjs +28 -0
- package/dist/lib/chunk-HaloServices.mjs.map +1 -0
- package/dist/lib/chunk-InvitationsContainer.mjs +61 -39
- package/dist/lib/chunk-InvitationsContainer.mjs.map +1 -1
- package/dist/lib/chunk-JoinDialog.mjs +10 -9
- package/dist/lib/chunk-JoinDialog.mjs.map +1 -1
- package/dist/lib/chunk-ProfileContainer.mjs +60 -39
- package/dist/lib/chunk-ProfileContainer.mjs.map +1 -1
- package/dist/lib/chunk-RecoveryCodeDialog.mjs +26 -21
- package/dist/lib/chunk-RecoveryCodeDialog.mjs.map +1 -1
- package/dist/lib/chunk-RecoveryCredentialsContainer.mjs +95 -65
- package/dist/lib/chunk-RecoveryCredentialsContainer.mjs.map +1 -1
- package/dist/lib/chunk-ResetDialog.mjs +26 -14
- package/dist/lib/chunk-ResetDialog.mjs.map +1 -1
- package/dist/lib/chunk-SpaceInvitationContainer.mjs +50 -0
- package/dist/lib/chunk-SpaceInvitationContainer.mjs.map +1 -0
- package/dist/lib/chunk-UsageContainer.mjs +22 -20
- package/dist/lib/chunk-UsageContainer.mjs.map +1 -1
- package/dist/lib/chunk-account-cache.mjs +2 -2
- package/dist/lib/chunk-account-cache.mjs.map +1 -1
- package/dist/lib/chunk-app-graph-builder.mjs +159 -60
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
- package/dist/lib/chunk-client-services.mjs +21 -0
- package/dist/lib/chunk-client-services.mjs.map +1 -0
- package/dist/lib/chunk-client.mjs +27 -20
- package/dist/lib/chunk-client.mjs.map +1 -1
- package/dist/lib/chunk-constants.mjs +2 -1
- package/dist/lib/chunk-constants.mjs.map +1 -1
- package/dist/lib/chunk-create-agent.mjs +1 -1
- package/dist/lib/chunk-create-agent.mjs.map +1 -1
- package/dist/lib/chunk-create-identity.mjs +2 -2
- package/dist/lib/chunk-create-identity.mjs.map +1 -1
- package/dist/lib/chunk-create-passkey.mjs +49 -40
- package/dist/lib/chunk-create-passkey.mjs.map +1 -1
- package/dist/lib/chunk-create-recovery-code.mjs +2 -2
- package/dist/lib/chunk-create-recovery-code.mjs.map +1 -1
- package/dist/lib/chunk-grant-service-access.mjs +1 -1
- package/dist/lib/chunk-grant-service-access.mjs.map +1 -1
- package/dist/lib/chunk-halo.mjs +414 -0
- package/dist/lib/chunk-halo.mjs.map +1 -0
- package/dist/lib/chunk-identity-lifecycle.mjs +74 -0
- package/dist/lib/chunk-identity-lifecycle.mjs.map +1 -0
- package/dist/lib/chunk-join-identity.mjs +2 -2
- package/dist/lib/chunk-join-identity.mjs.map +1 -1
- package/dist/lib/chunk-layer-specs.mjs +72 -5
- package/dist/lib/chunk-layer-specs.mjs.map +1 -1
- package/dist/lib/chunk-navigation-handler.mjs +28 -5
- package/dist/lib/chunk-navigation-handler.mjs.map +1 -1
- package/dist/lib/chunk-navigation-target-loader.mjs +8 -9
- package/dist/lib/chunk-navigation-target-loader.mjs.map +1 -1
- package/dist/lib/chunk-open-usage.mjs +3 -3
- package/dist/lib/chunk-open-usage.mjs.map +1 -1
- package/dist/lib/chunk-react-context.mjs +5 -5
- package/dist/lib/chunk-react-context.mjs.map +1 -1
- package/dist/lib/chunk-react-surface.mjs +80 -64
- package/dist/lib/chunk-react-surface.mjs.map +1 -1
- package/dist/lib/chunk-recover-identity.mjs +2 -2
- package/dist/lib/chunk-recover-identity.mjs.map +1 -1
- package/dist/lib/chunk-redeem-passkey.mjs +7 -5
- package/dist/lib/chunk-redeem-passkey.mjs.map +1 -1
- package/dist/lib/chunk-redeem-token.mjs +1 -1
- package/dist/lib/chunk-redeem-token.mjs.map +1 -1
- package/dist/lib/chunk-remote-trace-monitor.mjs +3 -2
- package/dist/lib/chunk-remote-trace-monitor.mjs.map +1 -1
- package/dist/lib/chunk-reset-storage.mjs +6 -3
- package/dist/lib/chunk-reset-storage.mjs.map +1 -1
- package/dist/lib/chunk-resolve-navigation-targets.mjs +3 -3
- package/dist/lib/chunk-resolve-navigation-targets.mjs.map +1 -1
- package/dist/lib/chunk-revoke-recovery-credential.mjs +1 -1
- package/dist/lib/chunk-revoke-recovery-credential.mjs.map +1 -1
- package/dist/lib/chunk-share-identity.mjs +2 -2
- package/dist/lib/chunk-share-identity.mjs.map +1 -1
- package/dist/lib/chunk-space-replication-progress.mjs +49 -7
- package/dist/lib/chunk-space-replication-progress.mjs.map +1 -1
- package/dist/lib/chunk-trace-progress.mjs +5 -5
- package/dist/lib/chunk-trace-progress.mjs.map +1 -1
- package/dist/lib/chunk-update-profile.mjs +1 -1
- package/dist/lib/chunk-update-profile.mjs.map +1 -1
- package/dist/lib/chunk-useAccountUrl.mjs +23 -0
- package/dist/lib/chunk-useAccountUrl.mjs.map +1 -0
- package/dist/lib/chunk-useHubClient.mjs +30 -0
- package/dist/lib/chunk-useHubClient.mjs.map +1 -0
- package/dist/lib/commands.mjs +1 -1
- package/dist/lib/commands.mjs.map +1 -1
- package/dist/lib/commands.node.mjs +771 -1
- package/dist/lib/commands.node.mjs.map +1 -1
- package/dist/lib/components.mjs +91 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +5 -1
- package/dist/lib/containers.mjs.map +1 -1
- package/dist/lib/index.mjs +2 -27
- package/dist/lib/meta.mjs.map +1 -1
- package/dist/lib/ns/HaloServices.mjs +2 -0
- package/dist/lib/operations.mjs +3 -3
- package/dist/lib/operations.mjs.map +1 -1
- package/dist/lib/plugin.mjs +2 -2
- package/dist/lib/plugin.mjs.map +1 -1
- package/dist/lib/testing.mjs +71 -2
- package/dist/lib/testing.mjs.map +1 -1
- package/dist/lib/translations.mjs +26 -5
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/lib/types.mjs +3 -1
- package/dist/types/src/HaloServices.d.ts +2 -0
- package/dist/types/src/HaloServices.d.ts.map +1 -0
- package/dist/types/src/capabilities/client-services.d.ts +9 -0
- package/dist/types/src/capabilities/client-services.d.ts.map +1 -0
- package/dist/types/src/capabilities/client.d.ts +33 -2
- package/dist/types/src/capabilities/client.d.ts.map +1 -1
- package/dist/types/src/capabilities/commands.d.ts +1 -1
- package/dist/types/src/capabilities/commands.d.ts.map +1 -1
- package/dist/types/src/capabilities/commands.node.d.ts +1 -1
- package/dist/types/src/capabilities/commands.node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/browser.d.ts +45 -0
- package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/node.d.ts +3 -1
- package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/tauri.d.ts +45 -0
- package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts +2 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/identity-lifecycle.d.ts +14 -0
- package/dist/types/src/capabilities/identity-lifecycle.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +5 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-handler/index.d.ts +1 -1
- package/dist/types/src/capabilities/navigation-handler/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-target-loader.d.ts +1 -6
- package/dist/types/src/capabilities/navigation-target-loader.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/remote-trace-monitor.d.ts +1 -1
- package/dist/types/src/capabilities/remote-trace-monitor.d.ts.map +1 -1
- package/dist/types/src/capabilities/trace-progress.d.ts +2 -2
- package/dist/types/src/commands/account/index.d.ts +1 -1
- package/dist/types/src/commands/account/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/create/create.d.ts +4 -3
- package/dist/types/src/commands/account/invitation/create/create.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/create/index.d.ts +1 -1
- package/dist/types/src/commands/account/invitation/create/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/index.d.ts +2 -2
- package/dist/types/src/commands/account/invitation/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/login/index.d.ts +1 -1
- package/dist/types/src/commands/account/login/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/login/login.d.ts +6 -5
- package/dist/types/src/commands/account/login/login.d.ts.map +1 -1
- package/dist/types/src/commands/account/logout/index.d.ts +1 -1
- package/dist/types/src/commands/account/logout/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/logout/logout.d.ts +2 -2
- package/dist/types/src/commands/account/logout/logout.d.ts.map +1 -1
- package/dist/types/src/commands/account/signup/index.d.ts +1 -1
- package/dist/types/src/commands/account/signup/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/signup/signup.d.ts +5 -4
- package/dist/types/src/commands/account/signup/signup.d.ts.map +1 -1
- package/dist/types/src/commands/account/util.d.ts +1 -1
- package/dist/types/src/commands/account/util.d.ts.map +1 -1
- package/dist/types/src/commands/config/index.d.ts +1 -1
- package/dist/types/src/commands/config/index.d.ts.map +1 -1
- package/dist/types/src/commands/config/view.d.ts +1 -1
- package/dist/types/src/commands/config/view.d.ts.map +1 -1
- package/dist/types/src/commands/device/index.d.ts +1 -1
- package/dist/types/src/commands/device/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/info/index.d.ts +1 -1
- package/dist/types/src/commands/device/info/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/info/info.d.ts +1 -1
- package/dist/types/src/commands/device/info/info.d.ts.map +1 -1
- package/dist/types/src/commands/device/list/index.d.ts +1 -1
- package/dist/types/src/commands/device/list/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/list/list.d.ts +1 -1
- package/dist/types/src/commands/device/list/list.d.ts.map +1 -1
- package/dist/types/src/commands/device/update/index.d.ts +1 -1
- package/dist/types/src/commands/device/update/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/update/update.d.ts +1 -1
- package/dist/types/src/commands/device/update/update.d.ts.map +1 -1
- package/dist/types/src/commands/device/util.d.ts +1 -1
- package/dist/types/src/commands/device/util.d.ts.map +1 -1
- package/dist/types/src/commands/edge/index.d.ts +1 -1
- package/dist/types/src/commands/edge/index.d.ts.map +1 -1
- package/dist/types/src/commands/edge/status.d.ts +1 -1
- package/dist/types/src/commands/edge/status.d.ts.map +1 -1
- package/dist/types/src/commands/errors.d.ts +33 -0
- package/dist/types/src/commands/errors.d.ts.map +1 -0
- package/dist/types/src/commands/halo/credential/add/add.d.ts +5 -4
- package/dist/types/src/commands/halo/credential/add/add.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/add/index.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/add/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/index.d.ts +2 -2
- package/dist/types/src/commands/halo/credential/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/list/index.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/list/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/list/list.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/list/list.d.ts.map +1 -1
- package/dist/types/src/commands/halo/identity/identity.d.ts +1 -1
- package/dist/types/src/commands/halo/identity/identity.d.ts.map +1 -1
- package/dist/types/src/commands/halo/identity/index.d.ts +1 -1
- package/dist/types/src/commands/halo/identity/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/index.d.ts +1 -1
- package/dist/types/src/commands/halo/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/keys/index.d.ts +1 -1
- package/dist/types/src/commands/halo/keys/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/keys/keys.d.ts +1 -1
- package/dist/types/src/commands/halo/keys/keys.d.ts.map +1 -1
- package/dist/types/src/commands/halo/seed/index.d.ts +1 -1
- package/dist/types/src/commands/halo/seed/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/seed/seed.d.ts +1 -1
- package/dist/types/src/commands/halo/seed/seed.d.ts.map +1 -1
- package/dist/types/src/commands/halo/share/index.d.ts +1 -1
- package/dist/types/src/commands/halo/share/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/share/share.d.ts +4 -3
- package/dist/types/src/commands/halo/share/share.d.ts.map +1 -1
- package/dist/types/src/commands/halo/update/index.d.ts +1 -1
- package/dist/types/src/commands/halo/update/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/update/update.d.ts +1 -1
- package/dist/types/src/commands/halo/update/update.d.ts.map +1 -1
- package/dist/types/src/commands/halo/util.d.ts +2 -2
- package/dist/types/src/commands/halo/util.d.ts.map +1 -1
- package/dist/types/src/commands/index.d.ts +6 -6
- package/dist/types/src/commands/index.d.ts.map +1 -1
- package/dist/types/src/commands/profile/create.d.ts +1 -1
- package/dist/types/src/commands/profile/create.d.ts.map +1 -1
- package/dist/types/src/commands/profile/delete.d.ts +1 -1
- package/dist/types/src/commands/profile/delete.d.ts.map +1 -1
- package/dist/types/src/commands/profile/import.d.ts +5 -4
- package/dist/types/src/commands/profile/import.d.ts.map +1 -1
- package/dist/types/src/commands/profile/index.d.ts +2 -2
- package/dist/types/src/commands/profile/index.d.ts.map +1 -1
- package/dist/types/src/commands/profile/inspect.d.ts +1 -1
- package/dist/types/src/commands/profile/inspect.d.ts.map +1 -1
- package/dist/types/src/commands/profile/list.d.ts +1 -1
- package/dist/types/src/commands/profile/list.d.ts.map +1 -1
- package/dist/types/src/commands/profile/reset.d.ts +2 -2
- package/dist/types/src/commands/profile/reset.d.ts.map +1 -1
- package/dist/types/src/components/DevicesForm/DevicesForm.d.ts +19 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.d.ts.map +1 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts +207 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts.map +1 -0
- package/dist/types/src/components/DevicesForm/index.d.ts +2 -0
- package/dist/types/src/components/DevicesForm/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/constants.d.ts +1 -0
- package/dist/types/src/constants.d.ts.map +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AccountContainer/index.d.ts +1 -1
- package/dist/types/src/containers/AccountContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts +12 -0
- package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts.map +1 -0
- package/dist/types/src/containers/CliLoginDialog/index.d.ts +4 -0
- package/dist/types/src/containers/CliLoginDialog/index.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts +8 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts +206 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ContactPickerContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts +3 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts +203 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ContactsContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts +19 -1
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DevicesContainer/index.d.ts +1 -1
- package/dist/types/src/containers/DevicesContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/index.d.ts +1 -1
- package/dist/types/src/containers/InvitationsContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/index.d.ts +1 -1
- package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/index.d.ts +1 -1
- package/dist/types/src/containers/ProfileContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts +2 -2
- package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts +6 -7
- package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts +2 -2
- package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/index.d.ts +2 -2
- package/dist/types/src/containers/ResetDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts +10 -0
- package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/index.d.ts +1 -1
- package/dist/types/src/containers/UsageContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +9 -3
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -2
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/create-agent.d.ts +2 -2
- package/dist/types/src/operations/create-agent.d.ts.map +1 -1
- package/dist/types/src/operations/create-identity.d.ts +2 -2
- package/dist/types/src/operations/create-identity.d.ts.map +1 -1
- package/dist/types/src/operations/create-passkey.d.ts +2 -2
- package/dist/types/src/operations/create-passkey.d.ts.map +1 -1
- package/dist/types/src/operations/create-recovery-code.d.ts +2 -2
- package/dist/types/src/operations/create-recovery-code.d.ts.map +1 -1
- package/dist/types/src/operations/grant-service-access.d.ts +2 -2
- package/dist/types/src/operations/grant-service-access.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/join-identity.d.ts +2 -2
- package/dist/types/src/operations/join-identity.d.ts.map +1 -1
- package/dist/types/src/operations/open-usage.d.ts +2 -2
- package/dist/types/src/operations/open-usage.d.ts.map +1 -1
- package/dist/types/src/operations/recover-identity.d.ts +2 -2
- package/dist/types/src/operations/recover-identity.d.ts.map +1 -1
- package/dist/types/src/operations/redeem-passkey.d.ts +2 -2
- package/dist/types/src/operations/redeem-passkey.d.ts.map +1 -1
- package/dist/types/src/operations/redeem-token.d.ts +2 -2
- package/dist/types/src/operations/redeem-token.d.ts.map +1 -1
- package/dist/types/src/operations/reset-storage.d.ts +2 -2
- package/dist/types/src/operations/reset-storage.d.ts.map +1 -1
- package/dist/types/src/operations/revoke-recovery-credential.d.ts +2 -2
- package/dist/types/src/operations/revoke-recovery-credential.d.ts.map +1 -1
- package/dist/types/src/operations/share-identity.d.ts +2 -2
- package/dist/types/src/operations/share-identity.d.ts.map +1 -1
- package/dist/types/src/operations/update-profile.d.ts +2 -2
- package/dist/types/src/operations/update-profile.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts.map +1 -1
- package/dist/types/src/progress/index.d.ts +2 -2
- package/dist/types/src/progress/index.d.ts.map +1 -1
- package/dist/types/src/progress/space-sync-progress.d.ts +10 -1
- package/dist/types/src/progress/space-sync-progress.d.ts.map +1 -1
- package/dist/types/src/testing/ClientPluginManager.d.ts +18 -0
- package/dist/types/src/testing/ClientPluginManager.d.ts.map +1 -0
- package/dist/types/src/testing/createFakeContacts.d.ts +16 -0
- package/dist/types/src/testing/createFakeContacts.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +4 -2
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/initializeIdentity.d.ts +1 -1
- package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +2 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Account.d.ts +21 -7
- package/dist/types/src/types/Account.d.ts.map +1 -1
- package/dist/types/src/types/CliLogin.d.ts +33 -0
- package/dist/types/src/types/CliLogin.d.ts.map +1 -0
- package/dist/types/src/types/ClientCapabilities.d.ts +32 -3
- package/dist/types/src/types/ClientCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/ClientEvents.d.ts +5 -1
- package/dist/types/src/types/ClientEvents.d.ts.map +1 -1
- package/dist/types/src/{operations/definitions.d.ts → types/ClientOperation.d.ts} +2 -1
- package/dist/types/src/types/ClientOperation.d.ts.map +1 -0
- package/dist/types/src/types/ClientOptions.d.ts +1 -8
- package/dist/types/src/types/ClientOptions.d.ts.map +1 -1
- package/dist/types/src/types/PasskeyError.d.ts +112 -11
- package/dist/types/src/types/PasskeyError.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +9 -7
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -61
- package/src/HaloServices.ts +7 -0
- package/src/capabilities/account-cache.ts +2 -2
- package/src/capabilities/app-graph-builder.ts +165 -69
- package/src/capabilities/client-services.ts +25 -0
- package/src/capabilities/client.ts +17 -12
- package/src/capabilities/commands.node.ts +1 -1
- package/src/capabilities/commands.ts +1 -1
- package/src/capabilities/gen/browser.ts +192 -0
- package/src/capabilities/gen/node.ts +48 -19
- package/src/capabilities/gen/tauri.ts +192 -0
- package/src/capabilities/gen/workerd.ts +41 -13
- package/src/capabilities/identity-lifecycle.ts +86 -0
- package/src/capabilities/index.ts +57 -26
- package/src/capabilities/layer-specs.ts +107 -4
- package/src/capabilities/navigation-handler/index.ts +2 -2
- package/src/capabilities/navigation-handler/navigation-handler.ts +20 -1
- package/src/capabilities/navigation-target-loader.ts +15 -10
- package/src/capabilities/react-context.tsx +2 -2
- package/src/capabilities/react-surface.ts +43 -18
- package/src/capabilities/remote-trace-monitor.ts +5 -2
- package/src/capabilities/schema-defs.test.ts +2 -2
- package/src/capabilities/space-replication-progress.ts +12 -7
- package/src/capabilities/trace-progress.ts +6 -6
- package/src/commands/account/index.ts +5 -5
- package/src/commands/account/invitation/create/create.ts +9 -5
- package/src/commands/account/invitation/create/index.ts +1 -1
- package/src/commands/account/invitation/index.ts +2 -2
- package/src/commands/account/login/index.ts +1 -1
- package/src/commands/account/login/login.ts +108 -37
- package/src/commands/account/logout/index.ts +1 -1
- package/src/commands/account/logout/logout.ts +8 -5
- package/src/commands/account/signup/index.ts +1 -1
- package/src/commands/account/signup/signup.ts +33 -19
- package/src/commands/account/util.test.ts +1 -1
- package/src/commands/account/util.ts +2 -2
- package/src/commands/config/index.ts +2 -2
- package/src/commands/config/view.ts +1 -1
- package/src/commands/device/index.ts +4 -4
- package/src/commands/device/info/index.ts +1 -1
- package/src/commands/device/info/info.test.ts +4 -3
- package/src/commands/device/info/info.ts +5 -4
- package/src/commands/device/list/index.ts +1 -1
- package/src/commands/device/list/list.test.ts +2 -2
- package/src/commands/device/list/list.ts +2 -2
- package/src/commands/device/update/index.ts +1 -1
- package/src/commands/device/update/update.ts +8 -9
- package/src/commands/device/util.ts +6 -5
- package/src/commands/edge/index.ts +2 -2
- package/src/commands/edge/status.ts +1 -1
- package/src/commands/errors.ts +8 -0
- package/src/commands/halo/credential/add/add.ts +13 -16
- package/src/commands/halo/credential/add/index.ts +1 -1
- package/src/commands/halo/credential/index.ts +3 -3
- package/src/commands/halo/credential/list/index.ts +1 -1
- package/src/commands/halo/credential/list/list.test.ts +2 -2
- package/src/commands/halo/credential/list/list.ts +15 -14
- package/src/commands/halo/identity/identity.test.ts +7 -3
- package/src/commands/halo/identity/identity.ts +2 -2
- package/src/commands/halo/identity/index.ts +1 -1
- package/src/commands/halo/index.ts +7 -7
- package/src/commands/halo/keys/index.ts +1 -1
- package/src/commands/halo/keys/keys.test.ts +5 -4
- package/src/commands/halo/keys/keys.ts +6 -5
- package/src/commands/halo/seed/index.ts +1 -1
- package/src/commands/halo/seed/seed.ts +1 -1
- package/src/commands/halo/share/index.ts +1 -1
- package/src/commands/halo/share/share.ts +15 -10
- package/src/commands/halo/update/index.ts +1 -1
- package/src/commands/halo/update/update.test.ts +2 -2
- package/src/commands/halo/update/update.ts +7 -17
- package/src/commands/halo/util.ts +11 -7
- package/src/commands/index.ts +6 -6
- package/src/commands/profile/create.ts +5 -5
- package/src/commands/profile/delete.ts +4 -4
- package/src/commands/profile/import.ts +17 -14
- package/src/commands/profile/index.ts +7 -7
- package/src/commands/profile/inspect.ts +9 -6
- package/src/commands/profile/list.ts +2 -2
- package/src/commands/profile/reset.ts +9 -6
- package/src/components/DevicesForm/DevicesForm.stories.tsx +62 -0
- package/src/components/DevicesForm/DevicesForm.tsx +100 -0
- package/src/components/DevicesForm/index.ts +5 -0
- package/src/components/index.ts +2 -0
- package/src/constants.ts +1 -0
- package/src/containers/AccountContainer/AccountContainer.stories.tsx +3 -3
- package/src/containers/AccountContainer/AccountContainer.tsx +54 -43
- package/src/containers/AccountContainer/index.ts +1 -1
- package/src/containers/CliLoginDialog/CliLoginDialog.tsx +159 -0
- package/src/containers/CliLoginDialog/index.ts +8 -0
- package/src/containers/ContactPickerContainer/ContactPickerContainer.stories.tsx +66 -0
- package/src/containers/ContactPickerContainer/ContactPickerContainer.tsx +126 -0
- package/src/containers/ContactPickerContainer/index.ts +5 -0
- package/src/containers/ContactsContainer/ContactsContainer.stories.tsx +48 -0
- package/src/containers/ContactsContainer/ContactsContainer.tsx +61 -0
- package/src/containers/ContactsContainer/index.ts +5 -0
- package/src/containers/DevicesContainer/DevicesContainer.stories.tsx +3 -3
- package/src/containers/DevicesContainer/DevicesContainer.tsx +45 -103
- package/src/containers/DevicesContainer/index.ts +1 -1
- package/src/containers/InvitationsContainer/InvitationsContainer.stories.tsx +3 -3
- package/src/containers/InvitationsContainer/InvitationsContainer.tsx +63 -60
- package/src/containers/InvitationsContainer/index.ts +1 -1
- package/src/containers/JoinDialog/JoinDialog.stories.tsx +5 -7
- package/src/containers/JoinDialog/JoinDialog.tsx +10 -9
- package/src/containers/JoinDialog/index.ts +1 -1
- package/src/containers/ProfileContainer/ProfileContainer.stories.tsx +3 -3
- package/src/containers/ProfileContainer/ProfileContainer.tsx +72 -55
- package/src/containers/ProfileContainer/index.ts +1 -1
- package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.tsx +5 -6
- package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx +27 -29
- package/src/containers/RecoveryCodeDialog/index.ts +2 -2
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.tsx +7 -7
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +69 -41
- package/src/containers/RecoveryCredentialsContainer/index.ts +1 -1
- package/src/containers/ResetDialog/ResetDialog.stories.tsx +9 -21
- package/src/containers/ResetDialog/ResetDialog.tsx +35 -24
- package/src/containers/ResetDialog/index.ts +2 -2
- package/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.tsx +62 -0
- package/src/containers/SpaceInvitationContainer/index.ts +8 -0
- package/src/containers/UsageContainer/UsageContainer.tsx +4 -4
- package/src/containers/UsageContainer/UsageView.stories.tsx +1 -1
- package/src/containers/UsageContainer/UsageView.tsx +22 -24
- package/src/containers/UsageContainer/index.ts +1 -1
- package/src/containers/index.ts +23 -12
- package/src/hooks/index.ts +2 -2
- package/src/hooks/useAccountUrl.ts +1 -1
- package/src/hooks/useHubClient.ts +3 -3
- package/src/index.ts +2 -5
- package/src/meta.ts +1 -1
- package/src/operations/create-agent.ts +2 -2
- package/src/operations/create-identity.ts +5 -3
- package/src/operations/create-passkey.ts +59 -37
- package/src/operations/create-recovery-code.ts +16 -15
- package/src/operations/grant-service-access.ts +9 -8
- package/src/operations/index.ts +17 -30
- package/src/operations/join-identity.ts +3 -3
- package/src/operations/open-usage.ts +3 -3
- package/src/operations/recover-identity.ts +3 -3
- package/src/operations/redeem-passkey.ts +63 -65
- package/src/operations/redeem-token.ts +2 -2
- package/src/operations/reset-storage.ts +4 -3
- package/src/operations/resolve-navigation-targets.ts +1 -1
- package/src/operations/revoke-recovery-credential.ts +9 -8
- package/src/operations/share-identity.ts +2 -2
- package/src/operations/update-profile.ts +2 -2
- package/src/plugin.test.ts +2 -2
- package/src/plugin.ts +30 -25
- package/src/progress/index.ts +2 -2
- package/src/progress/space-sync-progress.test.ts +36 -13
- package/src/progress/space-sync-progress.ts +21 -6
- package/src/schema-defs.test.ts +2 -2
- package/src/testing/ClientPluginManager.tsx +44 -0
- package/src/testing/createFakeContacts.ts +57 -0
- package/src/testing/index.ts +4 -2
- package/src/testing/initializeIdentity.ts +6 -2
- package/src/translations.ts +33 -9
- package/src/types/Account.ts +27 -11
- package/src/types/CliLogin.ts +78 -0
- package/src/types/ClientCapabilities.ts +38 -4
- package/src/types/ClientEvents.ts +5 -1
- package/src/{operations/definitions.ts → types/ClientOperation.ts} +5 -1
- package/src/types/ClientOptions.ts +3 -7
- package/src/types/PasskeyError.test.ts +96 -1
- package/src/types/PasskeyError.ts +85 -15
- package/src/types/index.ts +9 -7
- package/dist/lib/chunk-commands.mjs +0 -1090
- package/dist/lib/chunk-commands.mjs.map +0 -1
- package/dist/lib/chunk-definitions.mjs.map +0 -1
- package/dist/lib/chunk-hooks.mjs +0 -49
- package/dist/lib/chunk-hooks.mjs.map +0 -1
- package/dist/lib/chunk-progress.mjs +0 -35
- package/dist/lib/chunk-progress.mjs.map +0 -1
- package/dist/lib/index.mjs.map +0 -1
- package/dist/types/src/operations/definitions.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ContactPickerContainer.mjs","names":[],"sources":["../../src/containers/ContactPickerContainer/ContactPickerContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport type * as AppSurface from '@dxos/app-toolkit/AppSurface';\nimport { log } from '@dxos/log';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport { SpaceMember_Role, useMembers } from '@dxos/react-client/echo';\nimport { useContacts, useIdentity } from '@dxos/react-client/halo';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as Select from '@dxos/react-ui/Select';\nimport * as SystemButton from '@dxos/react-ui/SystemButton';\nimport { ContactPicker } from '@dxos/shell/react';\n\nimport { meta } from '#meta';\n\nconst ROLES = [SpaceMember_Role.READER, SpaceMember_Role.EDITOR, SpaceMember_Role.ADMIN] as const;\n\ntype AdmitRole = (typeof ROLES)[number];\n\nconst roleLabel: Record<AdmitRole, string> = {\n [SpaceMember_Role.EDITOR]: 'role-editor.label',\n [SpaceMember_Role.READER]: 'role-viewer.label',\n [SpaceMember_Role.ADMIN]: 'role-admin.label',\n};\n\nexport type ContactPickerContainerProps = AppSurface.ContactPickerData;\n\nexport const ContactPickerContainer = ({ space, onAdd }: ContactPickerContainerProps) => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const contacts = useContacts();\n const members = useMembers(space.key);\n const identity = useIdentity();\n const [selected, setSelected] = useState<string>();\n const [role, setRole] = useState<AdmitRole>(SpaceMember_Role.EDITOR);\n const [joinUrl, setJoinUrl] = useState<string>();\n const [pending, setPending] = useState(false);\n\n const memberKeys = useMemo(\n () =>\n members\n .map((member) => toPublicKey(member.identity?.identityKey)?.toHex())\n .filter((key): key is string => key !== undefined),\n [members],\n );\n const selfKey = toPublicKey(identity?.identityKey);\n const selfRole = members.find(\n (member) => selfKey && toPublicKey(member.identity?.identityKey)?.equals(selfKey),\n )?.role;\n const canAdmit = selfRole === SpaceMember_Role.OWNER || selfRole === SpaceMember_Role.ADMIN;\n\n const handleAdd = async () => {\n if (!selected) {\n return;\n }\n\n setPending(true);\n try {\n const result = await onAdd([selected], role);\n setJoinUrl(result.joinUrl);\n setSelected(result.failed[0]?.key);\n } catch (err) {\n // Selection is kept so the user can retry.\n log.catch(err);\n } finally {\n setPending(false);\n }\n };\n\n if (contacts.length === 0) {\n return <p className='text-fg-muted'>{t('contact-picker-empty.message')}</p>;\n }\n\n return (\n <Layout.Container gap='md' role='group' gutter='none'>\n <Layout.Flex align='center' gap='sm'>\n <ContactPicker\n contacts={contacts}\n excludeKeys={memberKeys}\n value={selected}\n onChange={(key) => {\n setSelected(key);\n setJoinUrl(undefined);\n }}\n disabled={!canAdmit}\n />\n <Select.Root\n value={[String(role)]}\n onValueChange={({ value: [value] }) =>\n setRole(ROLES.find((candidate) => String(candidate) === value) ?? SpaceMember_Role.EDITOR)\n }\n items={ROLES.map((value) => ({ value: String(value), label: t(roleLabel[value]) }))}\n >\n <Select.Trigger classNames='min-w-[6rem]' disabled={!canAdmit} />\n <Select.Content>\n {ROLES.map((value) => (\n <Select.Item key={value} item={{ value: String(value), label: t(roleLabel[value]) }} />\n ))}\n </Select.Content>\n </Select.Root>\n <SystemButton.Add\n iconOnly\n label={t('contact-picker-add.label')}\n disabled={!canAdmit || pending || !selected}\n onClick={handleAdd}\n data-testid='contactPicker.add'\n />\n </Layout.Flex>\n {joinUrl && (\n <Layout.Flex gap='sm'>\n <Field.Root readOnly>\n <Input.Root readOnly value={joinUrl} data-testid='contactPicker.joinUrl' />\n </Field.Root>\n <SystemButton.Clipboard value={joinUrl} />\n </Layout.Flex>\n )}\n </Layout.Container>\n );\n};\n\nContactPickerContainer.displayName = 'ContactPickerContainer';\n"],"mappings":";;;;;;;;;;;;;;;;AAqBA,IAAM,QAAQ;CAAC,iBAAiB;CAAQ,iBAAiB;CAAQ,iBAAiB;AAAK;AAIvF,IAAM,YAAuC;EAC1C,iBAAiB,SAAS;EAC1B,iBAAiB,SAAS;EAC1B,iBAAiB,QAAQ;AAC5B;AAIA,IAAa,0BAA0B,EAAE,OAAO,YAAyC;CACvF,MAAM,EAAE,MAAM,MAAM,eAAe,KAAK,QAAQ,GAAG;CACnD,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,WAAW,MAAM,GAAG;CACpC,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,UAAU,eAAe,SAAiB;CACjD,MAAM,CAAC,MAAM,WAAW,SAAoB,iBAAiB,MAAM;CACnE,MAAM,CAAC,SAAS,cAAc,SAAiB;CAC/C,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAE5C,MAAM,aAAa,cAEf,QACG,KAAK,WAAW,YAAY,OAAO,UAAU,WAAW,CAAC,EAAE,MAAM,CAAC,CAAA,CAClE,QAAQ,QAAuB,QAAQ,KAAA,CAAS,GACrD,CAAC,OAAO,CACV;CACA,MAAM,UAAU,YAAY,UAAU,WAAW;CACjD,MAAM,WAAW,QAAQ,MACtB,WAAW,WAAW,YAAY,OAAO,UAAU,WAAW,CAAC,EAAE,OAAO,OAAO,CAClF,CAAC,EAAE;CACH,MAAM,WAAW,aAAa,iBAAiB,SAAS,aAAa,iBAAiB;CAEtF,MAAM,YAAY,YAAY;EAC5B,IAAI,CAAC,UACH;EAGF,WAAW,IAAI;EACf,IAAI;GACF,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,GAAG,IAAI;GAC3C,WAAW,OAAO,OAAO;GACzB,YAAY,OAAO,OAAO,EAAE,EAAE,GAAG;EACnC,SAAS,KAAK;GAEZ,IAAI,MAAM,KAAE,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,KAAA;GAAA,CAAC;EACf,UAAU;GACR,WAAW,KAAK;EAClB;CACF;CAEA,IAAI,SAAS,WAAW,GACtB,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAiB,UAAA,EAAE,8BAA8B;CAAK,CAAA;CAG5E,OACE,qBAAC,OAAO,WAAR;EAAkB,KAAI;EAAK,MAAK;EAAQ,QAAO;EAA/C,UAAA,CACE,qBAAC,OAAO,MAAR;GAAa,OAAM;GAAS,KAAI;GAAhC,UAAA;IACE,oBAAC,eAAD;KACY;KACV,aAAa;KACb,OAAO;KACP,WAAW,QAAQ;MACjB,YAAY,GAAG;MACf,WAAW,KAAA,CAAS;KACtB;KACA,UAAU,CAAC;IACZ,CAAA;IACD,qBAAC,OAAO,MAAR;KACE,OAAO,CAAC,OAAO,IAAI,CAAC;KACpB,gBAAgB,EAAE,OAAO,CAAC,aACxB,QAAQ,MAAM,MAAM,cAAc,OAAO,SAAS,MAAM,KAAK,KAAK,iBAAiB,MAAM;KAE3F,OAAO,MAAM,KAAK,WAAW;MAAE,OAAO,OAAO,KAAK;MAAG,OAAO,EAAE,UAAU,MAAM;KAAE,EAAE;KALpF,UAAA,CAOE,oBAAC,OAAO,SAAR;MAAgB,YAAW;MAAe,UAAU,CAAC;KAAW,CAAA,GAChE,oBAAC,OAAO,SAAR,EAAA,UACG,MAAM,KAAK,UACV,oBAAC,OAAO,MAAR,EAAyB,MAAM;MAAE,OAAO,OAAO,KAAK;MAAG,OAAO,EAAE,UAAU,MAAM;KAAE,EAAI,GAApE,KAAoE,CACvF,EACa,CAAA,CACL;;IACb,oBAAC,aAAa,KAAd;KACE,UAAA;KACA,OAAO,EAAE,0BAA0B;KACnC,UAAU,CAAC,YAAY,WAAW,CAAC;KACnC,SAAS;KACT,eAAY;IACb,CAAA;GACU;EACZ,CAAA,GAAA,WACC,qBAAC,OAAO,MAAR;GAAa,KAAI;GAAjB,UAAA,CACE,oBAAC,MAAM,MAAP;IAAY,UAAA;IACV,UAAA,oBAAC,MAAM,MAAP;KAAY,UAAA;KAAS,OAAO;KAAS,eAAY;IAAyB,CAAA;GAChE,CAAA,GACZ,oBAAC,aAAa,WAAd,EAAwB,OAAO,QAAU,CAAA,CAC9B;EAEC,CAAA,CAAA;;AAEtB;AAEA,uBAAuB,cAAc"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { meta } from "#meta";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { Form } from "@dxos/react-ui-form";
|
|
4
|
+
import * as UiHooks from "@dxos/react-ui/Hooks";
|
|
5
|
+
import { ContactList } from "@dxos/shell/react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import * as GraphPath from "@dxos/app-toolkit/GraphPath";
|
|
8
|
+
import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
|
|
9
|
+
import * as Hooks from "@dxos/app-framework/Hooks";
|
|
10
|
+
import * as Field from "@dxos/react-ui/Field";
|
|
11
|
+
import * as Input from "@dxos/react-ui/Input";
|
|
12
|
+
import { useSpaces } from "@dxos/react-client/echo";
|
|
13
|
+
import { useContacts } from "@dxos/react-client/halo";
|
|
14
|
+
//#region src/containers/ContactsContainer/ContactsContainer.tsx
|
|
15
|
+
var ContactsContainer = () => {
|
|
16
|
+
const { t } = UiHooks.useTranslation(meta.profile.key);
|
|
17
|
+
const { invokePromise } = Hooks.useOperationInvoker();
|
|
18
|
+
const contacts = useContacts();
|
|
19
|
+
const spaces = useSpaces();
|
|
20
|
+
const [filter, setFilter] = useState("");
|
|
21
|
+
const contactSpaces = useMemo(() => spaces.map((space) => ({
|
|
22
|
+
id: space.id,
|
|
23
|
+
key: space.key,
|
|
24
|
+
name: space.properties.name
|
|
25
|
+
})), [spaces]);
|
|
26
|
+
const handleSelectSpace = (selected) => void invokePromise(LayoutOperation.SwitchWorkspace, { subject: GraphPath.getSpacePath(selected.id) });
|
|
27
|
+
return /* @__PURE__ */ jsx(Form.Root, {
|
|
28
|
+
variant: "settings",
|
|
29
|
+
children: /* @__PURE__ */ jsx(Form.Viewport, {
|
|
30
|
+
scroll: true,
|
|
31
|
+
children: /* @__PURE__ */ jsx(Form.Content, { children: /* @__PURE__ */ jsxs(Form.FieldSet, {
|
|
32
|
+
label: t("contacts.label"),
|
|
33
|
+
description: t("contacts.description"),
|
|
34
|
+
children: [(contacts.length > 1 || filter !== "") && /* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Input.Root, {
|
|
35
|
+
placeholder: t("contacts-search.placeholder"),
|
|
36
|
+
value: filter,
|
|
37
|
+
onChange: (event) => setFilter(event.target.value),
|
|
38
|
+
"data-testid": "contacts.search"
|
|
39
|
+
}) }), /* @__PURE__ */ jsx(ContactList, {
|
|
40
|
+
classNames: "mt-3",
|
|
41
|
+
contacts,
|
|
42
|
+
spaces: contactSpaces,
|
|
43
|
+
filter,
|
|
44
|
+
onSelectSpace: handleSelectSpace
|
|
45
|
+
})]
|
|
46
|
+
}) })
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { ContactsContainer as default };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=chunk-ContactsContainer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ContactsContainer.mjs","names":[],"sources":["../../src/containers/ContactsContainer/ContactsContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { useSpaces } from '@dxos/react-client/echo';\nimport { useContacts } from '@dxos/react-client/halo';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport { ContactList, type ContactSpace } from '@dxos/shell/react';\n\nimport { meta } from '#meta';\n\nexport const ContactsContainer = () => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const { invokePromise } = Hooks.useOperationInvoker();\n const contacts = useContacts();\n const spaces = useSpaces();\n const [filter, setFilter] = useState('');\n const contactSpaces = useMemo(\n (): ContactSpace[] => spaces.map((space) => ({ id: space.id, key: space.key, name: space.properties.name })),\n [spaces],\n );\n\n const handleSelectSpace = (selected: ContactSpace) =>\n void invokePromise(LayoutOperation.SwitchWorkspace, { subject: GraphPath.getSpacePath(selected.id) });\n\n return (\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.FieldSet label={t('contacts.label')} description={t('contacts.description')}>\n {(contacts.length > 1 || filter !== '') && (\n <Field.Root>\n <Input.Root\n placeholder={t('contacts-search.placeholder')}\n value={filter}\n onChange={(event) => setFilter(event.target.value)}\n data-testid='contacts.search'\n />\n </Field.Root>\n )}\n <ContactList\n classNames='mt-3'\n contacts={contacts}\n spaces={contactSpaces}\n filter={filter}\n onSelectSpace={handleSelectSpace}\n />\n </Form.FieldSet>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAmBA,IAAa,0BAA0B;CACrC,MAAM,EAAE,MAAM,QAAQ,eAAe,KAAK,QAAQ,GAAG;CACrD,MAAM,EAAE,kBAAkB,MAAM,oBAAoB;CACpD,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,UAAU;CACzB,MAAM,CAAC,QAAQ,aAAa,SAAS,EAAE;CACvC,MAAM,gBAAgB,cACE,OAAO,KAAK,WAAW;EAAE,IAAI,MAAM;EAAI,KAAK,MAAM;EAAK,MAAM,MAAM,WAAW;CAAK,EAAE,GAC3G,CAAC,MAAM,CACT;CAEA,MAAM,qBAAqB,aACzB,KAAK,cAAc,gBAAgB,iBAAiB,EAAE,SAAS,UAAU,aAAa,SAAS,EAAE,EAAE,CAAC;CAEtG,OACE,oBAAC,KAAK,MAAN;EAAW,SAAQ;EACjB,UAAA,oBAAC,KAAK,UAAN;GAAe,QAAA;GACb,UAAA,oBAAC,KAAK,SAAN,EAAA,UACE,qBAAC,KAAK,UAAN;IAAe,OAAO,EAAE,gBAAgB;IAAG,aAAa,EAAE,sBAAsB;IAAhF,UAAA,EACI,SAAS,SAAS,KAAK,WAAW,OAClC,oBAAC,MAAM,MAAP,EAAA,UACE,oBAAC,MAAM,MAAP;KACE,aAAa,EAAE,6BAA6B;KAC5C,OAAO;KACP,WAAW,UAAU,UAAU,MAAM,OAAO,KAAK;KACjD,eAAY;IACb,CAAA,EACS,CAAA,GAEd,oBAAC,aAAD;KACE,YAAW;KACD;KACV,QAAQ;KACA;KACR,eAAe;IAChB,CAAA,CACY;GACH,CAAA,EAAA,CAAA;EACD,CAAA;CACN,CAAA;AAEf"}
|
|
@@ -4,102 +4,42 @@ import { hexToEmoji } from "@dxos/util";
|
|
|
4
4
|
import { log } from "@dxos/log";
|
|
5
5
|
import { meta } from "#meta";
|
|
6
6
|
import { useCallback, useEffect, useState } from "react";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import { useClient } from "@dxos/react-client";
|
|
7
|
+
import * as Button from "@dxos/react-ui/Button";
|
|
8
|
+
import * as UiHooks from "@dxos/react-ui/Hooks";
|
|
9
|
+
import { AuthCode, Centered, Emoji, Viewport } from "@dxos/shell/react";
|
|
11
10
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
import
|
|
11
|
+
import { useClient } from "@dxos/react-client";
|
|
12
|
+
import * as EffectEx from "@dxos/effect/EffectEx";
|
|
13
|
+
import * as Hooks from "@dxos/app-framework/Hooks";
|
|
14
|
+
import { useDevices, useInvitationFlow } from "@dxos/halo-react";
|
|
15
|
+
import * as Icon from "@dxos/react-ui/Icon";
|
|
16
|
+
import * as Layout from "@dxos/react-ui/Layout";
|
|
17
|
+
import * as SystemButton from "@dxos/react-ui/SystemButton";
|
|
15
18
|
import { useNetworkStatus } from "@dxos/react-client/mesh";
|
|
16
|
-
import
|
|
17
|
-
import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from "@dxos/shell/react";
|
|
19
|
+
import * as QrCode from "@dxos/react-ui/QrCode";
|
|
18
20
|
import { osTranslations } from "@dxos/ui-theme";
|
|
21
|
+
import { DevicesForm } from "#components";
|
|
19
22
|
//#region src/containers/DevicesContainer/DevicesContainer.tsx
|
|
20
23
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/DevicesContainer/DevicesContainer.tsx";
|
|
21
24
|
var DevicesContainer = ({ createInvitationUrl, identityTestActions }) => {
|
|
22
|
-
const {
|
|
23
|
-
const { invokePromise } = useOperationInvoker();
|
|
25
|
+
const { invokePromise } = Hooks.useOperationInvoker();
|
|
24
26
|
const devices = useDevices();
|
|
25
27
|
const { swarm: connectionState } = useNetworkStatus();
|
|
26
28
|
const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);
|
|
27
29
|
const handleRecover = useCallback(() => invokePromise(ClientOperation.ResetStorage, { mode: "recover" }), [invokePromise]);
|
|
28
30
|
const handleJoinNewIdentity = useCallback(() => invokePromise(ClientOperation.ResetStorage, { mode: "join-new-identity" }), [invokePromise]);
|
|
29
|
-
return /* @__PURE__ */ jsx(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
children: /* @__PURE__ */ jsxs(Form.Group, { children: [/* @__PURE__ */ jsxs("div", {
|
|
38
|
-
role: "group",
|
|
39
|
-
className: "min-w-0",
|
|
40
|
-
children: [/* @__PURE__ */ jsx("h3", {
|
|
41
|
-
className: "text-lg mb-2",
|
|
42
|
-
children: t("devices.label", { ns: meta.profile.key })
|
|
43
|
-
}), /* @__PURE__ */ jsx(Listbox.Root, { children: /* @__PURE__ */ jsx(Listbox.Content, {
|
|
44
|
-
"aria-label": t("devices.label", { ns: meta.profile.key }),
|
|
45
|
-
children: devices.map((device) => /* @__PURE__ */ jsx(DeviceListItem, {
|
|
46
|
-
device,
|
|
47
|
-
connectionState
|
|
48
|
-
}, device.key))
|
|
49
|
-
}) })]
|
|
50
|
-
}), createInvitationUrl && /* @__PURE__ */ jsxs("div", {
|
|
51
|
-
role: "group",
|
|
52
|
-
className: "min-w-0",
|
|
53
|
-
children: [/* @__PURE__ */ jsx("h3", {
|
|
54
|
-
className: "text-lg mb-2",
|
|
55
|
-
children: t("add-device.label")
|
|
56
|
-
}), /* @__PURE__ */ jsx(DeviceInvitation, { createInvitationUrl })]
|
|
57
|
-
})] })
|
|
58
|
-
}),
|
|
59
|
-
/* @__PURE__ */ jsx(Form.Section, {
|
|
60
|
-
title: t("logout-section.title"),
|
|
61
|
-
description: t("logout-section.description"),
|
|
62
|
-
children: /* @__PURE__ */ jsx(Form.Row, {
|
|
63
|
-
label: t("logout.label"),
|
|
64
|
-
description: t("logout.description"),
|
|
65
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
66
|
-
variant: "destructive",
|
|
67
|
-
onClick: handleLogout,
|
|
68
|
-
"data-testid": "devicesContainer.logout",
|
|
69
|
-
children: t("logout.label")
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
}),
|
|
73
|
-
identityTestActions && /* @__PURE__ */ jsxs(Form.Section, {
|
|
74
|
-
title: t("identity-test-section.title"),
|
|
75
|
-
description: t("identity-test-section.description"),
|
|
76
|
-
children: [/* @__PURE__ */ jsx(Form.Row, {
|
|
77
|
-
label: t("recover-identity.label"),
|
|
78
|
-
description: t("recover-identity.description"),
|
|
79
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
80
|
-
variant: "destructive",
|
|
81
|
-
onClick: handleRecover,
|
|
82
|
-
"data-testid": "devicesContainer.recover",
|
|
83
|
-
children: t("recover-identity.label")
|
|
84
|
-
})
|
|
85
|
-
}), /* @__PURE__ */ jsx(Form.Row, {
|
|
86
|
-
label: t("join-new-identity.label"),
|
|
87
|
-
description: t("join-new-identity.description"),
|
|
88
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
89
|
-
variant: "destructive",
|
|
90
|
-
onClick: handleJoinNewIdentity,
|
|
91
|
-
"data-testid": "devicesContainer.joinExisting",
|
|
92
|
-
children: t("join-new-identity.label")
|
|
93
|
-
})
|
|
94
|
-
})]
|
|
95
|
-
})
|
|
96
|
-
] })
|
|
97
|
-
})
|
|
98
|
-
}) });
|
|
31
|
+
return /* @__PURE__ */ jsx(DevicesForm, {
|
|
32
|
+
devices,
|
|
33
|
+
connectionState,
|
|
34
|
+
invitation: createInvitationUrl && /* @__PURE__ */ jsx(DeviceInvitation, { createInvitationUrl }),
|
|
35
|
+
onLogout: handleLogout,
|
|
36
|
+
onRecover: identityTestActions ? handleRecover : void 0,
|
|
37
|
+
onJoinNewIdentity: identityTestActions ? handleJoinNewIdentity : void 0
|
|
38
|
+
});
|
|
99
39
|
};
|
|
100
40
|
var DeviceInvitation = (props) => {
|
|
101
41
|
const client = useClient();
|
|
102
|
-
const [identityService] = useCapabilities(ClientCapabilities.IdentityService);
|
|
42
|
+
const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);
|
|
103
43
|
const [flow, setFlow] = useState();
|
|
104
44
|
const [pending, setPending] = useState(false);
|
|
105
45
|
const onInvitationCreate = useCallback(() => {
|
|
@@ -109,14 +49,14 @@ var DeviceInvitation = (props) => {
|
|
|
109
49
|
if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }), void 0, {
|
|
110
50
|
"~LogMeta": "~LogMeta",
|
|
111
51
|
F: __dxlog_file,
|
|
112
|
-
L:
|
|
52
|
+
L: 89,
|
|
113
53
|
S: void 0
|
|
114
54
|
});
|
|
115
55
|
setFlow(created);
|
|
116
56
|
}).catch((err) => log.catch(err, void 0, {
|
|
117
57
|
"~LogMeta": "~LogMeta",
|
|
118
58
|
F: __dxlog_file,
|
|
119
|
-
L:
|
|
59
|
+
L: 93,
|
|
120
60
|
S: void 0
|
|
121
61
|
})).finally(() => setPending(false));
|
|
122
62
|
}, [
|
|
@@ -129,7 +69,7 @@ var DeviceInvitation = (props) => {
|
|
|
129
69
|
if (flow) EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err, void 0, {
|
|
130
70
|
"~LogMeta": "~LogMeta",
|
|
131
71
|
F: __dxlog_file,
|
|
132
|
-
L:
|
|
72
|
+
L: 100,
|
|
133
73
|
S: void 0
|
|
134
74
|
}));
|
|
135
75
|
setFlow(void 0);
|
|
@@ -154,7 +94,7 @@ var DeviceInvitationImpl = ({ flow, createInvitationUrl, onInvitationDone, onInv
|
|
|
154
94
|
if (event?._tag === "readyForAuthentication" && client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") log.info(JSON.stringify({ authCode: event.authCode }), void 0, {
|
|
155
95
|
"~LogMeta": "~LogMeta",
|
|
156
96
|
F: __dxlog_file,
|
|
157
|
-
L:
|
|
97
|
+
L: 129,
|
|
158
98
|
S: void 0
|
|
159
99
|
});
|
|
160
100
|
}, [event?._tag]);
|
|
@@ -170,13 +110,13 @@ var DeviceInvitationImpl = ({ flow, createInvitationUrl, onInvitationDone, onInv
|
|
|
170
110
|
});
|
|
171
111
|
};
|
|
172
112
|
var InvitationSection = ({ event, invitationId = "never", url = "never", onInvitationDone = () => {}, onInvitationCreate = () => {} }) => {
|
|
173
|
-
const { t } = useTranslation(meta.profile.key);
|
|
113
|
+
const { t } = UiHooks.useTranslation(meta.profile.key);
|
|
174
114
|
const authCode = event?._tag === "readyForAuthentication" ? event.authCode : void 0;
|
|
175
115
|
const activeView = !event ? "init" : event._tag === "cancelled" || event._tag === "error" || event._tag === "success" ? "complete" : authCode ? "auth-code" : "qr-code";
|
|
176
116
|
return activeView === "init" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("p", {
|
|
177
|
-
className: "text-
|
|
117
|
+
className: "text-fg-muted mb-2",
|
|
178
118
|
children: t("add-device.description")
|
|
179
|
-
}), /* @__PURE__ */ jsx(
|
|
119
|
+
}), /* @__PURE__ */ jsx(Button.Root, {
|
|
180
120
|
icon: "ph--plus--regular",
|
|
181
121
|
label: t("create-device-invitation.label"),
|
|
182
122
|
disabled: !!event,
|
|
@@ -211,30 +151,26 @@ var InvitationSection = ({ event, invitationId = "never", url = "never", onInvit
|
|
|
211
151
|
});
|
|
212
152
|
};
|
|
213
153
|
var InvitationQR = ({ id, url, onCancel }) => {
|
|
214
|
-
const { t } = useTranslation(osTranslations);
|
|
215
|
-
const qrLabel = useId("devices-container__qr-code");
|
|
154
|
+
const { t } = UiHooks.useTranslation(osTranslations);
|
|
155
|
+
const qrLabel = UiHooks.useId("devices-container__qr-code");
|
|
216
156
|
const emoji = hexToEmoji(id);
|
|
217
157
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
218
158
|
/* @__PURE__ */ jsx("p", {
|
|
219
|
-
className: "text-
|
|
159
|
+
className: "text-fg-muted",
|
|
220
160
|
children: t("qr-code.description", { ns: meta.profile.key })
|
|
221
161
|
}),
|
|
222
162
|
/* @__PURE__ */ jsxs("div", {
|
|
223
163
|
role: "group",
|
|
224
164
|
className: "grid grid-cols-[1fr_min-content]",
|
|
225
|
-
children: [/* @__PURE__ */ jsx(Flex, {
|
|
165
|
+
children: [/* @__PURE__ */ jsx(Layout.Flex, {
|
|
226
166
|
justify: "center",
|
|
227
167
|
classNames: "py-4",
|
|
228
168
|
children: /* @__PURE__ */ jsxs("div", {
|
|
229
|
-
className: "w-full md:max-w-80 aspect-square relative text-
|
|
230
|
-
children: [/* @__PURE__ */ jsx(
|
|
231
|
-
rounding: 100,
|
|
232
|
-
backgroundColor: "transparent",
|
|
233
|
-
color: "currentColor",
|
|
169
|
+
className: "w-full md:max-w-80 aspect-square relative text-fg-muted",
|
|
170
|
+
children: [/* @__PURE__ */ jsx(QrCode.QrCode, {
|
|
234
171
|
"aria-labelledby": qrLabel,
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
children: url ?? "never"
|
|
172
|
+
errorCorrection: "Q",
|
|
173
|
+
value: url ?? "never"
|
|
238
174
|
}), /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(Emoji, { text: emoji }) })]
|
|
239
175
|
})
|
|
240
176
|
}), /* @__PURE__ */ jsx("span", {
|
|
@@ -243,11 +179,11 @@ var InvitationQR = ({ id, url, onCancel }) => {
|
|
|
243
179
|
children: t("qr.label")
|
|
244
180
|
})]
|
|
245
181
|
}),
|
|
246
|
-
/* @__PURE__ */ jsx(Flex, {
|
|
182
|
+
/* @__PURE__ */ jsx(Layout.Flex, {
|
|
247
183
|
justify: "center",
|
|
248
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
184
|
+
children: /* @__PURE__ */ jsxs(Layout.Flex, {
|
|
249
185
|
gap: "sm",
|
|
250
|
-
children: [/* @__PURE__ */ jsx(Clipboard
|
|
186
|
+
children: [/* @__PURE__ */ jsx(SystemButton.Clipboard, { value: url ?? "never" }), /* @__PURE__ */ jsx(Button.Root, {
|
|
251
187
|
variant: "ghost",
|
|
252
188
|
onClick: onCancel,
|
|
253
189
|
children: t("cancel.label")
|
|
@@ -257,11 +193,11 @@ var InvitationQR = ({ id, url, onCancel }) => {
|
|
|
257
193
|
] });
|
|
258
194
|
};
|
|
259
195
|
var InvitationAuthCode = ({ id, code, onCancel }) => {
|
|
260
|
-
const { t } = useTranslation(osTranslations);
|
|
196
|
+
const { t } = UiHooks.useTranslation(osTranslations);
|
|
261
197
|
const emoji = hexToEmoji(id);
|
|
262
198
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
263
199
|
/* @__PURE__ */ jsx("p", {
|
|
264
|
-
className: "text-
|
|
200
|
+
className: "text-fg-muted",
|
|
265
201
|
children: t("auth-other-device-emoji.message")
|
|
266
202
|
}),
|
|
267
203
|
emoji && /* @__PURE__ */ jsx(Emoji, {
|
|
@@ -269,7 +205,7 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
|
|
|
269
205
|
className: "mx-auto my-2 text-center"
|
|
270
206
|
}),
|
|
271
207
|
/* @__PURE__ */ jsx("p", {
|
|
272
|
-
className: "text-
|
|
208
|
+
className: "text-fg-muted",
|
|
273
209
|
children: t("auth-code.message")
|
|
274
210
|
}),
|
|
275
211
|
/* @__PURE__ */ jsx(AuthCode, {
|
|
@@ -277,7 +213,7 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
|
|
|
277
213
|
large: true,
|
|
278
214
|
classNames: "mx-auto my-2 text-center grow"
|
|
279
215
|
}),
|
|
280
|
-
/* @__PURE__ */ jsx(Button, {
|
|
216
|
+
/* @__PURE__ */ jsx(Button.Root, {
|
|
281
217
|
variant: "ghost",
|
|
282
218
|
onClick: onCancel,
|
|
283
219
|
children: t("cancel.label")
|
|
@@ -285,13 +221,13 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
|
|
|
285
221
|
] });
|
|
286
222
|
};
|
|
287
223
|
var InvitationComplete = ({ succeeded }) => {
|
|
288
|
-
return succeeded ? /* @__PURE__ */ jsx(Icon, {
|
|
224
|
+
return succeeded ? /* @__PURE__ */ jsx(Icon.Icon, {
|
|
289
225
|
icon: "ph--check--regular",
|
|
290
|
-
size:
|
|
226
|
+
size: "xl",
|
|
291
227
|
classNames: "m-trim-xs"
|
|
292
|
-
}) : /* @__PURE__ */ jsx(Icon, {
|
|
228
|
+
}) : /* @__PURE__ */ jsx(Icon.Icon, {
|
|
293
229
|
icon: "ph--x--regular",
|
|
294
|
-
size:
|
|
230
|
+
size: "xl",
|
|
295
231
|
classNames: "m-trim-xs"
|
|
296
232
|
});
|
|
297
233
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-DevicesContainer.mjs","names":[],"sources":["../../src/containers/DevicesContainer/DevicesContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { QR } from 'react-qr-rounded';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { EffectEx } from '@dxos/effect';\nimport { type Identity, type Invitation } from '@dxos/halo';\nimport { useDevices, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { Button, Clipboard, Flex, Icon, IconButton, useId, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { Listbox } from '@dxos/react-ui-list';\nimport { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { hexToEmoji } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { ClientCapabilities, ClientOptions } from '#types';\n\nexport type DevicesContainerProps = Pick<ClientOptions.ClientPluginOptions, 'identityTestActions'> & {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl, identityTestActions }: DevicesContainerProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const devices = useDevices();\n const { swarm: connectionState } = useNetworkStatus();\n\n const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);\n\n const handleRecover = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),\n [invokePromise],\n );\n\n const handleJoinNewIdentity = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'join-new-identity' }),\n [invokePromise],\n );\n\n return (\n <Clipboard.Provider>\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section\n title={t('devices-verbose.label', { ns: meta.profile.key })}\n description={t('devices.description', { ns: meta.profile.key })}\n >\n <Form.Group>\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('devices.label', { ns: meta.profile.key })}</h3>\n <Listbox.Root>\n <Listbox.Content aria-label={t('devices.label', { ns: meta.profile.key })}>\n {devices.map((device: Identity.DeviceInfo) => (\n <DeviceListItem key={device.key} device={device} connectionState={connectionState} />\n ))}\n </Listbox.Content>\n </Listbox.Root>\n </div>\n {createInvitationUrl && (\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('add-device.label')}</h3>\n <DeviceInvitation createInvitationUrl={createInvitationUrl} />\n </div>\n )}\n </Form.Group>\n </Form.Section>\n <Form.Section title={t('logout-section.title')} description={t('logout-section.description')}>\n <Form.Row label={t('logout.label')} description={t('logout.description')}>\n <Button variant='destructive' onClick={handleLogout} data-testid='devicesContainer.logout'>\n {t('logout.label')}\n </Button>\n </Form.Row>\n </Form.Section>\n {identityTestActions && (\n <Form.Section\n title={t('identity-test-section.title')}\n description={t('identity-test-section.description')}\n >\n <Form.Row label={t('recover-identity.label')} description={t('recover-identity.description')}>\n <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>\n {t('recover-identity.label')}\n </Button>\n </Form.Row>\n <Form.Row label={t('join-new-identity.label')} description={t('join-new-identity.description')}>\n <Button\n variant='destructive'\n onClick={handleJoinNewIdentity}\n data-testid='devicesContainer.joinExisting'\n >\n {t('join-new-identity.label')}\n </Button>\n </Form.Row>\n </Form.Section>\n )}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n </Clipboard.Provider>\n );\n};\n\ntype DeviceInvitationProps = {\n flow?: Invitation.Flow;\n createInvitationUrl: (invitationCode: string) => string;\n onInvitationDone: () => void;\n onInvitationCreate: () => void;\n};\n\nconst DeviceInvitation = (props: Pick<DeviceInvitationProps, 'createInvitationUrl'>) => {\n // `client.config` only — the network status above keeps this container on the client regardless\n // (Missing API 9). The gate matters: an invitation code in a production console is a live secret.\n const client = useClient();\n const [identityService] = useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n // Latched before the share resolves, so a second click cannot open a second live invitation.\n const [pending, setPending] = useState(false);\n\n const onInvitationCreate = useCallback(() => {\n if (!identityService || pending || flow) {\n return;\n }\n setPending(true);\n // Requested explicitly because `share()` defaults to no authentication, which would leave the\n // invitation code as the only factor guarding an identity.\n void EffectEx.runPromise(identityService.share({ authMethod: 'shared-secret' }))\n .then(async (created) => {\n // Playwright reads this line off the console to drive the device-invitation flows.\n if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {\n log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }));\n }\n setFlow(created);\n })\n .catch((err) => log.catch(err))\n .finally(() => setPending(false));\n }, [client, identityService, pending, flow]);\n\n const onInvitationDone = useCallback(() => {\n // Cancel before dropping the handle: clearing local state alone leaves the host side listening.\n if (flow) {\n void EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err));\n }\n setFlow(undefined);\n }, [flow]);\n\n if (flow) {\n return <DeviceInvitationImpl {...props} {...{ flow, onInvitationCreate, onInvitationDone }} />;\n } else {\n return <InvitationSection {...props} {...{ onInvitationCreate, onInvitationDone }} />;\n }\n};\n\nconst DeviceInvitationImpl = ({\n flow,\n createInvitationUrl,\n onInvitationDone,\n onInvitationCreate,\n}: DeviceInvitationProps) => {\n const client = useClient();\n const { event, code } = useInvitationFlow(flow);\n const url = code && createInvitationUrl(code);\n\n // Logged separately from the invitation code Playwright reads on creation, because the host only\n // learns the auth code once a guest has connected.\n useEffect(() => {\n if (\n event?._tag === 'readyForAuthentication' &&\n client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production'\n ) {\n log.info(JSON.stringify({ authCode: event.authCode }));\n }\n }, [event?._tag]);\n\n // Every terminal event returns to the creation view; parking on the completion icon would strand\n // a failed or cancelled invitation with no way to retry.\n useEffect(() => {\n if (event && (event._tag === 'success' || event._tag === 'cancelled' || event._tag === 'error')) {\n onInvitationDone();\n }\n }, [event?._tag]);\n\n return <InvitationSection {...{ event, invitationId: flow?.id, url, onInvitationDone, onInvitationCreate }} />;\n};\n\ntype InvitationComponentProps = Partial<\n Pick<DeviceInvitationProps, 'onInvitationDone' | 'onInvitationCreate'> & {\n event: Invitation.Event;\n invitationId: string;\n url: string;\n }\n>;\n\nconst InvitationSection = ({\n event,\n invitationId = 'never',\n url = 'never',\n onInvitationDone = () => {},\n onInvitationCreate = () => {},\n}: InvitationComponentProps) => {\n const { t } = useTranslation(meta.profile.key);\n const authCode = event?._tag === 'readyForAuthentication' ? event.authCode : undefined;\n const activeView = !event\n ? 'init'\n : event._tag === 'cancelled' || event._tag === 'error' || event._tag === 'success'\n ? 'complete'\n : authCode\n ? 'auth-code'\n : 'qr-code';\n\n return activeView === 'init' ? (\n <>\n <p className='text-description mb-2'>{t('add-device.description')}</p>\n <IconButton\n icon='ph--plus--regular'\n label={t('create-device-invitation.label')}\n disabled={!!event}\n classNames='w-full'\n data-testid='devicesContainer.createInvitation'\n onClick={onInvitationCreate}\n />\n </>\n ) : (\n <Viewport.Root activeView={activeView}>\n <Viewport.Views>\n <Viewport.View id='init'>\n {/* This view intentionally left blank while conditionally rendering the viewport. */}\n </Viewport.View>\n <Viewport.View id='complete'>\n <InvitationComplete succeeded={event?._tag === 'success'} />\n </Viewport.View>\n <Viewport.View id='auth-code'>\n <InvitationAuthCode id={invitationId} code={authCode ?? 'never'} onCancel={onInvitationDone} />\n </Viewport.View>\n <Viewport.View id='qr-code'>\n <InvitationQR id={invitationId} url={url} onCancel={onInvitationDone} />\n </Viewport.View>\n </Viewport.Views>\n </Viewport.Root>\n );\n};\n\nconst InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const qrLabel = useId('devices-container__qr-code');\n const emoji = hexToEmoji(id);\n return (\n <>\n <p className='text-description'>{t('qr-code.description', { ns: meta.profile.key })}</p>\n <div role='group' className='grid grid-cols-[1fr_min-content]'>\n <Flex justify='center' classNames='py-4'>\n <div className='w-full md:max-w-80 aspect-square relative text-description'>\n <QR\n rounding={100}\n backgroundColor='transparent'\n color='currentColor'\n aria-labelledby={qrLabel}\n errorCorrectionLevel='Q'\n cutout={true}\n >\n {url ?? 'never'}\n </QR>\n <Centered>\n <Emoji text={emoji} />\n </Centered>\n </div>\n </Flex>\n <span id={qrLabel} className='sr-only'>\n {t('qr.label')}\n </span>\n </div>\n {/* TODO(burdon): Factor out button bar */}\n <Flex justify='center'>\n <Flex gap='sm'>\n <Clipboard.Button value={url ?? 'never'} />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button>\n </Flex>\n </Flex>\n </>\n );\n};\n\nconst InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const emoji = hexToEmoji(id);\n\n return (\n <>\n <p className='text-description'>{t('auth-other-device-emoji.message')}</p>\n {emoji && <Emoji text={emoji} className='mx-auto my-2 text-center' />}\n <p className='text-description'>{t('auth-code.message')}</p>\n <AuthCode code={code} large classNames='mx-auto my-2 text-center grow' />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button>\n </>\n );\n};\n\nconst InvitationComplete = ({ succeeded }: { succeeded: boolean }) => {\n return succeeded ? (\n <Icon icon='ph--check--regular' size={6} classNames='m-trim-xs' />\n ) : (\n <Icon icon='ph--x--regular' size={6} classNames='m-trim-xs' />\n );\n};\n\nDevicesContainer.displayName = 'DevicesContainer';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chunk-DevicesContainer.mjs","names":[],"sources":["../../src/containers/DevicesContainer/DevicesContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport { type Invitation } from '@dxos/halo';\nimport { useDevices, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as QrCode from '@dxos/react-ui/QrCode';\nimport * as SystemButton from '@dxos/react-ui/SystemButton';\nimport { AuthCode, Centered, Emoji, Viewport } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { hexToEmoji } from '@dxos/util';\n\nimport { DevicesForm } from '#components';\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { ClientCapabilities, ClientOptions } from '#types';\n\nexport type DevicesContainerProps = Pick<ClientOptions.ClientPluginOptions, 'identityTestActions'> & {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl, identityTestActions }: DevicesContainerProps) => {\n const { invokePromise } = Hooks.useOperationInvoker();\n const devices = useDevices();\n const { swarm: connectionState } = useNetworkStatus();\n\n const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);\n\n const handleRecover = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),\n [invokePromise],\n );\n\n const handleJoinNewIdentity = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'join-new-identity' }),\n [invokePromise],\n );\n\n return (\n <DevicesForm\n devices={devices}\n connectionState={connectionState}\n invitation={createInvitationUrl && <DeviceInvitation createInvitationUrl={createInvitationUrl} />}\n onLogout={handleLogout}\n onRecover={identityTestActions ? handleRecover : undefined}\n onJoinNewIdentity={identityTestActions ? handleJoinNewIdentity : undefined}\n />\n );\n};\n\ntype DeviceInvitationProps = {\n flow?: Invitation.Flow;\n createInvitationUrl: (invitationCode: string) => string;\n onInvitationDone: () => void;\n onInvitationCreate: () => void;\n};\n\nconst DeviceInvitation = (props: Pick<DeviceInvitationProps, 'createInvitationUrl'>) => {\n // `client.config` only — the network status above keeps this container on the client regardless\n // (Missing API 9). The gate matters: an invitation code in a production console is a live secret.\n const client = useClient();\n const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n // Latched before the share resolves, so a second click cannot open a second live invitation.\n const [pending, setPending] = useState(false);\n\n const onInvitationCreate = useCallback(() => {\n if (!identityService || pending || flow) {\n return;\n }\n setPending(true);\n // Requested explicitly because `share()` defaults to no authentication, which would leave the\n // invitation code as the only factor guarding an identity.\n void EffectEx.runPromise(identityService.share({ authMethod: 'shared-secret' }))\n .then(async (created) => {\n // Playwright reads this line off the console to drive the device-invitation flows.\n if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {\n log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }));\n }\n setFlow(created);\n })\n .catch((err) => log.catch(err))\n .finally(() => setPending(false));\n }, [client, identityService, pending, flow]);\n\n const onInvitationDone = useCallback(() => {\n // Cancel before dropping the handle: clearing local state alone leaves the host side listening.\n if (flow) {\n void EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err));\n }\n setFlow(undefined);\n }, [flow]);\n\n if (flow) {\n return <DeviceInvitationImpl {...props} {...{ flow, onInvitationCreate, onInvitationDone }} />;\n } else {\n return <InvitationSection {...props} {...{ onInvitationCreate, onInvitationDone }} />;\n }\n};\n\nconst DeviceInvitationImpl = ({\n flow,\n createInvitationUrl,\n onInvitationDone,\n onInvitationCreate,\n}: DeviceInvitationProps) => {\n const client = useClient();\n const { event, code } = useInvitationFlow(flow);\n const url = code && createInvitationUrl(code);\n\n // Logged separately from the invitation code Playwright reads on creation, because the host only\n // learns the auth code once a guest has connected.\n useEffect(() => {\n if (\n event?._tag === 'readyForAuthentication' &&\n client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production'\n ) {\n log.info(JSON.stringify({ authCode: event.authCode }));\n }\n }, [event?._tag]);\n\n // Every terminal event returns to the creation view; parking on the completion icon would strand\n // a failed or cancelled invitation with no way to retry.\n useEffect(() => {\n if (event && (event._tag === 'success' || event._tag === 'cancelled' || event._tag === 'error')) {\n onInvitationDone();\n }\n }, [event?._tag]);\n\n return <InvitationSection {...{ event, invitationId: flow?.id, url, onInvitationDone, onInvitationCreate }} />;\n};\n\ntype InvitationComponentProps = Partial<\n Pick<DeviceInvitationProps, 'onInvitationDone' | 'onInvitationCreate'> & {\n event: Invitation.Event;\n invitationId: string;\n url: string;\n }\n>;\n\nconst InvitationSection = ({\n event,\n invitationId = 'never',\n url = 'never',\n onInvitationDone = () => {},\n onInvitationCreate = () => {},\n}: InvitationComponentProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const authCode = event?._tag === 'readyForAuthentication' ? event.authCode : undefined;\n const activeView = !event\n ? 'init'\n : event._tag === 'cancelled' || event._tag === 'error' || event._tag === 'success'\n ? 'complete'\n : authCode\n ? 'auth-code'\n : 'qr-code';\n\n return activeView === 'init' ? (\n <>\n <p className='text-fg-muted mb-2'>{t('add-device.description')}</p>\n <Button.Root\n icon='ph--plus--regular'\n label={t('create-device-invitation.label')}\n disabled={!!event}\n classNames='w-full'\n data-testid='devicesContainer.createInvitation'\n onClick={onInvitationCreate}\n />\n </>\n ) : (\n <Viewport.Root activeView={activeView}>\n <Viewport.Views>\n <Viewport.View id='init'>\n {/* This view intentionally left blank while conditionally rendering the viewport. */}\n </Viewport.View>\n <Viewport.View id='complete'>\n <InvitationComplete succeeded={event?._tag === 'success'} />\n </Viewport.View>\n <Viewport.View id='auth-code'>\n <InvitationAuthCode id={invitationId} code={authCode ?? 'never'} onCancel={onInvitationDone} />\n </Viewport.View>\n <Viewport.View id='qr-code'>\n <InvitationQR id={invitationId} url={url} onCancel={onInvitationDone} />\n </Viewport.View>\n </Viewport.Views>\n </Viewport.Root>\n );\n};\n\nconst InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {\n const { t } = UiHooks.useTranslation(osTranslations);\n const qrLabel = UiHooks.useId('devices-container__qr-code');\n const emoji = hexToEmoji(id);\n return (\n <>\n <p className='text-fg-muted'>{t('qr-code.description', { ns: meta.profile.key })}</p>\n <div role='group' className='grid grid-cols-[1fr_min-content]'>\n <Layout.Flex justify='center' classNames='py-4'>\n <div className='w-full md:max-w-80 aspect-square relative text-fg-muted'>\n <QrCode.QrCode aria-labelledby={qrLabel} errorCorrection='Q' value={url ?? 'never'} />\n <Centered>\n <Emoji text={emoji} />\n </Centered>\n </div>\n </Layout.Flex>\n <span id={qrLabel} className='sr-only'>\n {t('qr.label')}\n </span>\n </div>\n {/* TODO(burdon): Factor out button bar */}\n <Layout.Flex justify='center'>\n <Layout.Flex gap='sm'>\n <SystemButton.Clipboard value={url ?? 'never'} />\n <Button.Root variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button.Root>\n </Layout.Flex>\n </Layout.Flex>\n </>\n );\n};\n\nconst InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {\n const { t } = UiHooks.useTranslation(osTranslations);\n const emoji = hexToEmoji(id);\n\n return (\n <>\n <p className='text-fg-muted'>{t('auth-other-device-emoji.message')}</p>\n {emoji && <Emoji text={emoji} className='mx-auto my-2 text-center' />}\n <p className='text-fg-muted'>{t('auth-code.message')}</p>\n <AuthCode code={code} large classNames='mx-auto my-2 text-center grow' />\n <Button.Root variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button.Root>\n </>\n );\n};\n\nconst InvitationComplete = ({ succeeded }: { succeeded: boolean }) => {\n return succeeded ? (\n <Icon.Icon icon='ph--check--regular' size='xl' classNames='m-trim-xs' />\n ) : (\n <Icon.Icon icon='ph--x--regular' size='xl' classNames='m-trim-xs' />\n );\n};\n\nDevicesContainer.displayName = 'DevicesContainer';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import * as Capability from "@dxos/app-framework/Capability";
|
|
3
|
+
import { ClientCapabilities } from "#types";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { Identity, Space } from "@dxos/halo";
|
|
6
|
+
//#region src/halo-services-layer.ts
|
|
7
|
+
/**
|
|
8
|
+
* Provides the canonical `@dxos/halo` services (`Identity.Service` / `Space.Service`) from the
|
|
9
|
+
* client-backed capabilities contributed by this plugin. Consumers depend on the halo services
|
|
10
|
+
* directly and provide this layer, rather than reaching for the capability instances:
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* yield* Identity.getSnapshot; // requires Identity.Service
|
|
14
|
+
* // provided by:
|
|
15
|
+
* effect.pipe(Effect.provide(HaloServicesLayer));
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The layer itself requires `Capability.Service` (the capability manager), which is in scope inside
|
|
19
|
+
* capability modules and operation handlers.
|
|
20
|
+
*/
|
|
21
|
+
var HaloServicesLayer = Layer.merge(Capability.layerWith(ClientCapabilities.IdentityService, (service) => Layer.succeed(Identity.Service, service)), Capability.layerWith(ClientCapabilities.SpaceService, (service) => Layer.succeed(Space.Service, service)));
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/HaloServices.ts
|
|
24
|
+
var HaloServices_exports = /* @__PURE__ */ __exportAll({ layer: () => HaloServicesLayer });
|
|
25
|
+
//#endregion
|
|
26
|
+
export { HaloServicesLayer as n, HaloServices_exports as t };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=chunk-HaloServices.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-HaloServices.mjs","names":[],"sources":["../../src/halo-services-layer.ts","../../src/HaloServices.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Layer from 'effect/Layer';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport { Identity, Space } from '@dxos/halo';\n\nimport { ClientCapabilities } from '#types';\n\n/**\n * Provides the canonical `@dxos/halo` services (`Identity.Service` / `Space.Service`) from the\n * client-backed capabilities contributed by this plugin. Consumers depend on the halo services\n * directly and provide this layer, rather than reaching for the capability instances:\n *\n * ```ts\n * yield* Identity.getSnapshot; // requires Identity.Service\n * // provided by:\n * effect.pipe(Effect.provide(HaloServicesLayer));\n * ```\n *\n * The layer itself requires `Capability.Service` (the capability manager), which is in scope inside\n * capability modules and operation handlers.\n */\nexport const HaloServicesLayer: Layer.Layer<Identity.Service | Space.Service, never, Capability.Service> = Layer.merge(\n Capability.layerWith(ClientCapabilities.IdentityService, (service) => Layer.succeed(Identity.Service, service)),\n Capability.layerWith(ClientCapabilities.SpaceService, (service) => Layer.succeed(Space.Service, service)),\n);\n","//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nexport { HaloServicesLayer as layer } from './halo-services-layer.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyBA,IAAa,oBAA8F,MAAM,MAC/G,WAAW,UAAU,mBAAmB,kBAAkB,YAAY,MAAM,QAAQ,SAAS,SAAS,OAAO,CAAC,GAC9G,WAAW,UAAU,mBAAmB,eAAe,YAAY,MAAM,QAAQ,MAAM,SAAS,OAAO,CAAC,CAC1G"}
|