@dxos/shell 0.3.11-main.008b7c6

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 (530) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +21 -0
  3. package/dist/lib/browser/chunk-ZSTKOCBT.mjs +10 -0
  4. package/dist/lib/browser/chunk-ZSTKOCBT.mjs.map +7 -0
  5. package/dist/lib/browser/meta.json +1 -0
  6. package/dist/lib/browser/react.mjs +3617 -0
  7. package/dist/lib/browser/react.mjs.map +7 -0
  8. package/dist/lib/browser/testing/index.mjs +179 -0
  9. package/dist/lib/browser/testing/index.mjs.map +7 -0
  10. package/dist/types/src/components/AuthCode.d.ts +8 -0
  11. package/dist/types/src/components/AuthCode.d.ts.map +1 -0
  12. package/dist/types/src/components/AuthCode.js +26 -0
  13. package/dist/types/src/components/AuthCode.js.map +1 -0
  14. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts +9 -0
  15. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -0
  16. package/dist/types/src/components/Clipboard/ClipboardProvider.js +46 -0
  17. package/dist/types/src/components/Clipboard/ClipboardProvider.js.map +1 -0
  18. package/dist/types/src/components/Clipboard/CopyButton.d.ts +9 -0
  19. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -0
  20. package/dist/types/src/components/Clipboard/CopyButton.js +65 -0
  21. package/dist/types/src/components/Clipboard/CopyButton.js.map +1 -0
  22. package/dist/types/src/components/Clipboard/index.d.ts +3 -0
  23. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -0
  24. package/dist/types/src/components/Clipboard/index.js +22 -0
  25. package/dist/types/src/components/Clipboard/index.js.map +1 -0
  26. package/dist/types/src/components/CompoundButton/CompoundButton.d.ts +17 -0
  27. package/dist/types/src/components/CompoundButton/CompoundButton.d.ts.map +1 -0
  28. package/dist/types/src/components/CompoundButton/CompoundButton.js +29 -0
  29. package/dist/types/src/components/CompoundButton/CompoundButton.js.map +1 -0
  30. package/dist/types/src/components/CompoundButton/CompoundButton.stories.d.ts +35 -0
  31. package/dist/types/src/components/CompoundButton/CompoundButton.stories.d.ts.map +1 -0
  32. package/dist/types/src/components/CompoundButton/CompoundButton.stories.js +45 -0
  33. package/dist/types/src/components/CompoundButton/CompoundButton.stories.js.map +1 -0
  34. package/dist/types/src/components/CompoundButton/index.d.ts +2 -0
  35. package/dist/types/src/components/CompoundButton/index.d.ts.map +1 -0
  36. package/dist/types/src/components/CompoundButton/index.js +21 -0
  37. package/dist/types/src/components/CompoundButton/index.js.map +1 -0
  38. package/dist/types/src/components/IdentityList/DeviceList.d.ts +7 -0
  39. package/dist/types/src/components/IdentityList/DeviceList.d.ts.map +1 -0
  40. package/dist/types/src/components/IdentityList/DeviceList.js +29 -0
  41. package/dist/types/src/components/IdentityList/DeviceList.js.map +1 -0
  42. package/dist/types/src/components/IdentityList/IdentityListItem.d.ts +11 -0
  43. package/dist/types/src/components/IdentityList/IdentityListItem.d.ts.map +1 -0
  44. package/dist/types/src/components/IdentityList/IdentityListItem.js +47 -0
  45. package/dist/types/src/components/IdentityList/IdentityListItem.js.map +1 -0
  46. package/dist/types/src/components/IdentityList/SpaceMemberList.d.ts +13 -0
  47. package/dist/types/src/components/IdentityList/SpaceMemberList.d.ts.map +1 -0
  48. package/dist/types/src/components/IdentityList/SpaceMemberList.js +54 -0
  49. package/dist/types/src/components/IdentityList/SpaceMemberList.js.map +1 -0
  50. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts +17 -0
  51. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js +26 -0
  53. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.js.map +1 -0
  54. package/dist/types/src/components/IdentityList/index.d.ts +4 -0
  55. package/dist/types/src/components/IdentityList/index.d.ts.map +1 -0
  56. package/dist/types/src/components/IdentityList/index.js +23 -0
  57. package/dist/types/src/components/IdentityList/index.js.map +1 -0
  58. package/dist/types/src/components/InvitationList/InvitationList.d.ts +11 -0
  59. package/dist/types/src/components/InvitationList/InvitationList.d.ts.map +1 -0
  60. package/dist/types/src/components/InvitationList/InvitationList.js +22 -0
  61. package/dist/types/src/components/InvitationList/InvitationList.js.map +1 -0
  62. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts +17 -0
  63. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts.map +1 -0
  64. package/dist/types/src/components/InvitationList/InvitationList.stories.js +39 -0
  65. package/dist/types/src/components/InvitationList/InvitationList.stories.js.map +1 -0
  66. package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts +7 -0
  67. package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts.map +1 -0
  68. package/dist/types/src/components/InvitationList/InvitationListContainer.js +42 -0
  69. package/dist/types/src/components/InvitationList/InvitationListContainer.js.map +1 -0
  70. package/dist/types/src/components/InvitationList/InvitationListItem.d.ts +12 -0
  71. package/dist/types/src/components/InvitationList/InvitationListItem.d.ts.map +1 -0
  72. package/dist/types/src/components/InvitationList/InvitationListItem.js +103 -0
  73. package/dist/types/src/components/InvitationList/InvitationListItem.js.map +1 -0
  74. package/dist/types/src/components/InvitationList/InvitationListProps.d.ts +9 -0
  75. package/dist/types/src/components/InvitationList/InvitationListProps.d.ts.map +1 -0
  76. package/dist/types/src/components/InvitationList/InvitationListProps.js +3 -0
  77. package/dist/types/src/components/InvitationList/InvitationListProps.js.map +1 -0
  78. package/dist/types/src/components/InvitationList/index.d.ts +4 -0
  79. package/dist/types/src/components/InvitationList/index.d.ts.map +1 -0
  80. package/dist/types/src/components/InvitationList/index.js +23 -0
  81. package/dist/types/src/components/InvitationList/index.js.map +1 -0
  82. package/dist/types/src/components/Panel/Action.d.ts +20 -0
  83. package/dist/types/src/components/Panel/Action.d.ts.map +1 -0
  84. package/dist/types/src/components/Panel/Action.js +93 -0
  85. package/dist/types/src/components/Panel/Action.js.map +1 -0
  86. package/dist/types/src/components/Panel/Actions.d.ts +11 -0
  87. package/dist/types/src/components/Panel/Actions.d.ts.map +1 -0
  88. package/dist/types/src/components/Panel/Actions.js +36 -0
  89. package/dist/types/src/components/Panel/Actions.js.map +1 -0
  90. package/dist/types/src/components/Panel/CloseButton.d.ts +5 -0
  91. package/dist/types/src/components/Panel/CloseButton.d.ts.map +1 -0
  92. package/dist/types/src/components/Panel/CloseButton.js +21 -0
  93. package/dist/types/src/components/Panel/CloseButton.js.map +1 -0
  94. package/dist/types/src/components/Panel/Emoji.d.ts +7 -0
  95. package/dist/types/src/components/Panel/Emoji.d.ts.map +1 -0
  96. package/dist/types/src/components/Panel/Emoji.js +24 -0
  97. package/dist/types/src/components/Panel/Emoji.js.map +1 -0
  98. package/dist/types/src/components/Panel/Heading.d.ts +16 -0
  99. package/dist/types/src/components/Panel/Heading.d.ts.map +1 -0
  100. package/dist/types/src/components/Panel/Heading.js +39 -0
  101. package/dist/types/src/components/Panel/Heading.js.map +1 -0
  102. package/dist/types/src/components/Panel/Input.d.ts +11 -0
  103. package/dist/types/src/components/Panel/Input.d.ts.map +1 -0
  104. package/dist/types/src/components/Panel/Input.js +19 -0
  105. package/dist/types/src/components/Panel/Input.js.map +1 -0
  106. package/dist/types/src/components/Panel/Label.d.ts +4 -0
  107. package/dist/types/src/components/Panel/Label.d.ts.map +1 -0
  108. package/dist/types/src/components/Panel/Label.js +17 -0
  109. package/dist/types/src/components/Panel/Label.js.map +1 -0
  110. package/dist/types/src/components/Panel/Panel.stories.d.ts +13 -0
  111. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/Panel/Panel.stories.js +44 -0
  113. package/dist/types/src/components/Panel/Panel.stories.js.map +1 -0
  114. package/dist/types/src/components/Panel/StepHeading.d.ts +5 -0
  115. package/dist/types/src/components/Panel/StepHeading.d.ts.map +1 -0
  116. package/dist/types/src/components/Panel/StepHeading.js +35 -0
  117. package/dist/types/src/components/Panel/StepHeading.js.map +1 -0
  118. package/dist/types/src/components/Panel/index.d.ts +9 -0
  119. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  120. package/dist/types/src/components/Panel/index.js +28 -0
  121. package/dist/types/src/components/Panel/index.js.map +1 -0
  122. package/dist/types/src/components/SpaceListItem.d.ts +7 -0
  123. package/dist/types/src/components/SpaceListItem.d.ts.map +1 -0
  124. package/dist/types/src/components/SpaceListItem.js +46 -0
  125. package/dist/types/src/components/SpaceListItem.js.map +1 -0
  126. package/dist/types/src/components/StorybookDialog.d.ts +6 -0
  127. package/dist/types/src/components/StorybookDialog.d.ts.map +1 -0
  128. package/dist/types/src/components/StorybookDialog.js +23 -0
  129. package/dist/types/src/components/StorybookDialog.js.map +1 -0
  130. package/dist/types/src/components/Viewport/Viewport.d.ts +39 -0
  131. package/dist/types/src/components/Viewport/Viewport.d.ts.map +1 -0
  132. package/dist/types/src/components/Viewport/Viewport.js +73 -0
  133. package/dist/types/src/components/Viewport/Viewport.js.map +1 -0
  134. package/dist/types/src/components/Viewport/Viewport.stories.d.ts +17 -0
  135. package/dist/types/src/components/Viewport/Viewport.stories.d.ts.map +1 -0
  136. package/dist/types/src/components/Viewport/Viewport.stories.js +51 -0
  137. package/dist/types/src/components/Viewport/Viewport.stories.js.map +1 -0
  138. package/dist/types/src/components/Viewport/index.d.ts +2 -0
  139. package/dist/types/src/components/Viewport/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Viewport/index.js +21 -0
  141. package/dist/types/src/components/Viewport/index.js.map +1 -0
  142. package/dist/types/src/components/index.d.ts +9 -0
  143. package/dist/types/src/components/index.d.ts.map +1 -0
  144. package/dist/types/src/components/index.js +28 -0
  145. package/dist/types/src/components/index.js.map +1 -0
  146. package/dist/types/src/composites/IdentityDialog/IdentityDialog.d.ts +7 -0
  147. package/dist/types/src/composites/IdentityDialog/IdentityDialog.d.ts.map +1 -0
  148. package/dist/types/src/composites/IdentityDialog/IdentityDialog.js +26 -0
  149. package/dist/types/src/composites/IdentityDialog/IdentityDialog.js.map +1 -0
  150. package/dist/types/src/composites/IdentityDialog/index.d.ts +2 -0
  151. package/dist/types/src/composites/IdentityDialog/index.d.ts.map +1 -0
  152. package/dist/types/src/composites/IdentityDialog/index.js +21 -0
  153. package/dist/types/src/composites/IdentityDialog/index.js.map +1 -0
  154. package/dist/types/src/composites/JoinDialog/JoinDialog.d.ts +6 -0
  155. package/dist/types/src/composites/JoinDialog/JoinDialog.d.ts.map +1 -0
  156. package/dist/types/src/composites/JoinDialog/JoinDialog.js +27 -0
  157. package/dist/types/src/composites/JoinDialog/JoinDialog.js.map +1 -0
  158. package/dist/types/src/composites/JoinDialog/index.d.ts +2 -0
  159. package/dist/types/src/composites/JoinDialog/index.d.ts.map +1 -0
  160. package/dist/types/src/composites/JoinDialog/index.js +21 -0
  161. package/dist/types/src/composites/JoinDialog/index.js.map +1 -0
  162. package/dist/types/src/composites/Shell/Shell.d.ts +6 -0
  163. package/dist/types/src/composites/Shell/Shell.d.ts.map +1 -0
  164. package/dist/types/src/composites/Shell/Shell.js +90 -0
  165. package/dist/types/src/composites/Shell/Shell.js.map +1 -0
  166. package/dist/types/src/composites/Shell/ShellContext.d.ts +30 -0
  167. package/dist/types/src/composites/Shell/ShellContext.d.ts.map +1 -0
  168. package/dist/types/src/composites/Shell/ShellContext.js +129 -0
  169. package/dist/types/src/composites/Shell/ShellContext.js.map +1 -0
  170. package/dist/types/src/composites/Shell/index.d.ts +4 -0
  171. package/dist/types/src/composites/Shell/index.d.ts.map +1 -0
  172. package/dist/types/src/composites/Shell/index.js +23 -0
  173. package/dist/types/src/composites/Shell/index.js.map +1 -0
  174. package/dist/types/src/composites/Shell/memory-shell-runtime.d.ts +16 -0
  175. package/dist/types/src/composites/Shell/memory-shell-runtime.d.ts.map +1 -0
  176. package/dist/types/src/composites/Shell/memory-shell-runtime.js +38 -0
  177. package/dist/types/src/composites/Shell/memory-shell-runtime.js.map +1 -0
  178. package/dist/types/src/composites/Shell/run-shell.d.ts +3 -0
  179. package/dist/types/src/composites/Shell/run-shell.d.ts.map +1 -0
  180. package/dist/types/src/composites/Shell/run-shell.js +54 -0
  181. package/dist/types/src/composites/Shell/run-shell.js.map +1 -0
  182. package/dist/types/src/composites/SpaceDialog/SpaceDialog.d.ts +6 -0
  183. package/dist/types/src/composites/SpaceDialog/SpaceDialog.d.ts.map +1 -0
  184. package/dist/types/src/composites/SpaceDialog/SpaceDialog.js +26 -0
  185. package/dist/types/src/composites/SpaceDialog/SpaceDialog.js.map +1 -0
  186. package/dist/types/src/composites/SpaceDialog/index.d.ts +2 -0
  187. package/dist/types/src/composites/SpaceDialog/index.d.ts.map +1 -0
  188. package/dist/types/src/composites/SpaceDialog/index.js +21 -0
  189. package/dist/types/src/composites/SpaceDialog/index.js.map +1 -0
  190. package/dist/types/src/composites/index.d.ts +5 -0
  191. package/dist/types/src/composites/index.d.ts.map +1 -0
  192. package/dist/types/src/composites/index.js +24 -0
  193. package/dist/types/src/composites/index.js.map +1 -0
  194. package/dist/types/src/index.d.ts +3 -0
  195. package/dist/types/src/index.d.ts.map +1 -0
  196. package/dist/types/src/index.js +10 -0
  197. package/dist/types/src/index.js.map +1 -0
  198. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts +4 -0
  199. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -0
  200. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +124 -0
  201. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -0
  202. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts +22 -0
  203. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -0
  204. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +86 -0
  205. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -0
  206. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +27 -0
  207. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -0
  208. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.js +6 -0
  209. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.js.map +1 -0
  210. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts +46 -0
  211. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -0
  212. package/dist/types/src/panels/IdentityPanel/identityMachine.js +79 -0
  213. package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -0
  214. package/dist/types/src/panels/IdentityPanel/index.d.ts +3 -0
  215. package/dist/types/src/panels/IdentityPanel/index.d.ts.map +1 -0
  216. package/dist/types/src/panels/IdentityPanel/index.js +22 -0
  217. package/dist/types/src/panels/IdentityPanel/index.js.map +1 -0
  218. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts +9 -0
  219. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -0
  220. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +85 -0
  221. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -0
  222. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts +15 -0
  223. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -0
  224. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +62 -0
  225. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -0
  226. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts +3 -0
  227. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts.map +1 -0
  228. package/dist/types/src/panels/IdentityPanel/steps/index.js +22 -0
  229. package/dist/types/src/panels/IdentityPanel/steps/index.js.map +1 -0
  230. package/dist/types/src/panels/JoinPanel/JoinHeading.d.ts +10 -0
  231. package/dist/types/src/panels/JoinPanel/JoinHeading.d.ts.map +1 -0
  232. package/dist/types/src/panels/JoinPanel/JoinHeading.js +45 -0
  233. package/dist/types/src/panels/JoinPanel/JoinHeading.js.map +1 -0
  234. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts +4 -0
  235. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts.map +1 -0
  236. package/dist/types/src/panels/JoinPanel/JoinPanel.js +293 -0
  237. package/dist/types/src/panels/JoinPanel/JoinPanel.js.map +1 -0
  238. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts +92 -0
  239. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts.map +1 -0
  240. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js +74 -0
  241. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.js.map +1 -0
  242. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts +91 -0
  243. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts.map +1 -0
  244. package/dist/types/src/panels/JoinPanel/JoinPanelProps.js +6 -0
  245. package/dist/types/src/panels/JoinPanel/JoinPanelProps.js.map +1 -0
  246. package/dist/types/src/panels/JoinPanel/index.d.ts +3 -0
  247. package/dist/types/src/panels/JoinPanel/index.d.ts.map +1 -0
  248. package/dist/types/src/panels/JoinPanel/index.js +22 -0
  249. package/dist/types/src/panels/JoinPanel/index.js.map +1 -0
  250. package/dist/types/src/panels/JoinPanel/joinMachine.d.ts +87 -0
  251. package/dist/types/src/panels/JoinPanel/joinMachine.d.ts.map +1 -0
  252. package/dist/types/src/panels/JoinPanel/joinMachine.js +402 -0
  253. package/dist/types/src/panels/JoinPanel/joinMachine.js.map +1 -0
  254. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts +4 -0
  255. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts.map +1 -0
  256. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js +34 -0
  257. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.js.map +1 -0
  258. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.d.ts +8 -0
  259. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.d.ts.map +1 -0
  260. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.js +56 -0
  261. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.js.map +1 -0
  262. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts +12 -0
  263. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts.map +1 -0
  264. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js +67 -0
  265. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js.map +1 -0
  266. package/dist/types/src/panels/JoinPanel/steps/InvitationAccepted.d.ts +9 -0
  267. package/dist/types/src/panels/JoinPanel/steps/InvitationAccepted.d.ts.map +1 -0
  268. package/dist/types/src/panels/JoinPanel/steps/InvitationAccepted.js +44 -0
  269. package/dist/types/src/panels/JoinPanel/steps/InvitationAccepted.js.map +1 -0
  270. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts +11 -0
  271. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts.map +1 -0
  272. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js +72 -0
  273. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js.map +1 -0
  274. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts +8 -0
  275. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts.map +1 -0
  276. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js +68 -0
  277. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js.map +1 -0
  278. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.d.ts +11 -0
  279. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.d.ts.map +1 -0
  280. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.js +49 -0
  281. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.js.map +1 -0
  282. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.d.ts +12 -0
  283. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.d.ts.map +1 -0
  284. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.js +63 -0
  285. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.js.map +1 -0
  286. package/dist/types/src/panels/JoinPanel/steps/index.d.ts +9 -0
  287. package/dist/types/src/panels/JoinPanel/steps/index.d.ts.map +1 -0
  288. package/dist/types/src/panels/JoinPanel/steps/index.js +28 -0
  289. package/dist/types/src/panels/JoinPanel/steps/index.js.map +1 -0
  290. package/dist/types/src/panels/Panels.stories.d.ts +22 -0
  291. package/dist/types/src/panels/Panels.stories.d.ts.map +1 -0
  292. package/dist/types/src/panels/Panels.stories.js +69 -0
  293. package/dist/types/src/panels/Panels.stories.js.map +1 -0
  294. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts +4 -0
  295. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts.map +1 -0
  296. package/dist/types/src/panels/SpacePanel/SpacePanel.js +93 -0
  297. package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -0
  298. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts +30 -0
  299. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts.map +1 -0
  300. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js +183 -0
  301. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js.map +1 -0
  302. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts +30 -0
  303. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts.map +1 -0
  304. package/dist/types/src/panels/SpacePanel/SpacePanelProps.js +6 -0
  305. package/dist/types/src/panels/SpacePanel/SpacePanelProps.js.map +1 -0
  306. package/dist/types/src/panels/SpacePanel/index.d.ts +3 -0
  307. package/dist/types/src/panels/SpacePanel/index.d.ts.map +1 -0
  308. package/dist/types/src/panels/SpacePanel/index.js +22 -0
  309. package/dist/types/src/panels/SpacePanel/index.js.map +1 -0
  310. package/dist/types/src/panels/SpacePanel/spaceMachine.d.ts +35 -0
  311. package/dist/types/src/panels/SpacePanel/spaceMachine.d.ts.map +1 -0
  312. package/dist/types/src/panels/SpacePanel/spaceMachine.js +46 -0
  313. package/dist/types/src/panels/SpacePanel/spaceMachine.js.map +1 -0
  314. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts +15 -0
  315. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -0
  316. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +120 -0
  317. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -0
  318. package/dist/types/src/panels/SpacePanel/steps/index.d.ts +2 -0
  319. package/dist/types/src/panels/SpacePanel/steps/index.d.ts.map +1 -0
  320. package/dist/types/src/panels/SpacePanel/steps/index.js +21 -0
  321. package/dist/types/src/panels/SpacePanel/steps/index.js.map +1 -0
  322. package/dist/types/src/panels/index.d.ts +4 -0
  323. package/dist/types/src/panels/index.d.ts.map +1 -0
  324. package/dist/types/src/panels/index.js +23 -0
  325. package/dist/types/src/panels/index.js.map +1 -0
  326. package/dist/types/src/playwright/invitations-manager.d.ts +26 -0
  327. package/dist/types/src/playwright/invitations-manager.d.ts.map +1 -0
  328. package/dist/types/src/playwright/invitations-manager.js +142 -0
  329. package/dist/types/src/playwright/invitations-manager.js.map +1 -0
  330. package/dist/types/src/playwright/invitations.spec.d.ts +2 -0
  331. package/dist/types/src/playwright/invitations.spec.d.ts.map +1 -0
  332. package/dist/types/src/playwright/invitations.spec.js +298 -0
  333. package/dist/types/src/playwright/invitations.spec.js.map +1 -0
  334. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  335. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  336. package/dist/types/src/playwright/playwright.config.js +8 -0
  337. package/dist/types/src/playwright/playwright.config.js.map +1 -0
  338. package/dist/types/src/react.d.ts +6 -0
  339. package/dist/types/src/react.d.ts.map +1 -0
  340. package/dist/types/src/react.js +25 -0
  341. package/dist/types/src/react.js.map +1 -0
  342. package/dist/types/src/steps/InvitationManager.d.ts +7 -0
  343. package/dist/types/src/steps/InvitationManager.d.ts.map +1 -0
  344. package/dist/types/src/steps/InvitationManager.js +80 -0
  345. package/dist/types/src/steps/InvitationManager.js.map +1 -0
  346. package/dist/types/src/steps/StepProps.d.ts +14 -0
  347. package/dist/types/src/steps/StepProps.d.ts.map +1 -0
  348. package/dist/types/src/steps/StepProps.js +6 -0
  349. package/dist/types/src/steps/StepProps.js.map +1 -0
  350. package/dist/types/src/steps/index.d.ts +3 -0
  351. package/dist/types/src/steps/index.d.ts.map +1 -0
  352. package/dist/types/src/steps/index.js +22 -0
  353. package/dist/types/src/steps/index.js.map +1 -0
  354. package/dist/types/src/stories/Invitations.e2e-stories.d.ts +22 -0
  355. package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -0
  356. package/dist/types/src/stories/Invitations.e2e-stories.js +146 -0
  357. package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -0
  358. package/dist/types/src/styles/index.d.ts +3 -0
  359. package/dist/types/src/styles/index.d.ts.map +1 -0
  360. package/dist/types/src/styles/index.js +22 -0
  361. package/dist/types/src/styles/index.js.map +1 -0
  362. package/dist/types/src/styles/invitationStatusStyles.d.ts +20 -0
  363. package/dist/types/src/styles/invitationStatusStyles.d.ts.map +1 -0
  364. package/dist/types/src/styles/invitationStatusStyles.js +41 -0
  365. package/dist/types/src/styles/invitationStatusStyles.js.map +1 -0
  366. package/dist/types/src/styles/panelStyles.d.ts +2 -0
  367. package/dist/types/src/styles/panelStyles.d.ts.map +1 -0
  368. package/dist/types/src/styles/panelStyles.js +8 -0
  369. package/dist/types/src/styles/panelStyles.js.map +1 -0
  370. package/dist/types/src/testing/fixtures/identities.d.ts +3 -0
  371. package/dist/types/src/testing/fixtures/identities.d.ts.map +1 -0
  372. package/dist/types/src/testing/fixtures/identities.js +18 -0
  373. package/dist/types/src/testing/fixtures/identities.js.map +1 -0
  374. package/dist/types/src/testing/fixtures/index.d.ts +3 -0
  375. package/dist/types/src/testing/fixtures/index.d.ts.map +1 -0
  376. package/dist/types/src/testing/fixtures/index.js +22 -0
  377. package/dist/types/src/testing/fixtures/index.js.map +1 -0
  378. package/dist/types/src/testing/fixtures/invitations.d.ts +3 -0
  379. package/dist/types/src/testing/fixtures/invitations.d.ts.map +1 -0
  380. package/dist/types/src/testing/fixtures/invitations.js +25 -0
  381. package/dist/types/src/testing/fixtures/invitations.js.map +1 -0
  382. package/dist/types/src/testing/index.d.ts +4 -0
  383. package/dist/types/src/testing/index.d.ts.map +1 -0
  384. package/dist/types/src/testing/index.js +23 -0
  385. package/dist/types/src/testing/index.js.map +1 -0
  386. package/dist/types/src/testing/scoped-shell-manager.d.ts +17 -0
  387. package/dist/types/src/testing/scoped-shell-manager.d.ts.map +1 -0
  388. package/dist/types/src/testing/scoped-shell-manager.js +71 -0
  389. package/dist/types/src/testing/scoped-shell-manager.js.map +1 -0
  390. package/dist/types/src/testing/shell-manager.d.ts +24 -0
  391. package/dist/types/src/testing/shell-manager.d.ts.map +1 -0
  392. package/dist/types/src/testing/shell-manager.js +85 -0
  393. package/dist/types/src/testing/shell-manager.js.map +1 -0
  394. package/dist/types/src/translations/index.d.ts +5 -0
  395. package/dist/types/src/translations/index.d.ts.map +1 -0
  396. package/dist/types/src/translations/index.js +32 -0
  397. package/dist/types/src/translations/index.js.map +1 -0
  398. package/dist/types/src/translations/locales/en-US.d.ts +97 -0
  399. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -0
  400. package/dist/types/src/translations/locales/en-US.js +103 -0
  401. package/dist/types/src/translations/locales/en-US.js.map +1 -0
  402. package/dist/types/src/types/FailReason.d.ts +2 -0
  403. package/dist/types/src/types/FailReason.d.ts.map +1 -0
  404. package/dist/types/src/types/FailReason.js +6 -0
  405. package/dist/types/src/types/FailReason.js.map +1 -0
  406. package/dist/types/src/types/IInvitation.d.ts +7 -0
  407. package/dist/types/src/types/IInvitation.d.ts.map +1 -0
  408. package/dist/types/src/types/IInvitation.js +6 -0
  409. package/dist/types/src/types/IInvitation.js.map +1 -0
  410. package/dist/types/src/types/index.d.ts +3 -0
  411. package/dist/types/src/types/index.d.ts.map +1 -0
  412. package/dist/types/src/types/index.js +22 -0
  413. package/dist/types/src/types/index.js.map +1 -0
  414. package/dist/types/src/util/index.d.ts +3 -0
  415. package/dist/types/src/util/index.d.ts.map +1 -0
  416. package/dist/types/src/util/index.js +22 -0
  417. package/dist/types/src/util/index.js.map +1 -0
  418. package/dist/types/src/util/invitationStatusValue.d.ts +8 -0
  419. package/dist/types/src/util/invitationStatusValue.d.ts.map +1 -0
  420. package/dist/types/src/util/invitationStatusValue.js +24 -0
  421. package/dist/types/src/util/invitationStatusValue.js.map +1 -0
  422. package/dist/types/src/util/toEmoji.d.ts +2 -0
  423. package/dist/types/src/util/toEmoji.d.ts.map +1 -0
  424. package/dist/types/src/util/toEmoji.js +26 -0
  425. package/dist/types/src/util/toEmoji.js.map +1 -0
  426. package/package.json +79 -0
  427. package/src/components/AuthCode.tsx +36 -0
  428. package/src/components/Clipboard/ClipboardProvider.tsx +26 -0
  429. package/src/components/Clipboard/CopyButton.tsx +70 -0
  430. package/src/components/Clipboard/index.ts +6 -0
  431. package/src/components/CompoundButton/CompoundButton.stories.tsx +49 -0
  432. package/src/components/CompoundButton/CompoundButton.tsx +89 -0
  433. package/src/components/CompoundButton/index.ts +5 -0
  434. package/src/components/IdentityList/DeviceList.tsx +45 -0
  435. package/src/components/IdentityList/IdentityListItem.tsx +42 -0
  436. package/src/components/IdentityList/SpaceMemberList.stories.tsx +24 -0
  437. package/src/components/IdentityList/SpaceMemberList.tsx +65 -0
  438. package/src/components/IdentityList/index.ts +7 -0
  439. package/src/components/InvitationList/InvitationList.stories.tsx +44 -0
  440. package/src/components/InvitationList/InvitationList.tsx +31 -0
  441. package/src/components/InvitationList/InvitationListContainer.tsx +27 -0
  442. package/src/components/InvitationList/InvitationListItem.tsx +183 -0
  443. package/src/components/InvitationList/InvitationListProps.ts +9 -0
  444. package/src/components/InvitationList/index.ts +7 -0
  445. package/src/components/Panel/Action.tsx +142 -0
  446. package/src/components/Panel/Actions.tsx +31 -0
  447. package/src/components/Panel/CloseButton.tsx +24 -0
  448. package/src/components/Panel/Emoji.tsx +36 -0
  449. package/src/components/Panel/Heading.tsx +32 -0
  450. package/src/components/Panel/Input.tsx +27 -0
  451. package/src/components/Panel/Label.tsx +14 -0
  452. package/src/components/Panel/Panel.stories.tsx +52 -0
  453. package/src/components/Panel/StepHeading.tsx +17 -0
  454. package/src/components/Panel/index.ts +12 -0
  455. package/src/components/SpaceListItem.tsx +35 -0
  456. package/src/components/StorybookDialog.tsx +33 -0
  457. package/src/components/Viewport/Viewport.stories.tsx +66 -0
  458. package/src/components/Viewport/Viewport.tsx +120 -0
  459. package/src/components/Viewport/index.tsx +5 -0
  460. package/src/components/index.ts +12 -0
  461. package/src/composites/IdentityDialog/IdentityDialog.tsx +39 -0
  462. package/src/composites/IdentityDialog/index.ts +5 -0
  463. package/src/composites/JoinDialog/JoinDialog.tsx +40 -0
  464. package/src/composites/JoinDialog/index.ts +5 -0
  465. package/src/composites/Shell/Shell.tsx +98 -0
  466. package/src/composites/Shell/ShellContext.tsx +163 -0
  467. package/src/composites/Shell/index.ts +7 -0
  468. package/src/composites/Shell/memory-shell-runtime.ts +50 -0
  469. package/src/composites/Shell/run-shell.tsx +38 -0
  470. package/src/composites/SpaceDialog/SpaceDialog.tsx +37 -0
  471. package/src/composites/SpaceDialog/index.ts +5 -0
  472. package/src/composites/index.ts +8 -0
  473. package/src/index.ts +7 -0
  474. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +113 -0
  475. package/src/panels/IdentityPanel/IdentityPanel.tsx +158 -0
  476. package/src/panels/IdentityPanel/IdentityPanelProps.ts +36 -0
  477. package/src/panels/IdentityPanel/identityMachine.ts +131 -0
  478. package/src/panels/IdentityPanel/index.ts +6 -0
  479. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +96 -0
  480. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +79 -0
  481. package/src/panels/IdentityPanel/steps/index.ts +6 -0
  482. package/src/panels/JoinPanel/JoinHeading.tsx +49 -0
  483. package/src/panels/JoinPanel/JoinPanel.stories.tsx +91 -0
  484. package/src/panels/JoinPanel/JoinPanel.tsx +415 -0
  485. package/src/panels/JoinPanel/JoinPanelProps.ts +132 -0
  486. package/src/panels/JoinPanel/index.ts +6 -0
  487. package/src/panels/JoinPanel/joinMachine.ts +536 -0
  488. package/src/panels/JoinPanel/steps/AdditionMethodChooser.tsx +65 -0
  489. package/src/panels/JoinPanel/steps/IdentityAdded.tsx +75 -0
  490. package/src/panels/JoinPanel/steps/IdentityInput.tsx +86 -0
  491. package/src/panels/JoinPanel/steps/InvitationAccepted.tsx +43 -0
  492. package/src/panels/JoinPanel/steps/InvitationAuthenticator.tsx +99 -0
  493. package/src/panels/JoinPanel/steps/InvitationInput.tsx +102 -0
  494. package/src/panels/JoinPanel/steps/InvitationRescuer.tsx +102 -0
  495. package/src/panels/JoinPanel/steps/ResetIdentity.tsx +71 -0
  496. package/src/panels/JoinPanel/steps/index.ts +12 -0
  497. package/src/panels/Panels.stories.tsx +61 -0
  498. package/src/panels/SpacePanel/SpacePanel.stories.tsx +328 -0
  499. package/src/panels/SpacePanel/SpacePanel.tsx +122 -0
  500. package/src/panels/SpacePanel/SpacePanelProps.ts +40 -0
  501. package/src/panels/SpacePanel/index.ts +6 -0
  502. package/src/panels/SpacePanel/spaceMachine.ts +72 -0
  503. package/src/panels/SpacePanel/steps/SpaceManager.tsx +157 -0
  504. package/src/panels/SpacePanel/steps/index.ts +5 -0
  505. package/src/panels/index.ts +7 -0
  506. package/src/playwright/invitations-manager.ts +168 -0
  507. package/src/playwright/invitations.spec.ts +364 -0
  508. package/src/playwright/playwright.config.ts +7 -0
  509. package/src/react.ts +9 -0
  510. package/src/steps/InvitationManager.tsx +116 -0
  511. package/src/steps/StepProps.ts +17 -0
  512. package/src/steps/index.ts +6 -0
  513. package/src/stories/Invitations.e2e-stories.tsx +231 -0
  514. package/src/styles/index.ts +6 -0
  515. package/src/styles/invitationStatusStyles.ts +42 -0
  516. package/src/styles/panelStyles.ts +5 -0
  517. package/src/testing/fixtures/identities.ts +16 -0
  518. package/src/testing/fixtures/index.ts +6 -0
  519. package/src/testing/fixtures/invitations.ts +23 -0
  520. package/src/testing/index.ts +7 -0
  521. package/src/testing/scoped-shell-manager.ts +79 -0
  522. package/src/testing/shell-manager.ts +102 -0
  523. package/src/translations/index.ts +7 -0
  524. package/src/translations/locales/en-US.ts +101 -0
  525. package/src/types/FailReason.ts +5 -0
  526. package/src/types/IInvitation.ts +14 -0
  527. package/src/types/index.ts +6 -0
  528. package/src/util/index.ts +6 -0
  529. package/src/util/invitationStatusValue.ts +22 -0
  530. package/src/util/toEmoji.ts +22 -0
