@dxos/shell 0.6.13 → 0.6.14-main.1366248
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/bundle/shell.mjs +15995 -15601
- package/dist/bundle/shell.mjs.map +1 -1
- package/dist/bundle/shell.umd.js +146 -108
- package/dist/bundle/shell.umd.js.map +1 -1
- package/dist/bundle/style.css +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react.mjs +432 -230
- package/dist/lib/browser/react.mjs.map +4 -4
- package/dist/lib/browser/testing/index.mjs +3 -46
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/chunk-Q7SFCCGT.cjs +33 -0
- package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -0
- package/dist/lib/node/react.cjs +4766 -0
- package/dist/lib/node/react.cjs.map +7 -0
- package/dist/lib/node/react.css +7 -0
- package/dist/lib/node/react.css.map +7 -0
- package/dist/lib/node/testing/index.cjs +181 -0
- package/dist/lib/node/testing/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/react.css +7 -0
- package/dist/lib/node-esm/react.css.map +7 -0
- package/dist/lib/node-esm/react.mjs +4812 -0
- package/dist/lib/node-esm/react.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +161 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/types/src/components/CompoundButton/CompoundButton.stories.js +1 -1
- package/dist/types/src/components/CompoundButton/CompoundButton.stories.js.map +1 -1
- package/dist/types/src/components/DeviceList/DeviceList.d.ts +1 -1
- package/dist/types/src/components/DeviceList/DeviceList.d.ts.map +1 -1
- package/dist/types/src/components/DeviceList/DeviceList.js +2 -2
- package/dist/types/src/components/DeviceList/DeviceList.js.map +1 -1
- package/dist/types/src/components/DeviceList/DeviceListItem.d.ts.map +1 -1
- package/dist/types/src/components/DeviceList/DeviceListItem.js +4 -1
- package/dist/types/src/components/DeviceList/DeviceListItem.js.map +1 -1
- package/dist/types/src/components/DeviceList/DeviceListProps.d.ts +2 -0
- package/dist/types/src/components/DeviceList/DeviceListProps.d.ts.map +1 -1
- package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts +0 -3
- package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts.map +1 -1
- package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js +3 -4
- package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js.map +1 -1
- package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts +0 -3
- package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts.map +1 -1
- package/dist/types/src/components/InvitationList/InvitationList.stories.js +11 -12
- package/dist/types/src/components/InvitationList/InvitationList.stories.js.map +1 -1
- package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts.map +1 -1
- package/dist/types/src/components/InvitationList/InvitationListContainer.js +2 -2
- package/dist/types/src/components/InvitationList/InvitationListContainer.js.map +1 -1
- package/dist/types/src/components/Panel/Panel.stories.d.ts +0 -3
- package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -1
- package/dist/types/src/components/Panel/Panel.stories.js +1 -2
- package/dist/types/src/components/Panel/Panel.stories.js.map +1 -1
- package/dist/types/src/components/Viewport/Viewport.stories.js +1 -1
- package/dist/types/src/components/Viewport/Viewport.stories.js.map +1 -1
- package/dist/types/src/composites/Shell/Shell.d.ts.map +1 -1
- package/dist/types/src/composites/Shell/Shell.js +14 -3
- package/dist/types/src/composites/Shell/Shell.js.map +1 -1
- package/dist/types/src/composites/Shell/run-shell.js +1 -1
- package/dist/types/src/composites/Shell/run-shell.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +51 -25
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +7 -2
- package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +7 -5
- package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts +1 -1
- package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/identityMachine.js +2 -0
- package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts +3 -5
- package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +5 -3
- package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts +1 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +10 -108
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.d.ts +8 -0
- package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.d.ts.map +1 -0
- package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js +89 -0
- package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js.map +1 -0
- package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.d.ts +8 -0
- package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.d.ts.map +1 -0
- package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.js +119 -0
- package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.js.map +1 -0
- package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/JoinPanel.js +24 -16
- package/dist/types/src/panels/JoinPanel/JoinPanel.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts +3 -0
- package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js +3 -2
- package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts +8 -4
- package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/joinMachine.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/joinMachine.js +8 -0
- package/dist/types/src/panels/JoinPanel/joinMachine.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js +1 -3
- package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js +17 -7
- package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts +3 -1
- package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js +9 -6
- package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts.map +1 -1
- package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js +8 -2
- package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js.map +1 -1
- package/dist/types/src/panels/Panels.stories.js +1 -1
- package/dist/types/src/panels/Panels.stories.js.map +1 -1
- package/dist/types/src/panels/SpacePanel/SpacePanel.js +1 -1
- package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -1
- package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js +16 -16
- package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js.map +1 -1
- package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts +4 -4
- package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts.map +1 -1
- package/dist/types/src/playwright/invitations-manager.d.ts +2 -3
- package/dist/types/src/playwright/invitations-manager.d.ts.map +1 -1
- package/dist/types/src/playwright/invitations-manager.js +8 -15
- package/dist/types/src/playwright/invitations-manager.js.map +1 -1
- package/dist/types/src/playwright/invitations.spec.js +40 -53
- package/dist/types/src/playwright/invitations.spec.js.map +1 -1
- package/dist/types/src/playwright/playwright.config.d.ts +2 -2
- package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
- package/dist/types/src/playwright/playwright.config.js +12 -2
- package/dist/types/src/playwright/playwright.config.js.map +1 -1
- package/dist/types/src/steps/ConfirmReset.d.ts +1 -1
- package/dist/types/src/steps/ConfirmReset.d.ts.map +1 -1
- package/dist/types/src/steps/ConfirmReset.js +6 -2
- package/dist/types/src/steps/ConfirmReset.js.map +1 -1
- package/dist/types/src/stories/Invitations.e2e-stories.d.ts +1 -3
- package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
- package/dist/types/src/stories/Invitations.e2e-stories.js +14 -6
- package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
- package/dist/types/src/testing/index.d.ts +0 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/index.js +1 -1
- package/dist/types/src/testing/index.js.map +1 -1
- package/dist/types/src/testing/shell-manager.d.ts +1 -0
- package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
- package/dist/types/src/testing/shell-manager.js +2 -7
- package/dist/types/src/testing/shell-manager.js.map +1 -1
- package/dist/types/src/translations/locales/en-US.d.ts +3 -0
- package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
- package/dist/types/src/translations/locales/en-US.js +6 -3
- package/dist/types/src/translations/locales/en-US.js.map +1 -1
- package/package.json +42 -29
- package/src/components/CompoundButton/CompoundButton.stories.tsx +1 -1
- package/src/components/DeviceList/DeviceList.tsx +2 -1
- package/src/components/DeviceList/DeviceListItem.tsx +8 -0
- package/src/components/DeviceList/DeviceListProps.ts +2 -0
- package/src/components/IdentityList/SpaceMemberList.stories.tsx +2 -3
- package/src/components/InvitationList/InvitationList.stories.tsx +2 -3
- package/src/components/InvitationList/InvitationListContainer.tsx +6 -3
- package/src/components/Panel/Panel.stories.tsx +1 -2
- package/src/components/Viewport/Viewport.stories.tsx +1 -1
- package/src/composites/Shell/Shell.tsx +16 -4
- package/src/composites/Shell/run-shell.tsx +1 -1
- package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +7 -2
- package/src/panels/IdentityPanel/IdentityPanel.tsx +92 -48
- package/src/panels/IdentityPanel/IdentityPanelProps.ts +7 -4
- package/src/panels/IdentityPanel/identityMachine.ts +3 -1
- package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +21 -10
- package/src/panels/IdentityPanel/useAgentHandlers.ts +9 -114
- package/src/panels/IdentityPanel/useEdgeAgentsHandlers.ts +103 -0
- package/src/panels/IdentityPanel/useKubeAgentHandlers.ts +128 -0
- package/src/panels/JoinPanel/JoinPanel.stories.tsx +3 -2
- package/src/panels/JoinPanel/JoinPanel.tsx +31 -9
- package/src/panels/JoinPanel/JoinPanelProps.ts +8 -4
- package/src/panels/JoinPanel/joinMachine.ts +9 -0
- package/src/panels/JoinPanel/steps/AdditionMethodChooser.tsx +0 -2
- package/src/panels/JoinPanel/steps/IdentityInput.tsx +22 -10
- package/src/panels/JoinPanel/steps/InvitationAuthenticator.tsx +29 -16
- package/src/panels/JoinPanel/steps/InvitationInput.tsx +9 -17
- package/src/panels/Panels.stories.tsx +1 -1
- package/src/panels/SpacePanel/SpacePanel.stories.tsx +2 -2
- package/src/panels/SpacePanel/SpacePanel.tsx +3 -3
- package/src/panels/SpacePanel/SpacePanelProps.ts +4 -4
- package/src/playwright/invitations-manager.ts +9 -13
- package/src/playwright/invitations.spec.ts +42 -54
- package/src/playwright/playwright.config.ts +13 -2
- package/src/steps/ConfirmReset.tsx +13 -5
- package/src/stories/Invitations.e2e-stories.tsx +17 -10
- package/src/testing/index.ts +2 -1
- package/src/testing/shell-manager.ts +4 -9
- package/src/translations/locales/en-US.ts +6 -3
|
@@ -2,15 +2,19 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { test } from '@playwright/test';
|
|
6
|
-
import { expect } from 'chai';
|
|
5
|
+
import { expect, test } from '@playwright/test';
|
|
7
6
|
|
|
8
7
|
import { sleep } from '@dxos/async';
|
|
9
|
-
import { Invitation } from '@dxos/react-client/invitations';
|
|
10
|
-
import { ConnectionState } from '@dxos/react-client/mesh';
|
|
11
8
|
|
|
12
9
|
import { InvitationsManager } from './invitations-manager';
|
|
13
10
|
|
|
11
|
+
// TODO(wittjosiah): Can't import these because of ESM/CJS issues.
|
|
12
|
+
// import { Invitation } from '@dxos/react-client/invitations';
|
|
13
|
+
// import { ConnectionState } from '@dxos/react-client/mesh';
|
|
14
|
+
const InvitationAuthMethodNone = 0;
|
|
15
|
+
const ConnectionStateOffline = 0;
|
|
16
|
+
const ConnectionStateOnline = 1;
|
|
17
|
+
|
|
14
18
|
test.describe('Invitations', () => {
|
|
15
19
|
let manager: InvitationsManager;
|
|
16
20
|
|
|
@@ -45,21 +49,19 @@ test.describe('Invitations', () => {
|
|
|
45
49
|
await manager.acceptInvitation(1, 'device', invitation);
|
|
46
50
|
await manager.readyToAuthenticate('device', manager.peer(1));
|
|
47
51
|
await manager.authenticateInvitation('device', authCode, manager.peer(1));
|
|
48
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
49
52
|
|
|
50
|
-
expect(await manager.getDisplayName(0)).
|
|
53
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
51
54
|
});
|
|
52
55
|
|
|
53
56
|
test('no auth method', async () => {
|
|
54
57
|
await manager.createIdentity(0);
|
|
55
58
|
await manager.openPanel(0, 'devices');
|
|
56
|
-
const invitation = await manager.createInvitation(0, 'device', { authMethod:
|
|
59
|
+
const invitation = await manager.createInvitation(0, 'device', { authMethod: InvitationAuthMethodNone });
|
|
57
60
|
|
|
58
61
|
await manager.openPanel(1, 'identity');
|
|
59
62
|
await manager.acceptInvitation(1, 'device', invitation);
|
|
60
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
61
63
|
|
|
62
|
-
expect(await manager.getDisplayName(0)).
|
|
64
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
63
65
|
});
|
|
64
66
|
|
|
65
67
|
test('invalid & retry auth code', async () => {
|
|
@@ -73,9 +75,8 @@ test.describe('Invitations', () => {
|
|
|
73
75
|
await manager.authenticateInvitation('device', '000000', manager.peer(1));
|
|
74
76
|
await manager.clearAuthCode('device', manager.peer(1));
|
|
75
77
|
await manager.authenticateInvitation('device', authCode, manager.peer(1));
|
|
76
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
77
78
|
|
|
78
|
-
expect(await manager.getDisplayName(0)).
|
|
79
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
79
80
|
});
|
|
80
81
|
|
|
81
82
|
// TODO(wittjosiah): Remove? This seems to invalidate the invitation now.
|
|
@@ -94,15 +95,14 @@ test.describe('Invitations', () => {
|
|
|
94
95
|
await manager.clearAuthCode('device', manager.peer(1));
|
|
95
96
|
await manager.authenticateInvitation('device', '000003', manager.peer(1));
|
|
96
97
|
|
|
97
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
98
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
98
99
|
|
|
99
100
|
await manager.resetInvitation(manager.peer(1));
|
|
100
101
|
await manager.invitationInputContinue('device', manager.peer(1));
|
|
101
102
|
await manager.clearAuthCode('device', manager.peer(1));
|
|
102
103
|
await manager.authenticateInvitation('device', authCode, manager.peer(1));
|
|
103
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
104
104
|
|
|
105
|
-
expect(await manager.getDisplayName(0)).
|
|
105
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
test('invitation timeout', async () => {
|
|
@@ -113,7 +113,7 @@ test.describe('Invitations', () => {
|
|
|
113
113
|
await manager.openPanel(1, 'identity');
|
|
114
114
|
await manager.acceptInvitation(1, 'device', invitation);
|
|
115
115
|
|
|
116
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
116
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
117
117
|
});
|
|
118
118
|
|
|
119
119
|
// TODO(thure): This is skipped because the UI no longer affords cancelling device invitations, consider removing.
|
|
@@ -125,10 +125,10 @@ test.describe('Invitations', () => {
|
|
|
125
125
|
|
|
126
126
|
await manager.openPanel(1, 'identity');
|
|
127
127
|
await manager.acceptInvitation(1, 'device', invitation);
|
|
128
|
-
expect(await manager.readyToAuthenticate('device', manager.peer(1))).
|
|
128
|
+
expect(await manager.readyToAuthenticate('device', manager.peer(1))).toBe(true);
|
|
129
129
|
await manager.cancelInvitation('device', 'host', manager.peer(0));
|
|
130
130
|
|
|
131
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
131
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
132
132
|
});
|
|
133
133
|
|
|
134
134
|
// TODO(wittjosiah): Remove? This seems to invalidate the invitation now.
|
|
@@ -145,9 +145,8 @@ test.describe('Invitations', () => {
|
|
|
145
145
|
await manager.invitationInputContinue('device', manager.peer(1));
|
|
146
146
|
await manager.clearAuthCode('device', manager.peer(1));
|
|
147
147
|
await manager.authenticateInvitation('device', authCode, manager.peer(1));
|
|
148
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
149
148
|
|
|
150
|
-
expect(await manager.getDisplayName(0)).
|
|
149
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
151
150
|
});
|
|
152
151
|
|
|
153
152
|
// TODO(thure): The design no longer affords signalling an identity’s network status. Remove or adjust test, or adjust design.
|
|
@@ -159,18 +158,17 @@ test.describe('Invitations', () => {
|
|
|
159
158
|
|
|
160
159
|
await manager.openPanel(1, 'identity');
|
|
161
160
|
await manager.acceptInvitation(1, 'device', invitation);
|
|
162
|
-
expect(await manager.readyToAuthenticate('device', manager.peer(1))).
|
|
161
|
+
expect(await manager.readyToAuthenticate('device', manager.peer(1))).toBe(true);
|
|
163
162
|
await manager.toggleNetworkStatus(0);
|
|
164
|
-
expect(await manager.getNetworkStatus(0)).
|
|
163
|
+
expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOffline);
|
|
165
164
|
await manager.toggleNetworkStatus(0);
|
|
166
|
-
expect(await manager.getNetworkStatus(0)).
|
|
165
|
+
expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOnline);
|
|
167
166
|
await manager.resetInvitation(manager.peer(1));
|
|
168
167
|
await manager.invitationInputContinue('device', manager.peer(1));
|
|
169
168
|
await manager.clearAuthCode('device', manager.peer(1));
|
|
170
169
|
await manager.authenticateInvitation('device', authCode, manager.peer(1));
|
|
171
|
-
await manager.doneInvitation('device', manager.peer(1));
|
|
172
170
|
|
|
173
|
-
expect(await manager.getDisplayName(0)).
|
|
171
|
+
expect(await manager.getDisplayName(0)).toEqual(await manager.getDisplayName(1));
|
|
174
172
|
});
|
|
175
173
|
});
|
|
176
174
|
|
|
@@ -187,44 +185,40 @@ test.describe('Invitations', () => {
|
|
|
187
185
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
188
186
|
await manager.readyToAuthenticate('space', manager.peer(1));
|
|
189
187
|
await manager.authenticateInvitation('space', authCode, manager.peer(1));
|
|
190
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
191
188
|
|
|
192
189
|
await manager.openPanel(0, 'spaces');
|
|
193
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
190
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
194
191
|
});
|
|
195
192
|
|
|
196
193
|
test('already joined', async () => {
|
|
197
194
|
await manager.createIdentity(0);
|
|
198
195
|
await manager.createSpace(0);
|
|
199
196
|
await manager.openPanel(0, 1);
|
|
200
|
-
const invitation1 = await manager.createInvitation(0, 'space', { authMethod:
|
|
197
|
+
const invitation1 = await manager.createInvitation(0, 'space', { authMethod: InvitationAuthMethodNone });
|
|
201
198
|
const invitation2 = await manager.createInvitation(0, 'space');
|
|
202
199
|
|
|
203
200
|
await manager.createIdentity(1);
|
|
204
201
|
await manager.openPanel(1, 'join');
|
|
205
202
|
await manager.acceptInvitation(1, 'space', invitation1);
|
|
206
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
207
203
|
|
|
208
204
|
await manager.openPanel(1, 'join');
|
|
209
205
|
await manager.acceptInvitation(1, 'space', invitation2);
|
|
210
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
211
206
|
|
|
212
|
-
expect(await manager.getSpaceMembersCount(0)).
|
|
207
|
+
expect(await manager.getSpaceMembersCount(0)).toEqual(2);
|
|
213
208
|
});
|
|
214
209
|
|
|
215
210
|
test('no auth method', async () => {
|
|
216
211
|
await manager.createIdentity(0);
|
|
217
212
|
await manager.createSpace(0);
|
|
218
213
|
await manager.openPanel(0, 1);
|
|
219
|
-
const invitation = await manager.createInvitation(0, 'space', { authMethod:
|
|
214
|
+
const invitation = await manager.createInvitation(0, 'space', { authMethod: InvitationAuthMethodNone });
|
|
220
215
|
|
|
221
216
|
await manager.createIdentity(1);
|
|
222
217
|
await manager.openPanel(1, 'join');
|
|
223
218
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
224
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
225
219
|
|
|
226
220
|
await manager.openPanel(0, 'spaces');
|
|
227
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
221
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
228
222
|
});
|
|
229
223
|
|
|
230
224
|
test('invalid & retry auth code', async () => {
|
|
@@ -239,14 +233,13 @@ test.describe('Invitations', () => {
|
|
|
239
233
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
240
234
|
await manager.authenticateInvitation('space', '000000', manager.peer(1));
|
|
241
235
|
|
|
242
|
-
expect(await manager.authenticatorIsVisible('space', manager.peer(1))).
|
|
236
|
+
expect(await manager.authenticatorIsVisible('space', manager.peer(1))).toBe(true);
|
|
243
237
|
|
|
244
238
|
await manager.clearAuthCode('space', manager.peer(1));
|
|
245
239
|
await manager.authenticateInvitation('space', authCode, manager.peer(1));
|
|
246
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
247
240
|
|
|
248
241
|
await manager.openPanel(0, 'spaces');
|
|
249
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
242
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
250
243
|
});
|
|
251
244
|
|
|
252
245
|
// TODO(wittjosiah): Remove? This seems to invalidate the invitation now.
|
|
@@ -267,16 +260,15 @@ test.describe('Invitations', () => {
|
|
|
267
260
|
await manager.clearAuthCode('space', manager.peer(1));
|
|
268
261
|
await manager.authenticateInvitation('space', '000003', manager.peer(1));
|
|
269
262
|
|
|
270
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
263
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
271
264
|
|
|
272
265
|
await manager.resetInvitation(manager.peer(1));
|
|
273
266
|
await manager.invitationInputContinue('space', manager.peer(1));
|
|
274
267
|
await manager.clearAuthCode('space', manager.peer(1));
|
|
275
268
|
await manager.authenticateInvitation('space', authCode, manager.peer(1));
|
|
276
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
277
269
|
|
|
278
270
|
await manager.openPanel(0, 'spaces');
|
|
279
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
271
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
280
272
|
});
|
|
281
273
|
|
|
282
274
|
test('invitation timeout', async () => {
|
|
@@ -289,7 +281,7 @@ test.describe('Invitations', () => {
|
|
|
289
281
|
await manager.openPanel(1, 'join');
|
|
290
282
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
291
283
|
|
|
292
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
284
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
293
285
|
});
|
|
294
286
|
|
|
295
287
|
// TODO(wittjosiah): Cancel not propagating.
|
|
@@ -302,10 +294,10 @@ test.describe('Invitations', () => {
|
|
|
302
294
|
await manager.createIdentity(1);
|
|
303
295
|
await manager.openPanel(1, 'join');
|
|
304
296
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
305
|
-
expect(await manager.readyToAuthenticate('space', manager.peer(1))).
|
|
297
|
+
expect(await manager.readyToAuthenticate('space', manager.peer(1))).toBe(true);
|
|
306
298
|
await manager.cancelInvitation('space', 'host', manager.peer(0));
|
|
307
299
|
|
|
308
|
-
expect(await manager.invitationFailed(manager.peer(1))).
|
|
300
|
+
expect(await manager.invitationFailed(manager.peer(1))).toBe(true);
|
|
309
301
|
});
|
|
310
302
|
|
|
311
303
|
// TODO(wittjosiah): Remove? This seems to invalidate the invitation now.
|
|
@@ -324,10 +316,9 @@ test.describe('Invitations', () => {
|
|
|
324
316
|
await manager.invitationInputContinue('space', manager.peer(1));
|
|
325
317
|
await manager.clearAuthCode('space', manager.peer(1));
|
|
326
318
|
await manager.authenticateInvitation('space', authCode, manager.peer(1));
|
|
327
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
328
319
|
|
|
329
320
|
await manager.openPanel(0, 'spaces');
|
|
330
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
321
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
331
322
|
});
|
|
332
323
|
|
|
333
324
|
// TODO(thure): The design no longer affords signalling an identity’s network status. Remove or adjust test, or adjust design.
|
|
@@ -341,19 +332,18 @@ test.describe('Invitations', () => {
|
|
|
341
332
|
await manager.createIdentity(1);
|
|
342
333
|
await manager.openPanel(1, 'join');
|
|
343
334
|
await manager.acceptInvitation(1, 'space', invitation);
|
|
344
|
-
expect(await manager.readyToAuthenticate('space', manager.peer(1))).
|
|
335
|
+
expect(await manager.readyToAuthenticate('space', manager.peer(1))).toBe(true);
|
|
345
336
|
await manager.toggleNetworkStatus(0);
|
|
346
|
-
expect(await manager.getNetworkStatus(0)).
|
|
337
|
+
expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOffline);
|
|
347
338
|
await manager.toggleNetworkStatus(0);
|
|
348
|
-
expect(await manager.getNetworkStatus(0)).
|
|
339
|
+
expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOnline);
|
|
349
340
|
await manager.resetInvitation(manager.peer(1));
|
|
350
341
|
await manager.invitationInputContinue('space', manager.peer(1));
|
|
351
342
|
await manager.clearAuthCode('space', manager.peer(1));
|
|
352
343
|
await manager.authenticateInvitation('space', authCode, manager.peer(1));
|
|
353
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
354
344
|
|
|
355
345
|
await manager.openPanel(0, 'spaces');
|
|
356
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
346
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
357
347
|
});
|
|
358
348
|
|
|
359
349
|
test('multiple concurrent invitations', async () => {
|
|
@@ -381,13 +371,11 @@ test.describe('Invitations', () => {
|
|
|
381
371
|
// Helps to ensure both auth codes are fully input (especially in webkit).
|
|
382
372
|
await sleep(100);
|
|
383
373
|
await manager.authenticateInvitation('space', authCode2, manager.peer(2));
|
|
384
|
-
await manager.doneInvitation('space', manager.peer(1));
|
|
385
|
-
await manager.doneInvitation('space', manager.peer(2));
|
|
386
374
|
|
|
387
375
|
await manager.openPanel(0, 'spaces');
|
|
388
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
389
|
-
expect(await manager.getSpaceName(0, 1)).
|
|
390
|
-
expect(await manager.getSpaceName(1, 1)).
|
|
376
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(1, 1));
|
|
377
|
+
expect(await manager.getSpaceName(0, 1)).toEqual(await manager.getSpaceName(2, 1));
|
|
378
|
+
expect(await manager.getSpaceName(1, 1)).toEqual(await manager.getSpaceName(2, 1));
|
|
391
379
|
});
|
|
392
380
|
});
|
|
393
381
|
});
|
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { nxE2EPreset } from '@nx/playwright/preset';
|
|
6
|
+
import { defineConfig } from '@playwright/test';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
import { e2ePreset } from '@dxos/test-utils/playwright';
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
...nxE2EPreset(__filename, { testDir: __dirname }),
|
|
12
|
+
...e2ePreset(__dirname),
|
|
13
|
+
webServer: {
|
|
14
|
+
command: 'pnpm -w nx storybook-e2e stories',
|
|
15
|
+
port: 9009,
|
|
16
|
+
reuseExistingServer: !process.env.CI,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
@@ -15,7 +15,7 @@ import { Action, Actions, StepHeading, Input } from '../components';
|
|
|
15
15
|
type ConfirmResetOptions = Partial<{
|
|
16
16
|
onCancel: () => void;
|
|
17
17
|
onConfirm: () => Promise<void>;
|
|
18
|
-
mode: 'join new identity' | 'reset storage';
|
|
18
|
+
mode: 'join new identity' | 'recover' | 'reset storage';
|
|
19
19
|
}>;
|
|
20
20
|
|
|
21
21
|
export type ConfirmResetProps = StepProps & ConfirmResetOptions;
|
|
@@ -64,7 +64,8 @@ export const ConfirmResetImpl = ({
|
|
|
64
64
|
const { t } = useTranslation('os');
|
|
65
65
|
const confirmationValue = t('confirmation value');
|
|
66
66
|
const [inputValue, setInputValue] = useState('');
|
|
67
|
-
const testIdAffix =
|
|
67
|
+
const testIdAffix =
|
|
68
|
+
mode === 'join new identity' ? 'join-new-identity' : mode === 'recover' ? 'recover' : 'reset-storage';
|
|
68
69
|
return (
|
|
69
70
|
<>
|
|
70
71
|
<div role='none' className='grow flex flex-col gap-2 justify-center'>
|
|
@@ -79,9 +80,16 @@ export const ConfirmResetImpl = ({
|
|
|
79
80
|
{...{ validationMessage }}
|
|
80
81
|
label={
|
|
81
82
|
<StepHeading className='text-start mlb-2'>
|
|
82
|
-
{t(
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
{t(
|
|
84
|
+
mode === 'join new identity'
|
|
85
|
+
? 'join new identity input label'
|
|
86
|
+
: mode === 'recover'
|
|
87
|
+
? 'recover reset input label'
|
|
88
|
+
: 'reset storage input label',
|
|
89
|
+
{
|
|
90
|
+
confirmationValue,
|
|
91
|
+
},
|
|
92
|
+
)}
|
|
85
93
|
</StepHeading>
|
|
86
94
|
}
|
|
87
95
|
disabled={disabled}
|
|
@@ -14,7 +14,7 @@ import { type Space, type SpaceMember, useSpaces } from '@dxos/react-client/echo
|
|
|
14
14
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
15
15
|
import { Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
|
|
16
16
|
import { ConnectionState, useNetworkStatus } from '@dxos/react-client/mesh';
|
|
17
|
-
import {
|
|
17
|
+
import { useMultiClient, withMultiClientProvider } from '@dxos/react-client/testing';
|
|
18
18
|
import { Button, ButtonGroup, List } from '@dxos/react-ui';
|
|
19
19
|
import { getSize, groupSurface } from '@dxos/react-ui-theme';
|
|
20
20
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
@@ -24,7 +24,7 @@ import { IdentityPanel, JoinPanel, SpacePanel } from '../panels';
|
|
|
24
24
|
import { osTranslations } from '../translations';
|
|
25
25
|
|
|
26
26
|
export default {
|
|
27
|
-
title: 'Invitations',
|
|
27
|
+
title: 'sdk/shell/Invitations',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export type PanelType = Space | 'identity' | 'devices' | 'join';
|
|
@@ -113,8 +113,8 @@ const Panel = ({ id, panel, setPanel }: { id: number; panel?: PanelType; setPane
|
|
|
113
113
|
}
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
-
const Invitations = (
|
|
117
|
-
const { id }
|
|
116
|
+
const Invitations = () => {
|
|
117
|
+
const { id } = useMultiClient();
|
|
118
118
|
const client = useClient();
|
|
119
119
|
const networkStatus = useNetworkStatus().swarm;
|
|
120
120
|
const identity = useIdentity();
|
|
@@ -220,12 +220,19 @@ const Invitations = (args: { id: number; count: number }) => {
|
|
|
220
220
|
// The issue appears to be related to dynamic imports during client initialization.
|
|
221
221
|
// This does not seem to be a problem in other browsers nor in Safari in the app.
|
|
222
222
|
export const Default = {
|
|
223
|
-
render: (
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
render: () => {
|
|
224
|
+
return (
|
|
225
|
+
// TODO(wittjosiah): Factor out ClipboardProvider to react-ui and include in layout decorator.
|
|
226
|
+
<ClipboardProvider>
|
|
227
|
+
<Invitations />
|
|
228
|
+
</ClipboardProvider>
|
|
229
|
+
);
|
|
230
|
+
},
|
|
231
|
+
decorators: [
|
|
232
|
+
withMultiClientProvider({ numClients: 3 }),
|
|
233
|
+
withLayout({ tooltips: true, classNames: 'grid grid-cols-3' }),
|
|
234
|
+
withTheme,
|
|
235
|
+
],
|
|
229
236
|
parameters: {
|
|
230
237
|
chromatic: { disableSnapshot: true },
|
|
231
238
|
translations: [osTranslations],
|
package/src/testing/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import type { ConsoleMessage,
|
|
5
|
+
import type { ConsoleMessage, Page } from '@playwright/test';
|
|
6
6
|
|
|
7
7
|
import { sleep, Trigger } from '@dxos/async';
|
|
8
8
|
|
|
@@ -60,13 +60,6 @@ export class ShellManager extends ScopedShellManager {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
async resetDevice() {
|
|
63
|
-
const handleDialog = async (dialog: Dialog) => {
|
|
64
|
-
if (dialog.type() === 'confirm') {
|
|
65
|
-
await dialog.accept();
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
this.page.on('dialog', handleDialog);
|
|
69
|
-
|
|
70
63
|
await this.shell.getByTestId('device-list-item-current.options').click();
|
|
71
64
|
await this.shell.getByTestId('device-list-item-current.reset').click();
|
|
72
65
|
await this.shell.getByTestId('reset-storage.reset-identity-input').fill(CONFIRM_INPUT);
|
|
@@ -78,6 +71,9 @@ export class ShellManager extends ScopedShellManager {
|
|
|
78
71
|
await this.shell.getByTestId('device-list-item-current.join-existing').click();
|
|
79
72
|
await this.shell.getByTestId('join-new-identity.reset-identity-input').fill(CONFIRM_INPUT);
|
|
80
73
|
await this.shell.getByTestId('join-new-identity.reset-identity-confirm').click();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async acceptDeviceInvitation(invitationCode: string) {
|
|
81
77
|
await this.inputInvitation('device', invitationCode, this.shell);
|
|
82
78
|
}
|
|
83
79
|
|
|
@@ -114,7 +110,6 @@ export class ShellManager extends ScopedShellManager {
|
|
|
114
110
|
// Wait for focus to shift before typing.
|
|
115
111
|
await sleep(1500);
|
|
116
112
|
await this.authenticateInvitation('space', authCode, this.shell);
|
|
117
|
-
await this.doneInvitation('space', this.shell);
|
|
118
113
|
}
|
|
119
114
|
|
|
120
115
|
private async _onConsoleMessage(message: ConsoleMessage) {
|
|
@@ -34,7 +34,7 @@ export const os = {
|
|
|
34
34
|
'recover identity input label': 'Type or paste your seed phrase',
|
|
35
35
|
'failed to create identity message': 'Failed to create an identity.',
|
|
36
36
|
'failed to recover identity message': 'Failed to recover an identity from the provided seed phrase.',
|
|
37
|
-
'failed to authenticate message': 'Incorrect
|
|
37
|
+
'failed to authenticate message': 'Incorrect code.',
|
|
38
38
|
'identity added label': 'Created identity & added to this device:',
|
|
39
39
|
'join space as identity heading': '<part>as </part><part><icon/><label>{{labelValue}}</label></part>',
|
|
40
40
|
'error status label': 'Failed',
|
|
@@ -42,8 +42,8 @@ export const os = {
|
|
|
42
42
|
'cancelled status label': 'Cancelled',
|
|
43
43
|
'init status label': 'Ready to connect',
|
|
44
44
|
'connecting status label': 'Connecting…',
|
|
45
|
-
'connected status label': 'Enter
|
|
46
|
-
'authenticating status label': 'Enter
|
|
45
|
+
'connected status label': 'Enter authentication code',
|
|
46
|
+
'authenticating status label': 'Enter authentication code',
|
|
47
47
|
'success status label': 'Success',
|
|
48
48
|
'cancel label': 'Cancel',
|
|
49
49
|
'done label': 'Done',
|
|
@@ -152,4 +152,7 @@ export const os = {
|
|
|
152
152
|
'agent requested label': 'Agent requested',
|
|
153
153
|
'agent requested description':
|
|
154
154
|
'The agent service is creating an agent for you. Once the agent connects, it will display in the devices list.',
|
|
155
|
+
'authenticating label': 'Authenticating…',
|
|
156
|
+
'create recovery code label': 'Create recovery code',
|
|
157
|
+
'choose recover identity label': 'Recover identity',
|
|
155
158
|
};
|