@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.
Files changed (192) hide show
  1. package/dist/bundle/shell.mjs +15995 -15601
  2. package/dist/bundle/shell.mjs.map +1 -1
  3. package/dist/bundle/shell.umd.js +146 -108
  4. package/dist/bundle/shell.umd.js.map +1 -1
  5. package/dist/bundle/style.css +1 -1
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/react.mjs +432 -230
  8. package/dist/lib/browser/react.mjs.map +4 -4
  9. package/dist/lib/browser/testing/index.mjs +3 -46
  10. package/dist/lib/browser/testing/index.mjs.map +4 -4
  11. package/dist/lib/node/chunk-Q7SFCCGT.cjs +33 -0
  12. package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +7 -0
  13. package/dist/lib/node/meta.json +1 -0
  14. package/dist/lib/node/react.cjs +4766 -0
  15. package/dist/lib/node/react.cjs.map +7 -0
  16. package/dist/lib/node/react.css +7 -0
  17. package/dist/lib/node/react.css.map +7 -0
  18. package/dist/lib/node/testing/index.cjs +181 -0
  19. package/dist/lib/node/testing/index.cjs.map +7 -0
  20. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  21. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  22. package/dist/lib/node-esm/meta.json +1 -0
  23. package/dist/lib/node-esm/react.css +7 -0
  24. package/dist/lib/node-esm/react.css.map +7 -0
  25. package/dist/lib/node-esm/react.mjs +4812 -0
  26. package/dist/lib/node-esm/react.mjs.map +7 -0
  27. package/dist/lib/node-esm/testing/index.mjs +161 -0
  28. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  29. package/dist/types/src/components/CompoundButton/CompoundButton.stories.js +1 -1
  30. package/dist/types/src/components/CompoundButton/CompoundButton.stories.js.map +1 -1
  31. package/dist/types/src/components/DeviceList/DeviceList.d.ts +1 -1
  32. package/dist/types/src/components/DeviceList/DeviceList.d.ts.map +1 -1
  33. package/dist/types/src/components/DeviceList/DeviceList.js +2 -2
  34. package/dist/types/src/components/DeviceList/DeviceList.js.map +1 -1
  35. package/dist/types/src/components/DeviceList/DeviceListItem.d.ts.map +1 -1
  36. package/dist/types/src/components/DeviceList/DeviceListItem.js +4 -1
  37. package/dist/types/src/components/DeviceList/DeviceListItem.js.map +1 -1
  38. package/dist/types/src/components/DeviceList/DeviceListProps.d.ts +2 -0
  39. package/dist/types/src/components/DeviceList/DeviceListProps.d.ts.map +1 -1
  40. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts +0 -3
  41. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js +3 -4
  43. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js.map +1 -1
  44. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts +0 -3
  45. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/InvitationList/InvitationList.stories.js +11 -12
  47. package/dist/types/src/components/InvitationList/InvitationList.stories.js.map +1 -1
  48. package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts.map +1 -1
  49. package/dist/types/src/components/InvitationList/InvitationListContainer.js +2 -2
  50. package/dist/types/src/components/InvitationList/InvitationListContainer.js.map +1 -1
  51. package/dist/types/src/components/Panel/Panel.stories.d.ts +0 -3
  52. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/Panel/Panel.stories.js +1 -2
  54. package/dist/types/src/components/Panel/Panel.stories.js.map +1 -1
  55. package/dist/types/src/components/Viewport/Viewport.stories.js +1 -1
  56. package/dist/types/src/components/Viewport/Viewport.stories.js.map +1 -1
  57. package/dist/types/src/composites/Shell/Shell.d.ts.map +1 -1
  58. package/dist/types/src/composites/Shell/Shell.js +14 -3
  59. package/dist/types/src/composites/Shell/Shell.js.map +1 -1
  60. package/dist/types/src/composites/Shell/run-shell.js +1 -1
  61. package/dist/types/src/composites/Shell/run-shell.js.map +1 -1
  62. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  63. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +51 -25
  64. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  65. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  66. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +7 -2
  67. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
  68. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +7 -5
  69. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  70. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts +1 -1
  71. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -1
  72. package/dist/types/src/panels/IdentityPanel/identityMachine.js +2 -0
  73. package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -1
  74. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts +3 -5
  75. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  76. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +5 -3
  77. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  78. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts +1 -1
  79. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
  80. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +10 -108
  81. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
  82. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.d.ts +8 -0
  83. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.d.ts.map +1 -0
  84. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js +89 -0
  85. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js.map +1 -0
  86. package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.d.ts +8 -0
  87. package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.d.ts.map +1 -0
  88. package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.js +119 -0
  89. package/dist/types/src/panels/IdentityPanel/useKubeAgentHandlers.js.map +1 -0
  90. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts.map +1 -1
  91. package/dist/types/src/panels/JoinPanel/JoinPanel.js +24 -16
  92. package/dist/types/src/panels/JoinPanel/JoinPanel.js.map +1 -1
  93. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts +3 -0
  94. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts.map +1 -1
  95. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js +3 -2
  96. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js.map +1 -1
  97. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts +8 -4
  98. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts.map +1 -1
  99. package/dist/types/src/panels/JoinPanel/joinMachine.d.ts.map +1 -1
  100. package/dist/types/src/panels/JoinPanel/joinMachine.js +8 -0
  101. package/dist/types/src/panels/JoinPanel/joinMachine.js.map +1 -1
  102. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts.map +1 -1
  103. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js +1 -3
  104. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js.map +1 -1
  105. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts.map +1 -1
  106. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js +17 -7
  107. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js.map +1 -1
  108. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts +3 -1
  109. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts.map +1 -1
  110. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js +9 -6
  111. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js.map +1 -1
  112. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts.map +1 -1
  113. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js +8 -2
  114. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js.map +1 -1
  115. package/dist/types/src/panels/Panels.stories.js +1 -1
  116. package/dist/types/src/panels/Panels.stories.js.map +1 -1
  117. package/dist/types/src/panels/SpacePanel/SpacePanel.js +1 -1
  118. package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -1
  119. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js +16 -16
  120. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js.map +1 -1
  121. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts +4 -4
  122. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts.map +1 -1
  123. package/dist/types/src/playwright/invitations-manager.d.ts +2 -3
  124. package/dist/types/src/playwright/invitations-manager.d.ts.map +1 -1
  125. package/dist/types/src/playwright/invitations-manager.js +8 -15
  126. package/dist/types/src/playwright/invitations-manager.js.map +1 -1
  127. package/dist/types/src/playwright/invitations.spec.js +40 -53
  128. package/dist/types/src/playwright/invitations.spec.js.map +1 -1
  129. package/dist/types/src/playwright/playwright.config.d.ts +2 -2
  130. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
  131. package/dist/types/src/playwright/playwright.config.js +12 -2
  132. package/dist/types/src/playwright/playwright.config.js.map +1 -1
  133. package/dist/types/src/steps/ConfirmReset.d.ts +1 -1
  134. package/dist/types/src/steps/ConfirmReset.d.ts.map +1 -1
  135. package/dist/types/src/steps/ConfirmReset.js +6 -2
  136. package/dist/types/src/steps/ConfirmReset.js.map +1 -1
  137. package/dist/types/src/stories/Invitations.e2e-stories.d.ts +1 -3
  138. package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
  139. package/dist/types/src/stories/Invitations.e2e-stories.js +14 -6
  140. package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
  141. package/dist/types/src/testing/index.d.ts +0 -1
  142. package/dist/types/src/testing/index.d.ts.map +1 -1
  143. package/dist/types/src/testing/index.js +1 -1
  144. package/dist/types/src/testing/index.js.map +1 -1
  145. package/dist/types/src/testing/shell-manager.d.ts +1 -0
  146. package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
  147. package/dist/types/src/testing/shell-manager.js +2 -7
  148. package/dist/types/src/testing/shell-manager.js.map +1 -1
  149. package/dist/types/src/translations/locales/en-US.d.ts +3 -0
  150. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  151. package/dist/types/src/translations/locales/en-US.js +6 -3
  152. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  153. package/package.json +42 -29
  154. package/src/components/CompoundButton/CompoundButton.stories.tsx +1 -1
  155. package/src/components/DeviceList/DeviceList.tsx +2 -1
  156. package/src/components/DeviceList/DeviceListItem.tsx +8 -0
  157. package/src/components/DeviceList/DeviceListProps.ts +2 -0
  158. package/src/components/IdentityList/SpaceMemberList.stories.tsx +2 -3
  159. package/src/components/InvitationList/InvitationList.stories.tsx +2 -3
  160. package/src/components/InvitationList/InvitationListContainer.tsx +6 -3
  161. package/src/components/Panel/Panel.stories.tsx +1 -2
  162. package/src/components/Viewport/Viewport.stories.tsx +1 -1
  163. package/src/composites/Shell/Shell.tsx +16 -4
  164. package/src/composites/Shell/run-shell.tsx +1 -1
  165. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +7 -2
  166. package/src/panels/IdentityPanel/IdentityPanel.tsx +92 -48
  167. package/src/panels/IdentityPanel/IdentityPanelProps.ts +7 -4
  168. package/src/panels/IdentityPanel/identityMachine.ts +3 -1
  169. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +21 -10
  170. package/src/panels/IdentityPanel/useAgentHandlers.ts +9 -114
  171. package/src/panels/IdentityPanel/useEdgeAgentsHandlers.ts +103 -0
  172. package/src/panels/IdentityPanel/useKubeAgentHandlers.ts +128 -0
  173. package/src/panels/JoinPanel/JoinPanel.stories.tsx +3 -2
  174. package/src/panels/JoinPanel/JoinPanel.tsx +31 -9
  175. package/src/panels/JoinPanel/JoinPanelProps.ts +8 -4
  176. package/src/panels/JoinPanel/joinMachine.ts +9 -0
  177. package/src/panels/JoinPanel/steps/AdditionMethodChooser.tsx +0 -2
  178. package/src/panels/JoinPanel/steps/IdentityInput.tsx +22 -10
  179. package/src/panels/JoinPanel/steps/InvitationAuthenticator.tsx +29 -16
  180. package/src/panels/JoinPanel/steps/InvitationInput.tsx +9 -17
  181. package/src/panels/Panels.stories.tsx +1 -1
  182. package/src/panels/SpacePanel/SpacePanel.stories.tsx +2 -2
  183. package/src/panels/SpacePanel/SpacePanel.tsx +3 -3
  184. package/src/panels/SpacePanel/SpacePanelProps.ts +4 -4
  185. package/src/playwright/invitations-manager.ts +9 -13
  186. package/src/playwright/invitations.spec.ts +42 -54
  187. package/src/playwright/playwright.config.ts +13 -2
  188. package/src/steps/ConfirmReset.tsx +13 -5
  189. package/src/stories/Invitations.e2e-stories.tsx +17 -10
  190. package/src/testing/index.ts +2 -1
  191. package/src/testing/shell-manager.ts +4 -9
  192. 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)).to.equal(await manager.getDisplayName(1));
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: Invitation.AuthMethod.NONE });
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)).to.equal(await manager.getDisplayName(1));
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)).to.equal(await manager.getDisplayName(1));
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))).to.be.true;
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)).to.equal(await manager.getDisplayName(1));
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))).to.be.true;
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))).to.be.true;
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))).to.be.true;
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)).to.equal(await manager.getDisplayName(1));
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))).to.be.true;
161
+ expect(await manager.readyToAuthenticate('device', manager.peer(1))).toBe(true);
163
162
  await manager.toggleNetworkStatus(0);