@@ -0,0 +1,364 @@
1
+ //
2
+ // Copyright 2021 DXOS.org
3
+ //
4
+
5
+ import { test } from '@playwright/test';
6
+ import { expect } from 'chai';
7
+
8
+ import { sleep } from '@dxos/async';
9
+ import { Invitation } from '@dxos/react-client/invitations';
10
+ import { ConnectionState } from '@dxos/react-client/mesh';
11
+
12
+ import { InvitationsManager } from './invitations-manager';
13
+
14
+ test.describe('Invitations', () => {
15
+ let manager: InvitationsManager;
16
+
17
+ // TODO(wittjosiah): Storybook takes a bit to be ready for testing against.
18
+ test.beforeAll(async ({ browser }) => {
19
+ test.setTimeout(60_000);
20
+ manager = new InvitationsManager(browser);
21
+ await manager.init();
22
+ });
23
+
24
+ test.beforeEach(async ({ browser }) => {
25
+ test.slow();
26
+
27
+ manager = new InvitationsManager(browser);
28
+ await manager.init();
29
+ });
30
+
31
+ test.describe('device', () => {
32
+ test('happy path', async () => {
33
+ await manager.createIdentity(0);
34
+ await manager.openPanel(0, 'devices');
35
+ const invitation = await manager.createInvitation(0, 'device');
36
+ const authCode = await manager.getAuthCode();
37
+
38
+ await manager.openPanel(1, 'identity');
39
+ await manager.acceptInvitation(1, 'device', invitation);
40
+ await manager.readyToAuthenticate('device', manager.peer(1));
41
+ await manager.authenticateInvitation('device', authCode, manager.peer(1));
42
+ await manager.doneInvitation('device', manager.peer(1));
43
+
44
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
45
+ });
46
+
47
+ test('no auth method', async () => {
48
+ await manager.createIdentity(0);
49
+ await manager.openPanel(0, 'devices');
50
+ const invitation = await manager.createInvitation(0, 'device', { authMethod: Invitation.AuthMethod.NONE });
51
+
52
+ await manager.openPanel(1, 'identity');
53
+ await manager.acceptInvitation(1, 'device', invitation);
54
+ await manager.doneInvitation('device', manager.peer(1));
55
+
56
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
57
+ });
58
+
59
+ test('invalid & retry auth code', async () => {
60
+ await manager.createIdentity(0);
61
+ await manager.openPanel(0, 'devices');
62
+ const invitation = await manager.createInvitation(0, 'device');
63
+ const authCode = await manager.getAuthCode();
64
+
65
+ await manager.openPanel(1, 'identity');
66
+ await manager.acceptInvitation(1, 'device', invitation);
67
+ await manager.authenticateInvitation('device', '000000', manager.peer(1));
68
+ await manager.clearAuthCode('device', manager.peer(1));
69
+ await manager.authenticateInvitation('device', authCode, manager.peer(1));
70
+ await manager.doneInvitation('device', manager.peer(1));
71
+
72
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
73
+ });
74
+
75
+ test('invalid & max auth code retries reached, retry invitation', async () => {
76
+ await manager.createIdentity(0);
77
+ await manager.openPanel(0, 'devices');
78
+ const invitation = await manager.createInvitation(0, 'device');
79
+ const authCode = await manager.getAuthCode();
80
+
81
+ await manager.openPanel(1, 'identity');
82
+ await manager.acceptInvitation(1, 'device', invitation);
83
+
84
+ await manager.authenticateInvitation('device', '000001', manager.peer(1));
85
+ await manager.clearAuthCode('device', manager.peer(1));
86
+ await manager.authenticateInvitation('device', '000002', manager.peer(1));
87
+ await manager.clearAuthCode('device', manager.peer(1));
88
+ await manager.authenticateInvitation('device', '000003', manager.peer(1));
89
+
90
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
91
+
92
+ await manager.resetInvitation(manager.peer(1));
93
+ await manager.invitationInputContinue('device', manager.peer(1));
94
+ await manager.clearAuthCode('device', manager.peer(1));
95
+ await manager.authenticateInvitation('device', authCode, manager.peer(1));
96
+ await manager.doneInvitation('device', manager.peer(1));
97
+
98
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
99
+ });
100
+
101
+ test('invitation timeout', async () => {
102
+ await manager.createIdentity(0);
103
+ await manager.openPanel(0, 'devices');
104
+ const invitation = await manager.createInvitation(0, 'device', { timeout: 10 });
105
+
106
+ await manager.openPanel(1, 'identity');
107
+ await manager.acceptInvitation(1, 'device', invitation);
108
+
109
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
110
+ });
111
+
112
+ // TODO(thure): This is skipped because the UI no longer affords cancelling device invitations, consider removing.
113
+ // TODO(wittjosiah): Device invitations are cancelled when leaving the invitation pane, this test should be fixed.
114
+ test.skip('invitation cancelled by host', async () => {
115
+ await manager.createIdentity(0);
116
+ await manager.openPanel(0, 'devices');
117
+ const invitation = await manager.createInvitation(0, 'device');
118
+
119
+ await manager.openPanel(1, 'identity');
120
+ await manager.acceptInvitation(1, 'device', invitation);
121
+ expect(await manager.readyToAuthenticate('device', manager.peer(1))).to.be.true;
122
+ await manager.cancelInvitation('device', 'host', manager.peer(0));
123
+
124
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
125
+ });
126
+
127
+ test('invitation cancelled by guest & retry', async () => {
128
+ await manager.createIdentity(0);
129
+ await manager.openPanel(0, 'devices');
130
+ const invitation = await manager.createInvitation(0, 'device');
131
+ const authCode = await manager.getAuthCode();
132
+
133
+ await manager.openPanel(1, 'identity');
134
+ await manager.acceptInvitation(1, 'device', invitation);
135
+ await manager.cancelInvitation('device', 'guest', manager.peer(1));
136
+ await manager.resetInvitation(manager.peer(1));
137
+ await manager.invitationInputContinue('device', manager.peer(1));
138
+ await manager.clearAuthCode('device', manager.peer(1));
139
+ await manager.authenticateInvitation('device', authCode, manager.peer(1));
140
+ await manager.doneInvitation('device', manager.peer(1));
141
+
142
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
143
+ });
144
+
145
+ // TODO(thure): The design no longer affords signalling an identity’s network status. Remove or adjust test, or adjust design.
146
+ test.skip('recover from network failure during invitation', async () => {
147
+ await manager.createIdentity(0);
148
+ await manager.openPanel(0, 'devices');
149
+ const invitation = await manager.createInvitation(0, 'device');
150
+ const authCode = await manager.getAuthCode();
151
+
152
+ await manager.openPanel(1, 'identity');
153
+ await manager.acceptInvitation(1, 'device', invitation);
154
+ expect(await manager.readyToAuthenticate('device', manager.peer(1))).to.be.true;
155
+ await manager.toggleNetworkStatus(0);
156
+ expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.OFFLINE);
157
+ await manager.toggleNetworkStatus(0);
158
+ expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.ONLINE);
159
+ await manager.resetInvitation(manager.peer(1));
160
+ await manager.invitationInputContinue('device', manager.peer(1));
161
+ await manager.clearAuthCode('device', manager.peer(1));
162
+ await manager.authenticateInvitation('device', authCode, manager.peer(1));
163
+ await manager.doneInvitation('device', manager.peer(1));
164
+
165
+ expect(await manager.getDisplayName(0)).to.equal(await manager.getDisplayName(1));
166
+ });
167
+ });
168
+
169
+ test.describe('space', () => {
170
+ test('happy path', async () => {
171
+ await manager.createIdentity(0);
172
+ await manager.createSpace(0);
173
+ await manager.openPanel(0, 1);
174
+ const invitation = await manager.createInvitation(0, 'space');
175
+ const authCode = await manager.getAuthCode();
176
+
177
+ await manager.createIdentity(1);
178
+ await manager.openPanel(1, 'join');
179
+ await manager.acceptInvitation(1, 'space', invitation);
180
+ await manager.readyToAuthenticate('space', manager.peer(1));
181
+ await manager.authenticateInvitation('space', authCode, manager.peer(1));
182
+ await manager.doneInvitation('space', manager.peer(1));
183
+
184
+ await manager.openPanel(0, 'spaces');
185
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
186
+ });
187
+
188
+ test('no auth method', async () => {
189
+ await manager.createIdentity(0);
190
+ await manager.createSpace(0);
191
+ await manager.openPanel(0, 1);
192
+ const invitation = await manager.createInvitation(0, 'space', { authMethod: Invitation.AuthMethod.NONE });
193
+
194
+ await manager.createIdentity(1);
195
+ await manager.openPanel(1, 'join');
196
+ await manager.acceptInvitation(1, 'space', invitation);
197
+ await manager.doneInvitation('space', manager.peer(1));
198
+
199
+ await manager.openPanel(0, 'spaces');
200
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
201
+ });
202
+
203
+ test('invalid & retry auth code', async () => {
204
+ await manager.createIdentity(0);
205
+ await manager.createSpace(0);
206
+ await manager.openPanel(0, 1);
207
+ const invitation = await manager.createInvitation(0, 'space');
208
+ const authCode = await manager.getAuthCode();
209
+
210
+ await manager.createIdentity(1);
211
+ await manager.openPanel(1, 'join');
212
+ await manager.acceptInvitation(1, 'space', invitation);
213
+ await manager.authenticateInvitation('space', '000000', manager.peer(1));
214
+
215
+ expect(await manager.authenticatorIsVisible('space', manager.peer(1))).to.be.true;
216
+
217
+ await manager.clearAuthCode('space', manager.peer(1));
218
+ await manager.authenticateInvitation('space', authCode, manager.peer(1));
219
+ await manager.doneInvitation('space', manager.peer(1));
220
+
221
+ await manager.openPanel(0, 'spaces');
222
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
223
+ });
224
+
225
+ test('invalid & max auth code retries reached, retry invitation', async () => {
226
+ await manager.createIdentity(0);
227
+ await manager.createSpace(0);
228
+ await manager.openPanel(0, 1);
229
+ const invitation = await manager.createInvitation(0, 'space');
230
+ const authCode = await manager.getAuthCode();
231
+
232
+ await manager.createIdentity(1);
233
+ await manager.openPanel(1, 'join');
234
+ await manager.acceptInvitation(1, 'space', invitation);
235
+
236
+ await manager.authenticateInvitation('space', '000001', manager.peer(1));
237
+ await manager.clearAuthCode('space', manager.peer(1));
238
+ await manager.authenticateInvitation('space', '000002', manager.peer(1));
239
+ await manager.clearAuthCode('space', manager.peer(1));
240
+ await manager.authenticateInvitation('space', '000003', manager.peer(1));
241
+
242
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
243
+
244
+ await manager.resetInvitation(manager.peer(1));
245
+ await manager.invitationInputContinue('space', manager.peer(1));
246
+ await manager.clearAuthCode('space', manager.peer(1));
247
+ await manager.authenticateInvitation('space', authCode, manager.peer(1));
248
+ await manager.doneInvitation('space', manager.peer(1));
249
+
250
+ await manager.openPanel(0, 'spaces');
251
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
252
+ });
253
+
254
+ test('invitation timeout', async () => {
255
+ await manager.createIdentity(0);
256
+ await manager.createSpace(0);
257
+ await manager.openPanel(0, 1);
258
+ const invitation = await manager.createInvitation(0, 'space', { timeout: 10 });
259
+
260
+ await manager.createIdentity(1);
261
+ await manager.openPanel(1, 'join');
262
+ await manager.acceptInvitation(1, 'space', invitation);
263
+
264
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
265
+ });
266
+
267
+ // TODO(wittjosiah): Cancel not propagating.
268
+ test.skip('invitation cancelled by host', async () => {
269
+ await manager.createIdentity(0);
270
+ await manager.createSpace(0);
271
+ await manager.openPanel(0, 1);
272
+ const invitation = await manager.createInvitation(0, 'space');
273
+
274
+ await manager.createIdentity(1);
275
+ await manager.openPanel(1, 'join');
276
+ await manager.acceptInvitation(1, 'space', invitation);
277
+ expect(await manager.readyToAuthenticate('space', manager.peer(1))).to.be.true;
278
+ await manager.cancelInvitation('space', 'host', manager.peer(0));
279
+
280
+ expect(await manager.invitationFailed(manager.peer(1))).to.be.true;
281
+ });
282
+
283
+ test('invitation cancelled by guest & retry', async () => {
284
+ await manager.createIdentity(0);
285
+ await manager.createSpace(0);
286
+ await manager.openPanel(0, 1);
287
+ const invitation = await manager.createInvitation(0, 'space');
288
+ const authCode = await manager.getAuthCode();
289
+
290
+ await manager.createIdentity(1);
291
+ await manager.openPanel(1, 'join');
292
+ await manager.acceptInvitation(1, 'space', invitation);
293
+ await manager.cancelInvitation('space', 'guest', manager.peer(1));
294
+ await manager.resetInvitation(manager.peer(1));
295
+ await manager.invitationInputContinue('space', manager.peer(1));
296
+ await manager.clearAuthCode('space', manager.peer(1));
297
+ await manager.authenticateInvitation('space', authCode, manager.peer(1));
298
+ await manager.doneInvitation('space', manager.peer(1));
299
+
300
+ await manager.openPanel(0, 'spaces');
301
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
302
+ });
303
+
304
+ // TODO(thure): The design no longer affords signalling an identity’s network status. Remove or adjust test, or adjust design.
305
+ test.skip('recover from network failure during invitation', async () => {
306
+ await manager.createIdentity(0);
307
+ await manager.createSpace(0);
308
+ await manager.openPanel(0, 1);
309
+ const invitation = await manager.createInvitation(0, 'space');
310
+ const authCode = await manager.getAuthCode();
311
+
312
+ await manager.createIdentity(1);
313
+ await manager.openPanel(1, 'join');
314
+ await manager.acceptInvitation(1, 'space', invitation);
315
+ expect(await manager.readyToAuthenticate('space', manager.peer(1))).to.be.true;
316
+ await manager.toggleNetworkStatus(0);
317
+ expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.OFFLINE);
318
+ await manager.toggleNetworkStatus(0);
319
+ expect(await manager.getNetworkStatus(0)).to.equal(ConnectionState.ONLINE);
320
+ await manager.resetInvitation(manager.peer(1));
321
+ await manager.invitationInputContinue('space', manager.peer(1));
322
+ await manager.clearAuthCode('space', manager.peer(1));
323
+ await manager.authenticateInvitation('space', authCode, manager.peer(1));
324
+ await manager.doneInvitation('space', manager.peer(1));
325
+
326
+ await manager.openPanel(0, 'spaces');
327
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
328
+ });
329
+
330
+ test('multiple concurrent invitations', async () => {
331
+ await manager.createIdentity(0);
332
+ await manager.createIdentity(1);
333
+ await manager.createIdentity(2);
334
+
335
+ await manager.createSpace(0);
336
+ await manager.openPanel(0, 1);
337
+ await manager.openPanel(1, 'join');
338
+ await manager.openPanel(2, 'join');
339
+
340
+ const invitation1 = await manager.createInvitation(0, 'space');
341
+ const authCode1 = await manager.getAuthCode();
342
+ await manager.acceptInvitation(1, 'space', invitation1);
343
+ await manager.readyToAuthenticate('space', manager.peer(1));
344
+
345
+ const invitation2 = await manager.createInvitation(0, 'space');
346
+ const authCode2 = await manager.getAuthCode();
347
+ await manager.acceptInvitation(2, 'space', invitation2);
348
+ await manager.readyToAuthenticate('space', manager.peer(2));
349
+
350
+ await manager.authenticateInvitation('space', authCode1, manager.peer(1));
351
+ // TODO(wittjosiah): Managing focus in tests is flaky.
352
+ // Helps to ensure both auth codes are fully input (especially in webkit).
353
+ await sleep(100);
354
+ await manager.authenticateInvitation('space', authCode2, manager.peer(2));
355
+ await manager.doneInvitation('space', manager.peer(1));
356
+ await manager.doneInvitation('space', manager.peer(2));
357
+
358
+ await manager.openPanel(0, 'spaces');
359
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(1, 1));
360
+ expect(await manager.getSpaceName(0, 1)).to.equal(await manager.getSpaceName(2, 1));
361
+ expect(await manager.getSpaceName(1, 1)).to.equal(await manager.getSpaceName(2, 1));
362
+ });
363
+ });
364
+ });
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { defaultPlaywrightConfig } from '@dxos/test/playwright';
6
+
7
+ export default defaultPlaywrightConfig;
package/src/react.ts ADDED
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ export * from './components';
6
+ export * from './composites';
7
+ export * from './panels';
8
+ export * from './styles';
9
+ export * from './translations';
@@ -0,0 +1,116 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Check, X } from '@phosphor-icons/react';
6
+ import React, { useMemo } from 'react';
7
+ import { QR } from 'react-qr-rounded';
8
+
9
+ import { type InvitationStatus, Invitation } from '@dxos/react-client/invitations';
10
+ import { useId, useTranslation } from '@dxos/react-ui';
11
+ import { descriptionText, getSize, mx } from '@dxos/react-ui-theme';
12
+
13
+ import { type StepProps } from './StepProps';
14
+ import {
15
+ Actions,
16
+ Action,
17
+ AuthCode,
18
+ Emoji,
19
+ Label,
20
+ Viewport,
21
+ type ViewportViewProps,
22
+ CopyButton,
23
+ Centered,
24
+ } from '../components';
25
+ import { invitationStatusValue, toEmoji } from '../util';
26
+
27
+ export type InvitationManagerProps = StepProps &
28
+ Partial<InvitationStatus> & {
29
+ invitationUrl?: string;
30
+ };
31
+
32
+ const InvitationManagerView = ({ children, ...props }: ViewportViewProps & { emoji?: string }) => {
33
+ return (
34
+ <Viewport.View {...props} classNames='grow flex flex-col justify-around items-center'>
35
+ {children}
36
+ </Viewport.View>
37
+ );
38
+ };
39
+
40
+ export const InvitationManager = ({
41
+ invitationUrl,
42
+ active,
43
+ send,
44
+ status,
45
+ type,
46
+ authCode,
47
+ id,
48
+ }: InvitationManagerProps) => {
49
+ const { t } = useTranslation('os');
50
+ const qrLabel = useId('invitation-manager__qr-code');
51
+ const statusValue = type === Invitation.Type.MULTIUSE ? 0 : invitationStatusValue.get(status!) ?? 0;
52
+ const showAuthCode = statusValue === 3;
53
+ const emoji = toEmoji(id ?? '');
54
+ const activeView = useMemo(() => {
55
+ switch (true) {
56
+ case statusValue === 5:
57
+ case statusValue < 0:
58
+ return 'showing final';
59
+ case statusValue === 3:
60
+ return 'showing auth code';
61
+ default:
62
+ return 'showing qr';
63
+ }
64
+ }, [statusValue]);
65
+ return (
66
+ <>
67
+ <Viewport.Root activeView={activeView} classNames='grow plb-1'>
68
+ <Viewport.Views>
69
+ <InvitationManagerView id='showing qr' emoji={emoji}>
70
+ <p className='text-sm mlb-1 font-normal text-center'>
71
+ {t(type === Invitation.Type.MULTIUSE ? 'invite many qr label' : 'invite one qr label')}
72
+ </p>
73
+ <div role='none' className={mx(descriptionText, 'is-full max-is-[14rem] relative')}>
74
+ <QR
75
+ rounding={100}
76
+ backgroundColor='transparent'
77
+ color='currentColor'
78
+ className={mx('is-full bs-full p-2', showAuthCode && 'invisible')}
79
+ aria-labelledby={qrLabel}
80
+ errorCorrectionLevel='Q'
81
+ cutout={true}
82
+ >
83
+ {invitationUrl ?? 'never'}
84
+ </QR>
85
+ <Centered>
86
+ <Emoji text={emoji} />
87
+ </Centered>
88
+ </div>
89
+ <span id={qrLabel} className='sr-only'>
90
+ {t('qr label')}
91
+ </span>
92
+ <CopyButton variant='ghost' value={invitationUrl ?? 'never'} />
93
+ </InvitationManagerView>
94
+ <InvitationManagerView id='showing auth code'>
95
+ <Label>{t('auth code message')}</Label>
96
+ <AuthCode code={authCode} large classNames='text-black dark:text-white' />
97
+ <Label>Be sure the other device is showing this symbol:</Label>
98
+ {emoji && <Emoji text={emoji} />}
99
+ </InvitationManagerView>
100
+ <InvitationManagerView id='showing final'>
101
+ {statusValue > 0 ? (
102
+ <Check className={mx('m-1.5', getSize(6))} />
103
+ ) : (
104
+ <X className={mx('m-1.5', getSize(6))} />
105
+ )}
106
+ </InvitationManagerView>
107
+ </Viewport.Views>
108
+ </Viewport.Root>
109
+ <Actions classNames='mbs-4'>
110
+ <Action disabled={!active} onClick={() => send?.({ type: 'deselectInvitation' })}>
111
+ {t('back label')}
112
+ </Action>
113
+ </Actions>
114
+ </>
115
+ );
116
+ };
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type cloneElement } from 'react';
6
+ import { type Event, type SingleOrArray } from 'xstate';
7
+
8
+ type StepDeselectInvitationEvent = { type: 'deselectInvitation' };
9
+
10
+ export type StepEvent = StepDeselectInvitationEvent;
11
+
12
+ export type StepProps = {
13
+ active?: boolean;
14
+ send?: (event: SingleOrArray<Event<StepEvent>>) => void;
15
+ onDone?: () => void;
16
+ doneActionParent?: Parameters<typeof cloneElement>[0];
17
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './InvitationManager';
6
+ export * from './StepProps';