164
- expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.OFFLINE);
163
+ expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOffline);
165
164
  await manager.toggleNetworkStatus(0);
166
- expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.ONLINE);
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)).to.equal(await manager.getDisplayName(1));
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)).to.equal(await manager.getSpaceName(1, 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: Invitation.AuthMethod.NONE });
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)).to.equal(2);
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: Invitation.AuthMethod.NONE });
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)).to.equal(await manager.getSpaceName(1, 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))).to.be.true;
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)).to.equal(await manager.getSpaceName(1, 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))).to.be.true;
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)).to.equal(await manager.getSpaceName(1, 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))).to.be.true;
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))).to.be.true;
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))).to.be.true;
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)).to.equal(await manager.getSpaceName(1, 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))).to.be.true;
335
+ expect(await manager.readyToAuthenticate('space', manager.peer(1))).toBe(true);
345
336
  await manager.toggleNetworkStatus(0);
346
- expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.OFFLINE);
337
+ expect(await manager.getNetworkStatus(0)).toEqual(ConnectionStateOffline);
347
338
  await manager.toggleNetworkStatus(0);
348
- expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.ONLINE);
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)).to.equal(await manager.getSpaceName(1, 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)).to.equal(await manager.getSpaceName(1, 1));
389
- expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(2, 1));
390
- expect(await manager.getSpaceName(1, 1)).to.equal(await manager.getSpaceName(2, 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 { defaultPlaywrightConfig } from '@dxos/test/playwright';
5
+ import { nxE2EPreset } from '@nx/playwright/preset';
6
+ import { defineConfig } from '@playwright/test';
6
7
 
7
- export default defaultPlaywrightConfig;
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 = mode === 'join new identity' ? 'join-new-identity' : 'reset-storage';
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(mode === 'join new identity' ? 'join new identity input label' : 'reset storage input label', {
83
- confirmationValue,
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 { ClientRepeater } from '@dxos/react-client/testing';
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 = (args: { id: number; count: number }) => {
117
- const { id }: { id: number } = args;
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: (args: { id: number }) => (
224
- <ClipboardProvider>
225
- <ClientRepeater component={Invitations} count={3} />
226
- </ClipboardProvider>
227
- ),
228
- decorators: [withTheme, withLayout({ tooltips: true })],
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],
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './fixtures';
5
+ // NOTE: Not exporting fixtures as they depend on esm-only packages.
6
+
6
7
  export * from './scoped-shell-manager';
7
8
  export * from './shell-manager';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import type { ConsoleMessage, Dialog, Page } from '@playwright/test';
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 PIN.',
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 confirmation PIN',
46
- 'authenticating status label': 'Enter confirmation PIN',
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
  };