@dxos/plugin-client 0.8.4-main.84f28bd → 0.8.4-main.937b3ca

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 (407) hide show
  1. package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs +118 -0
  2. package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-4BZGRIFS.mjs +293 -0
  4. package/dist/lib/browser/chunk-4BZGRIFS.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-F7H2Y3Z2.mjs +18 -0
  6. package/dist/lib/browser/chunk-F7H2Y3Z2.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-G7C3S2BE.mjs +15 -0
  8. package/dist/lib/browser/chunk-G7C3S2BE.mjs.map +7 -0
  9. package/dist/lib/browser/cli/index.mjs +1048 -0
  10. package/dist/lib/browser/cli/index.mjs.map +7 -0
  11. package/dist/lib/browser/client-IX5LMWV4.mjs +86 -0
  12. package/dist/lib/browser/client-IX5LMWV4.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +75 -81
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/migrations-3EBTAW3N.mjs +24 -0
  17. package/dist/lib/browser/migrations-3EBTAW3N.mjs.map +7 -0
  18. package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs +298 -0
  19. package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs.map +7 -0
  20. package/dist/lib/browser/react-context-4UABG3GP.mjs +24 -0
  21. package/dist/lib/browser/react-context-4UABG3GP.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-RSQ74XCT.mjs +675 -0
  23. package/dist/lib/browser/react-surface-RSQ74XCT.mjs.map +7 -0
  24. package/dist/lib/browser/schema-defs-O7VLP745.mjs +26 -0
  25. package/dist/lib/browser/schema-defs-O7VLP745.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +15 -0
  27. package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs +119 -0
  28. package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs.map +7 -0
  29. package/dist/lib/node-esm/chunk-BCELGXRI.mjs +20 -0
  30. package/dist/lib/node-esm/chunk-BCELGXRI.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs +295 -0
  32. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-PRAFFO54.mjs +16 -0
  34. package/dist/lib/node-esm/chunk-PRAFFO54.mjs.map +7 -0
  35. package/dist/lib/node-esm/cli/index.mjs +1049 -0
  36. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  37. package/dist/lib/node-esm/client-FFPK5UFP.mjs +87 -0
  38. package/dist/lib/node-esm/client-FFPK5UFP.mjs.map +7 -0
  39. package/dist/lib/node-esm/index.mjs +75 -81
  40. package/dist/lib/node-esm/index.mjs.map +4 -4
  41. package/dist/lib/node-esm/meta.json +1 -1
  42. package/dist/lib/node-esm/migrations-WSZSFGDK.mjs +25 -0
  43. package/dist/lib/node-esm/migrations-WSZSFGDK.mjs.map +7 -0
  44. package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs +299 -0
  45. package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs.map +7 -0
  46. package/dist/lib/node-esm/react-context-UVXMGPW4.mjs +25 -0
  47. package/dist/lib/node-esm/react-context-UVXMGPW4.mjs.map +7 -0
  48. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs +676 -0
  49. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs.map +7 -0
  50. package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs +27 -0
  51. package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs.map +7 -0
  52. package/dist/lib/node-esm/types/index.mjs +16 -0
  53. package/dist/types/src/ClientPlugin.d.ts +2 -1
  54. package/dist/types/src/ClientPlugin.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  56. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  57. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/client/client.d.ts +8 -0
  60. package/dist/types/src/capabilities/client/client.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/client/index.d.ts +17 -0
  62. package/dist/types/src/capabilities/client/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/index.d.ts +7 -19
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/migrations/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/migrations/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/migrations/migrations.d.ts +5 -0
  68. package/dist/types/src/capabilities/migrations/migrations.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/operation-resolver/index.d.ts +5 -0
  70. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +8 -0
  72. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/react-context/index.d.ts +7 -0
  74. package/dist/types/src/capabilities/react-context/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/react-context/react-context.d.ts +10 -0
  76. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/react-surface/index.d.ts +5 -0
  78. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +9 -0
  80. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/schema-defs/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/schema-defs/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts +5 -0
  84. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts.map +1 -0
  85. package/dist/types/src/cli/commands/config/index.d.ts +5 -0
  86. package/dist/types/src/cli/commands/config/index.d.ts.map +1 -0
  87. package/dist/types/src/cli/commands/config/view.d.ts +5 -0
  88. package/dist/types/src/cli/commands/config/view.d.ts.map +1 -0
  89. package/dist/types/src/cli/commands/device/index.d.ts +7 -0
  90. package/dist/types/src/cli/commands/device/index.d.ts.map +1 -0
  91. package/dist/types/src/cli/commands/device/info/index.d.ts +2 -0
  92. package/dist/types/src/cli/commands/device/info/index.d.ts.map +1 -0
  93. package/dist/types/src/cli/commands/device/info/info.d.ts +7 -0
  94. package/dist/types/src/cli/commands/device/info/info.d.ts.map +1 -0
  95. package/dist/types/src/cli/commands/device/info/info.test.d.ts +2 -0
  96. package/dist/types/src/cli/commands/device/info/info.test.d.ts.map +1 -0
  97. package/dist/types/src/cli/commands/device/list/index.d.ts +2 -0
  98. package/dist/types/src/cli/commands/device/list/index.d.ts.map +1 -0
  99. package/dist/types/src/cli/commands/device/list/list.d.ts +7 -0
  100. package/dist/types/src/cli/commands/device/list/list.d.ts.map +1 -0
  101. package/dist/types/src/cli/commands/device/list/list.test.d.ts +2 -0
  102. package/dist/types/src/cli/commands/device/list/list.test.d.ts.map +1 -0
  103. package/dist/types/src/cli/commands/device/update/index.d.ts +2 -0
  104. package/dist/types/src/cli/commands/device/update/index.d.ts.map +1 -0
  105. package/dist/types/src/cli/commands/device/update/update.d.ts +11 -0
  106. package/dist/types/src/cli/commands/device/update/update.d.ts.map +1 -0
  107. package/dist/types/src/cli/commands/device/util.d.ts +16 -0
  108. package/dist/types/src/cli/commands/device/util.d.ts.map +1 -0
  109. package/dist/types/src/cli/commands/edge/index.d.ts +5 -0
  110. package/dist/types/src/cli/commands/edge/index.d.ts.map +1 -0
  111. package/dist/types/src/cli/commands/edge/status.d.ts +7 -0
  112. package/dist/types/src/cli/commands/edge/status.d.ts.map +1 -0
  113. package/dist/types/src/cli/commands/halo/create/create.d.ts +15 -0
  114. package/dist/types/src/cli/commands/halo/create/create.d.ts.map +1 -0
  115. package/dist/types/src/cli/commands/halo/create/create.test.d.ts +2 -0
  116. package/dist/types/src/cli/commands/halo/create/create.test.d.ts.map +1 -0
  117. package/dist/types/src/cli/commands/halo/create/index.d.ts +2 -0
  118. package/dist/types/src/cli/commands/halo/create/index.d.ts.map +1 -0
  119. package/dist/types/src/cli/commands/halo/credential/add/add.d.ts +13 -0
  120. package/dist/types/src/cli/commands/halo/credential/add/add.d.ts.map +1 -0
  121. package/dist/types/src/cli/commands/halo/credential/add/index.d.ts +2 -0
  122. package/dist/types/src/cli/commands/halo/credential/add/index.d.ts.map +1 -0
  123. package/dist/types/src/cli/commands/halo/credential/index.d.ts +12 -0
  124. package/dist/types/src/cli/commands/halo/credential/index.d.ts.map +1 -0
  125. package/dist/types/src/cli/commands/halo/credential/list/index.d.ts +2 -0
  126. package/dist/types/src/cli/commands/halo/credential/list/index.d.ts.map +1 -0
  127. package/dist/types/src/cli/commands/halo/credential/list/list.d.ts +19 -0
  128. package/dist/types/src/cli/commands/halo/credential/list/list.d.ts.map +1 -0
  129. package/dist/types/src/cli/commands/halo/credential/list/list.test.d.ts +2 -0
  130. package/dist/types/src/cli/commands/halo/credential/list/list.test.d.ts.map +1 -0
  131. package/dist/types/src/cli/commands/halo/identity/identity.d.ts +7 -0
  132. package/dist/types/src/cli/commands/halo/identity/identity.d.ts.map +1 -0
  133. package/dist/types/src/cli/commands/halo/identity/identity.test.d.ts +2 -0
  134. package/dist/types/src/cli/commands/halo/identity/identity.test.d.ts.map +1 -0
  135. package/dist/types/src/cli/commands/halo/identity/index.d.ts +2 -0
  136. package/dist/types/src/cli/commands/halo/identity/index.d.ts.map +1 -0
  137. package/dist/types/src/cli/commands/halo/index.d.ts +3 -0
  138. package/dist/types/src/cli/commands/halo/index.d.ts.map +1 -0
  139. package/dist/types/src/cli/commands/halo/join/index.d.ts +2 -0
  140. package/dist/types/src/cli/commands/halo/join/index.d.ts.map +1 -0
  141. package/dist/types/src/cli/commands/halo/join/join.d.ts +8 -0
  142. package/dist/types/src/cli/commands/halo/join/join.d.ts.map +1 -0
  143. package/dist/types/src/cli/commands/halo/join/join.test.d.ts +2 -0
  144. package/dist/types/src/cli/commands/halo/join/join.test.d.ts.map +1 -0
  145. package/dist/types/src/cli/commands/halo/keys/index.d.ts +2 -0
  146. package/dist/types/src/cli/commands/halo/keys/index.d.ts.map +1 -0
  147. package/dist/types/src/cli/commands/halo/keys/keys.d.ts +7 -0
  148. package/dist/types/src/cli/commands/halo/keys/keys.d.ts.map +1 -0
  149. package/dist/types/src/cli/commands/halo/keys/keys.test.d.ts +2 -0
  150. package/dist/types/src/cli/commands/halo/keys/keys.test.d.ts.map +1 -0
  151. package/dist/types/src/cli/commands/halo/recover/index.d.ts +2 -0
  152. package/dist/types/src/cli/commands/halo/recover/index.d.ts.map +1 -0
  153. package/dist/types/src/cli/commands/halo/recover/recover.d.ts +7 -0
  154. package/dist/types/src/cli/commands/halo/recover/recover.d.ts.map +1 -0
  155. package/dist/types/src/cli/commands/halo/recover/recover.test.d.ts +2 -0
  156. package/dist/types/src/cli/commands/halo/recover/recover.test.d.ts.map +1 -0
  157. package/dist/types/src/cli/commands/halo/seed/index.d.ts +2 -0
  158. package/dist/types/src/cli/commands/halo/seed/index.d.ts.map +1 -0
  159. package/dist/types/src/cli/commands/halo/seed/seed.d.ts +7 -0
  160. package/dist/types/src/cli/commands/halo/seed/seed.d.ts.map +1 -0
  161. package/dist/types/src/cli/commands/halo/share/index.d.ts +2 -0
  162. package/dist/types/src/cli/commands/halo/share/index.d.ts.map +1 -0
  163. package/dist/types/src/cli/commands/halo/share/share.d.ts +15 -0
  164. package/dist/types/src/cli/commands/halo/share/share.d.ts.map +1 -0
  165. package/dist/types/src/cli/commands/halo/update/index.d.ts +2 -0
  166. package/dist/types/src/cli/commands/halo/update/index.d.ts.map +1 -0
  167. package/dist/types/src/cli/commands/halo/update/update.d.ts +11 -0
  168. package/dist/types/src/cli/commands/halo/update/update.d.ts.map +1 -0
  169. package/dist/types/src/cli/commands/halo/update/update.test.d.ts +2 -0
  170. package/dist/types/src/cli/commands/halo/update/update.test.d.ts.map +1 -0
  171. package/dist/types/src/cli/commands/halo/util.d.ts +13 -0
  172. package/dist/types/src/cli/commands/halo/util.d.ts.map +1 -0
  173. package/dist/types/src/cli/commands/index.d.ts +6 -0
  174. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  175. package/dist/types/src/cli/commands/profile/create.d.ts +9 -0
  176. package/dist/types/src/cli/commands/profile/create.d.ts.map +1 -0
  177. package/dist/types/src/cli/commands/profile/delete.d.ts +8 -0
  178. package/dist/types/src/cli/commands/profile/delete.d.ts.map +1 -0
  179. package/dist/types/src/cli/commands/profile/import.d.ts +17 -0
  180. package/dist/types/src/cli/commands/profile/import.d.ts.map +1 -0
  181. package/dist/types/src/cli/commands/profile/index.d.ts +19 -0
  182. package/dist/types/src/cli/commands/profile/index.d.ts.map +1 -0
  183. package/dist/types/src/cli/commands/profile/inspect.d.ts +13 -0
  184. package/dist/types/src/cli/commands/profile/inspect.d.ts.map +1 -0
  185. package/dist/types/src/cli/commands/profile/list.d.ts +6 -0
  186. package/dist/types/src/cli/commands/profile/list.d.ts.map +1 -0
  187. package/dist/types/src/cli/commands/profile/reset.d.ts +8 -0
  188. package/dist/types/src/cli/commands/profile/reset.d.ts.map +1 -0
  189. package/dist/types/src/cli/commands/profile/util.d.ts +24 -0
  190. package/dist/types/src/cli/commands/profile/util.d.ts.map +1 -0
  191. package/dist/types/src/cli/index.d.ts +2 -0
  192. package/dist/types/src/cli/index.d.ts.map +1 -0
  193. package/dist/types/src/cli/plugin.d.ts +4 -0
  194. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  195. package/dist/types/src/cli/testing/test-console.d.ts +37 -0
  196. package/dist/types/src/cli/testing/test-console.d.ts.map +1 -0
  197. package/dist/types/src/components/DevicesContainer.d.ts.map +1 -1
  198. package/dist/types/src/components/DevicesContainer.stories.d.ts +178 -5
  199. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/JoinDialog.d.ts +0 -1
  201. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  202. package/dist/types/src/components/ProfileContainer.d.ts.map +1 -1
  203. package/dist/types/src/components/ProfileContainer.stories.d.ts +11 -5
  204. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/RecoveryCodeDialog.d.ts +0 -1
  206. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  207. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts +13 -5
  208. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts.map +1 -1
  209. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts +1 -1
  210. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +1 -1
  211. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts +11 -5
  212. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
  213. package/dist/types/src/components/ResetDialog.d.ts +5 -3
  214. package/dist/types/src/components/ResetDialog.d.ts.map +1 -1
  215. package/dist/types/src/components/ResetDialog.stories.d.ts +13 -4
  216. package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -1
  217. package/dist/types/src/constants.d.ts +4 -0
  218. package/dist/types/src/constants.d.ts.map +1 -0
  219. package/dist/types/src/index.d.ts +3 -3
  220. package/dist/types/src/index.d.ts.map +1 -1
  221. package/dist/types/src/meta.d.ts +2 -3
  222. package/dist/types/src/meta.d.ts.map +1 -1
  223. package/dist/types/src/translations.d.ts +2 -48
  224. package/dist/types/src/translations.d.ts.map +1 -1
  225. package/dist/types/src/types/capabilities.d.ts +10 -0
  226. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  227. package/dist/types/src/types/events.d.ts +9 -0
  228. package/dist/types/src/types/events.d.ts.map +1 -0
  229. package/dist/types/src/types/index.d.ts +4 -0
  230. package/dist/types/src/types/index.d.ts.map +1 -0
  231. package/dist/types/src/types/schema.d.ts +296 -0
  232. package/dist/types/src/types/schema.d.ts.map +1 -0
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +59 -45
  235. package/src/ClientPlugin.ts +40 -60
  236. package/src/capabilities/app-graph-builder/app-graph-builder.ts +95 -0
  237. package/src/capabilities/app-graph-builder/index.ts +7 -0
  238. package/src/capabilities/client/client.ts +75 -0
  239. package/src/capabilities/client/index.ts +7 -0
  240. package/src/capabilities/index.ts +7 -11
  241. package/src/capabilities/migrations/index.ts +7 -0
  242. package/src/capabilities/migrations/migrations.ts +30 -0
  243. package/src/capabilities/operation-resolver/index.ts +7 -0
  244. package/src/capabilities/operation-resolver/operation-resolver.ts +248 -0
  245. package/src/capabilities/react-context/index.ts +7 -0
  246. package/src/capabilities/react-context/react-context.tsx +25 -0
  247. package/src/capabilities/react-surface/index.ts +7 -0
  248. package/src/capabilities/react-surface/react-surface.tsx +74 -0
  249. package/src/capabilities/schema-defs/index.ts +7 -0
  250. package/src/capabilities/schema-defs/schema-defs.ts +35 -0
  251. package/src/cli/commands/config/index.ts +12 -0
  252. package/src/cli/commands/config/view.ts +26 -0
  253. package/src/cli/commands/device/index.ts +14 -0
  254. package/src/cli/commands/device/info/index.ts +5 -0
  255. package/src/cli/commands/device/info/info.test.ts +29 -0
  256. package/src/cli/commands/device/info/info.ts +50 -0
  257. package/src/cli/commands/device/list/index.ts +5 -0
  258. package/src/cli/commands/device/list/list.test.ts +31 -0
  259. package/src/cli/commands/device/list/list.ts +30 -0
  260. package/src/cli/commands/device/update/index.ts +5 -0
  261. package/src/cli/commands/device/update/update.ts +70 -0
  262. package/src/cli/commands/device/util.ts +55 -0
  263. package/src/cli/commands/edge/index.ts +12 -0
  264. package/src/cli/commands/edge/status.ts +45 -0
  265. package/src/cli/commands/halo/create/create.test.ts +52 -0
  266. package/src/cli/commands/halo/create/create.ts +75 -0
  267. package/src/cli/commands/halo/create/index.ts +5 -0
  268. package/src/cli/commands/halo/credential/add/add.ts +97 -0
  269. package/src/cli/commands/halo/credential/add/index.ts +5 -0
  270. package/src/cli/commands/halo/credential/index.ts +13 -0
  271. package/src/cli/commands/halo/credential/list/index.ts +5 -0
  272. package/src/cli/commands/halo/credential/list/list.test.ts +28 -0
  273. package/src/cli/commands/halo/credential/list/list.ts +118 -0
  274. package/src/cli/commands/halo/identity/identity.test.ts +40 -0
  275. package/src/cli/commands/halo/identity/identity.ts +46 -0
  276. package/src/cli/commands/halo/identity/index.ts +5 -0
  277. package/src/cli/commands/halo/index.ts +21 -0
  278. package/src/cli/commands/halo/join/index.ts +5 -0
  279. package/src/cli/commands/halo/join/join.test.ts +10 -0
  280. package/src/cli/commands/halo/join/join.ts +87 -0
  281. package/src/cli/commands/halo/keys/index.ts +5 -0
  282. package/src/cli/commands/halo/keys/keys.test.ts +29 -0
  283. package/src/cli/commands/halo/keys/keys.ts +42 -0
  284. package/src/cli/commands/halo/recover/index.ts +5 -0
  285. package/src/cli/commands/halo/recover/recover.test.ts +10 -0
  286. package/src/cli/commands/halo/recover/recover.ts +44 -0
  287. package/src/cli/commands/halo/seed/index.ts +5 -0
  288. package/src/cli/commands/halo/seed/seed.ts +38 -0
  289. package/src/cli/commands/halo/share/index.ts +5 -0
  290. package/src/cli/commands/halo/share/share.ts +97 -0
  291. package/src/cli/commands/halo/update/index.ts +5 -0
  292. package/src/cli/commands/halo/update/update.test.ts +29 -0
  293. package/src/cli/commands/halo/update/update.ts +69 -0
  294. package/src/cli/commands/halo/util.ts +18 -0
  295. package/src/cli/commands/index.ts +9 -0
  296. package/src/cli/commands/profile/create.ts +87 -0
  297. package/src/cli/commands/profile/delete.ts +33 -0
  298. package/src/cli/commands/profile/import.ts +101 -0
  299. package/src/cli/commands/profile/index.ts +17 -0
  300. package/src/cli/commands/profile/inspect.ts +64 -0
  301. package/src/cli/commands/profile/list.ts +54 -0
  302. package/src/cli/commands/profile/reset.ts +45 -0
  303. package/src/cli/commands/profile/util.ts +48 -0
  304. package/src/cli/index.ts +5 -0
  305. package/src/cli/plugin.ts +33 -0
  306. package/src/cli/testing/test-console.ts +88 -0
  307. package/src/components/DevicesContainer.stories.tsx +15 -15
  308. package/src/components/DevicesContainer.tsx +72 -82
  309. package/src/components/JoinDialog.tsx +15 -17
  310. package/src/components/ProfileContainer.stories.tsx +8 -9
  311. package/src/components/ProfileContainer.tsx +61 -50
  312. package/src/components/RecoveryCodeDialog.stories.tsx +9 -10
  313. package/src/components/RecoveryCodeDialog.tsx +5 -7
  314. package/src/components/RecoveryCredentialsContainer.stories.tsx +15 -15
  315. package/src/components/RecoveryCredentialsContainer.tsx +48 -53
  316. package/src/components/ResetDialog.stories.tsx +25 -18
  317. package/src/components/ResetDialog.tsx +19 -18
  318. package/src/constants.ts +9 -0
  319. package/src/index.ts +3 -3
  320. package/src/meta.ts +8 -5
  321. package/src/translations.ts +5 -2
  322. package/src/types/capabilities.ts +16 -0
  323. package/src/types/events.ts +15 -0
  324. package/src/types/index.ts +7 -0
  325. package/src/types/schema.ts +243 -0
  326. package/dist/lib/browser/app-graph-builder-3EILEBWW.mjs +0 -123
  327. package/dist/lib/browser/app-graph-builder-3EILEBWW.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-64ANQXYZ.mjs +0 -693
  329. package/dist/lib/browser/chunk-64ANQXYZ.mjs.map +0 -7
  330. package/dist/lib/browser/chunk-AWXKL4UR.mjs +0 -18
  331. package/dist/lib/browser/chunk-AWXKL4UR.mjs.map +0 -7
  332. package/dist/lib/browser/chunk-CAF2COXW.mjs +0 -19
  333. package/dist/lib/browser/chunk-CAF2COXW.mjs.map +0 -7
  334. package/dist/lib/browser/chunk-GS3LDHYD.mjs +0 -12
  335. package/dist/lib/browser/chunk-GS3LDHYD.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-Q7TFRFHI.mjs +0 -111
  337. package/dist/lib/browser/chunk-Q7TFRFHI.mjs.map +0 -7
  338. package/dist/lib/browser/client-JFNMEFOK.mjs +0 -37
  339. package/dist/lib/browser/client-JFNMEFOK.mjs.map +0 -7
  340. package/dist/lib/browser/intent-resolver-YGAQVXI2.mjs +0 -305
  341. package/dist/lib/browser/intent-resolver-YGAQVXI2.mjs.map +0 -7
  342. package/dist/lib/browser/migrations-5COKGS4E.mjs +0 -23
  343. package/dist/lib/browser/migrations-5COKGS4E.mjs.map +0 -7
  344. package/dist/lib/browser/react-context-GBNYT5QK.mjs +0 -24
  345. package/dist/lib/browser/react-context-GBNYT5QK.mjs.map +0 -7
  346. package/dist/lib/browser/react-surface-YKQAUE2M.mjs +0 -66
  347. package/dist/lib/browser/react-surface-YKQAUE2M.mjs.map +0 -7
  348. package/dist/lib/browser/schema-defs-6L7W2RHL.mjs +0 -25
  349. package/dist/lib/browser/schema-defs-6L7W2RHL.mjs.map +0 -7
  350. package/dist/lib/browser/types.mjs +0 -10
  351. package/dist/lib/node-esm/app-graph-builder-GINHOE7A.mjs +0 -124
  352. package/dist/lib/node-esm/app-graph-builder-GINHOE7A.mjs.map +0 -7
  353. package/dist/lib/node-esm/chunk-3BUB64JB.mjs +0 -19
  354. package/dist/lib/node-esm/chunk-3BUB64JB.mjs.map +0 -7
  355. package/dist/lib/node-esm/chunk-GDJMDBWM.mjs +0 -112
  356. package/dist/lib/node-esm/chunk-GDJMDBWM.mjs.map +0 -7
  357. package/dist/lib/node-esm/chunk-K4PIKBQQ.mjs +0 -694
  358. package/dist/lib/node-esm/chunk-K4PIKBQQ.mjs.map +0 -7
  359. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs +0 -14
  360. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs +0 -20
  362. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs.map +0 -7
  363. package/dist/lib/node-esm/client-XDYQARBL.mjs +0 -38
  364. package/dist/lib/node-esm/client-XDYQARBL.mjs.map +0 -7
  365. package/dist/lib/node-esm/intent-resolver-IN7YG7N7.mjs +0 -306
  366. package/dist/lib/node-esm/intent-resolver-IN7YG7N7.mjs.map +0 -7
  367. package/dist/lib/node-esm/migrations-FE4PDX6W.mjs +0 -24
  368. package/dist/lib/node-esm/migrations-FE4PDX6W.mjs.map +0 -7
  369. package/dist/lib/node-esm/react-context-UCK43H3Z.mjs +0 -25
  370. package/dist/lib/node-esm/react-context-UCK43H3Z.mjs.map +0 -7
  371. package/dist/lib/node-esm/react-surface-HDHC6XHQ.mjs +0 -67
  372. package/dist/lib/node-esm/react-surface-HDHC6XHQ.mjs.map +0 -7
  373. package/dist/lib/node-esm/schema-defs-GZIVMHLW.mjs +0 -26
  374. package/dist/lib/node-esm/schema-defs-GZIVMHLW.mjs.map +0 -7
  375. package/dist/lib/node-esm/types.mjs +0 -11
  376. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  377. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/capabilities.d.ts +0 -10
  379. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/client.d.ts +0 -9
  381. package/dist/types/src/capabilities/client.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -8
  383. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/migrations.d.ts +0 -4
  385. package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/react-context.d.ts +0 -8
  387. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  388. package/dist/types/src/capabilities/react-surface.d.ts +0 -8
  389. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  390. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  391. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  392. package/dist/types/src/events.d.ts +0 -8
  393. package/dist/types/src/events.d.ts.map +0 -1
  394. package/dist/types/src/types.d.ts +0 -136
  395. package/dist/types/src/types.d.ts.map +0 -1
  396. package/src/capabilities/app-graph-builder.ts +0 -113
  397. package/src/capabilities/capabilities.ts +0 -17
  398. package/src/capabilities/client.ts +0 -41
  399. package/src/capabilities/intent-resolver.ts +0 -250
  400. package/src/capabilities/migrations.ts +0 -25
  401. package/src/capabilities/react-context.tsx +0 -20
  402. package/src/capabilities/react-surface.tsx +0 -67
  403. package/src/capabilities/schema-defs.ts +0 -29
  404. package/src/events.ts +0 -15
  405. package/src/types.ts +0 -131
  406. /package/dist/lib/browser/{types.mjs.map → types/index.mjs.map} +0 -0
  407. /package/dist/lib/node-esm/{types.mjs.map → types/index.mjs.map} +0 -0
@@ -2,17 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Check, X } from '@phosphor-icons/react';
6
5
  import React, { useCallback, useEffect, useState } from 'react';
7
6
  import { QR } from 'react-qr-rounded';
8
7
 
9
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { useOperationInvoker } from '@dxos/app-framework/react';
10
9
  import { log } from '@dxos/log';
11
10
  import { useClient, useMulticastObservable } from '@dxos/react-client';
12
11
  import { type Device, useDevices } from '@dxos/react-client/halo';
13
12
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
14
13
  import { useNetworkStatus } from '@dxos/react-client/mesh';
15
- import { Button, Clipboard, IconButton, List, useId, useTranslation } from '@dxos/react-ui';
14
+ import { Button, Clipboard, Icon, IconButton, List, useId, useTranslation } from '@dxos/react-ui';
16
15
  import {
17
16
  ControlFrame,
18
17
  ControlFrameItem,
@@ -21,102 +20,89 @@ import {
21
20
  ControlPage,
22
21
  ControlSection,
23
22
  } from '@dxos/react-ui-form';
24
- import { StackItem } from '@dxos/react-ui-stack';
25
- import { getSize, mx } from '@dxos/react-ui-theme';
23
+ import { translationKey } from '@dxos/shell/react';
26
24
  import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';
25
+ import { osTranslations } from '@dxos/ui-theme';
27
26
  import { hexToEmoji } from '@dxos/util';
28
27
 
29
- import { CLIENT_PLUGIN } from '../meta';
30
- import { ClientAction } from '../types';
28
+ import { meta } from '../meta';
29
+ import { ClientOperation } from '../types';
31
30
 
32
31
  export type DevicesContainerProps = {
33
32
  createInvitationUrl?: (invitationCode: string) => string;
34
33
  };
35
34
 
36
35
  export const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps) => {
37
- const { t } = useTranslation('os');
38
- const { dispatchPromise: dispatch } = useIntentDispatcher();
36
+ const { t } = useTranslation(translationKey);
37
+ const { invokePromise } = useOperationInvoker();
39
38
  const devices = useDevices();
40
39
  const { swarm: connectionState } = useNetworkStatus();
41
40
 
42
- const handleResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ResetStorage)), [dispatch]);
41
+ const handleResetStorage = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);
43
42
 
44
43
  const handleRecover = useCallback(
45
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'recover' })),
46
- [dispatch],
44
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),
45
+ [invokePromise],
47
46
  );
48
47
 
49
48
  const handleJoinNewIdentity = useCallback(
50
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'join new identity' })),
51
- [dispatch],
49
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'join new identity' }),
50
+ [invokePromise],
52
51
  );
53
52
 
54
53
  return (
55
54
  <Clipboard.Provider>
56
- <StackItem.Content classNames='block overflow-y-auto'>
57
- <ControlPage>
58
- <ControlSection
59
- title={t('devices verbose label', { ns: CLIENT_PLUGIN })}
60
- description={t('devices description', { ns: CLIENT_PLUGIN })}
61
- >
62
- <ControlFrame>
63
- <ControlFrameItem title={t('devices label', { ns: CLIENT_PLUGIN })}>
64
- <List>
65
- {devices.map((device: Device) => {
66
- return (
67
- <DeviceListItem
68
- key={device.deviceKey.toHex()}
69
- device={device}
70
- connectionState={connectionState}
71
- />
72
- );
73
- })}
74
- </List>
55
+ <ControlPage>
56
+ <ControlSection
57
+ title={t('devices verbose label', { ns: meta.id })}
58
+ description={t('devices description', { ns: meta.id })}
59
+ >
60
+ <ControlFrame>
61
+ <ControlFrameItem title={t('devices label', { ns: meta.id })}>
62
+ <List>
63
+ {devices.map((device: Device) => {
64
+ return (
65
+ <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />
66
+ );
67
+ })}
68
+ </List>
69
+ </ControlFrameItem>
70
+ {createInvitationUrl && (
71
+ <ControlFrameItem title='Add device'>
72
+ <DeviceInvitation createInvitationUrl={createInvitationUrl} />
75
73
  </ControlFrameItem>
76
- {createInvitationUrl && (
77
- <ControlFrameItem title='Add device'>
78
- <DeviceInvitation createInvitationUrl={createInvitationUrl} />
79
- </ControlFrameItem>
80
- )}
81
- </ControlFrame>
82
- </ControlSection>
83
- <ControlSection
84
- title={t('danger zone title', { ns: CLIENT_PLUGIN })}
85
- description={t('danger zone description', { ns: CLIENT_PLUGIN })}
86
- >
87
- <ControlGroup>
88
- <ControlItem
89
- title={t('reset device label')}
90
- description={t('reset device description', { ns: CLIENT_PLUGIN })}
91
- >
92
- <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
93
- {t('reset device label')}
94
- </Button>
95
- </ControlItem>
96
- <ControlItem
97
- title={t('recover identity label')}
98
- description={t('recover identity description', { ns: CLIENT_PLUGIN })}
99
- >
100
- <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
101
- {t('recover identity label')}
102
- </Button>
103
- </ControlItem>
104
- <ControlItem
105
- title={t('join new identity label')}
106
- description={t('join new identity description', { ns: CLIENT_PLUGIN })}
107
- >
108
- <Button
109
- variant='destructive'
110
- onClick={handleJoinNewIdentity}
111
- data-testid='devicesContainer.joinExisting'
112
- >
113
- {t('join new identity label')}
114
- </Button>
115
- </ControlItem>
116
- </ControlGroup>
117
- </ControlSection>
118
- </ControlPage>
119
- </StackItem.Content>
74
+ )}
75
+ </ControlFrame>
76
+ </ControlSection>
77
+ <ControlSection
78
+ title={t('danger zone title', { ns: meta.id })}
79
+ description={t('danger zone description', { ns: meta.id })}
80
+ >
81
+ <ControlGroup>
82
+ <ControlItem title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>
83
+ <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
84
+ {t('reset device label')}
85
+ </Button>
86
+ </ControlItem>
87
+ <ControlItem
88
+ title={t('recover identity label')}
89
+ description={t('recover identity description', { ns: meta.id })}
90
+ >
91
+ <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
92
+ {t('recover identity label')}
93
+ </Button>
94
+ </ControlItem>
95
+ <ControlItem
96
+ title={t('join new identity label')}
97
+ description={t('join new identity description', { ns: meta.id })}
98
+ >
99
+ <Button variant='destructive' onClick={handleJoinNewIdentity} data-testid='devicesContainer.joinExisting'>
100
+ {t('join new identity label')}
101
+ </Button>
102
+ </ControlItem>
103
+ </ControlGroup>
104
+ </ControlSection>
105
+ </ControlPage>
120
106
  </Clipboard.Provider>
121
107
  );
122
108
  };
@@ -191,7 +177,7 @@ const InvitationSection = ({
191
177
  onInvitationDone = () => {},
192
178
  onInvitationCreate = () => {},
193
179
  }: InvitationComponentProps) => {
194
- const { t } = useTranslation(CLIENT_PLUGIN);
180
+ const { t } = useTranslation(meta.id);
195
181
  const activeView =
196
182
  state < 0
197
183
  ? 'init'
@@ -233,12 +219,12 @@ const InvitationSection = ({
233
219
  };
234
220
 
235
221
  const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {
236
- const { t } = useTranslation('os');
222
+ const { t } = useTranslation(osTranslations);
237
223
  const qrLabel = useId('devices-container__qr-code');
238
224
  const emoji = hexToEmoji(id);
239
225
  return (
240
226
  <>
241
- <p className='text-description'>{t('qr code description', { ns: CLIENT_PLUGIN })}</p>
227
+ <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>
242
228
  <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>
243
229
  <div role='none' className='is-full aspect-square relative text-description'>
244
230
  <QR
@@ -273,7 +259,7 @@ const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel
273
259
  };
274
260
 
275
261
  const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {
276
- const { t } = useTranslation('os');
262
+ const { t } = useTranslation(osTranslations);
277
263
  const emoji = hexToEmoji(id);
278
264
 
279
265
  return (
@@ -290,5 +276,9 @@ const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string;
290
276
  };
291
277
 
292
278
  const InvitationComplete = ({ statusValue }: { statusValue: number }) => {
293
- return statusValue > 0 ? <Check className={mx('m-1.5', getSize(6))} /> : <X className={mx('m-1.5', getSize(6))} />;
279
+ return statusValue > 0 ? (
280
+ <Icon icon='ph--check--regular' size={6} classNames='m-1.5' />
281
+ ) : (
282
+ <Icon icon='ph--x--regular' size={6} classNames='m-1.5' />
283
+ );
294
284
  };
@@ -4,42 +4,40 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
- import { ObservabilityAction } from '@dxos/plugin-observability/types';
7
+ import { Common } from '@dxos/app-framework';
8
+ import { useOperationInvoker } from '@dxos/app-framework/react';
9
+ import { ObservabilityOperation } from '@dxos/plugin-observability/types';
9
10
  import { type InvitationResult } from '@dxos/react-client/invitations';
10
11
  import { Dialog, useTranslation } from '@dxos/react-ui';
11
12
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
13
+ import { osTranslations } from '@dxos/ui-theme';
12
14
 
13
- import { CLIENT_PLUGIN } from '../meta';
14
- import { ClientAction } from '../types';
15
-
16
- export const JOIN_DIALOG = `${CLIENT_PLUGIN}/JoinDialog`;
15
+ import { meta } from '../meta';
16
+ import { ClientOperation } from '../types';
17
17
 
18
18
  export const JoinDialog = (props: JoinPanelProps) => {
19
- const { dispatchPromise: dispatch } = useIntentDispatcher();
20
- const { t } = useTranslation(CLIENT_PLUGIN);
19
+ const { invokePromise } = useOperationInvoker();
20
+ const { t } = useTranslation(meta.id);
21
21
 
22
- const handleCancelResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ShareIdentity)), [dispatch]);
22
+ const handleCancelResetStorage = useCallback(() => invokePromise(ClientOperation.ShareIdentity), [invokePromise]);
23
23
 
24
24
  const handleDone = useCallback(
25
25
  async (result: InvitationResult | null) => {
26
26
  if (result?.identityKey) {
27
27
  await Promise.all([
28
- dispatch(createIntent(LayoutAction.UpdateDialog, { part: 'dialog', options: { state: false } })),
29
- dispatch(
30
- createIntent(ObservabilityAction.SendEvent, {
31
- name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
32
- }),
33
- ),
28
+ invokePromise(Common.LayoutOperation.UpdateDialog, { state: false }),
29
+ invokePromise(ObservabilityOperation.SendEvent, {
30
+ name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
31
+ }),
34
32
  ]);
35
33
  }
36
34
  },
37
- [dispatch],
35
+ [invokePromise],
38
36
  );
39
37
 
40
38
  return (
41
39
  <Dialog.Content>
42
- <Dialog.Title classNames='sr-only'>{t('join space label', { ns: 'os' })}</Dialog.Title>
40
+ <Dialog.Title classNames='sr-only'>{t('join space label', { ns: osTranslations })}</Dialog.Title>
43
41
  <JoinPanel
44
42
  mode='halo-only'
45
43
  {...props}
@@ -2,28 +2,27 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
7
  import { withClientProvider } from '@dxos/react-client/testing';
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
- import { ProfileContainer } from './ProfileContainer';
13
10
  import { translations } from '../translations';
14
11
 
15
- const meta: Meta = {
12
+ import { ProfileContainer } from './ProfileContainer';
13
+
14
+ const meta = {
16
15
  title: 'plugins/plugin-client/ProfileContainer',
17
16
  component: ProfileContainer,
18
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
19
18
  parameters: {
20
19
  layout: 'fullscreen',
21
20
  translations,
22
21
  },
23
- };
22
+ } satisfies Meta<typeof ProfileContainer>;
24
23
 
25
24
  export default meta;
26
25
 
27
- type Story = StoryObj<typeof ProfileContainer>;
26
+ type Story = StoryObj<typeof meta>;
28
27
 
29
28
  export const Default: Story = {};
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
7
 
8
8
  import { debounce } from '@dxos/async';
@@ -10,27 +10,38 @@ import { useClient } from '@dxos/react-client';
10
10
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
11
11
  import { ButtonGroup, Clipboard, Input, useTranslation } from '@dxos/react-ui';
12
12
  import {
13
- Form,
14
- type InputComponent,
15
13
  ControlItem,
16
14
  ControlItemInput,
17
- ControlSection,
18
15
  ControlPage,
16
+ ControlSection,
17
+ Form,
18
+ type FormFieldMap,
19
+ type FormUpdateMeta,
19
20
  } from '@dxos/react-ui-form';
20
21
  import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
21
- import { StackItem } from '@dxos/react-ui-stack';
22
- import { hexToHue, hexToEmoji } from '@dxos/util';
22
+ import { hexToEmoji, hexToHue } from '@dxos/util';
23
+
24
+ import { meta } from '../meta';
25
+
26
+ // TOOD(burdon): Factor out?
27
+ // TODO(wittjosiah): Integrate annotations with translations.
28
+ const UserProfile = Schema.Struct({
29
+ did: Schema.String.annotations({ title: 'DID' }),
30
+ displayName: Schema.String.annotations({ title: 'Display name' }),
31
+ emoji: Schema.String.annotations({ title: 'Avatar' }),
32
+ hue: Schema.String.annotations({ title: 'Color' }),
33
+ });
23
34
 
24
- import { CLIENT_PLUGIN } from '../meta';
35
+ type UserProfile = Schema.Schema.Type<typeof UserProfile>;
25
36
 
26
37
  // TODO(thure): Factor out?
27
38
  const getDefaultHueValue = (identity: Identity | null) => hexToHue(identity?.identityKey.toHex() ?? '0');
28
- const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
29
39
  const getHueValue = (identity: Identity | null) => identity?.profile?.data?.hue || getDefaultHueValue(identity);
40
+ const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
30
41
  const getEmojiValue = (identity: Identity | null) => identity?.profile?.data?.emoji || getDefaultEmojiValue(identity);
31
42
 
32
43
  export const ProfileContainer = () => {
33
- const { t } = useTranslation(CLIENT_PLUGIN);
44
+ const { t } = useTranslation(meta.id);
34
45
  const client = useClient();
35
46
  const identity = useIdentity();
36
47
  const [displayName, setDisplayNameDirectly] = useState(identity?.profile?.displayName ?? '');
@@ -40,7 +51,7 @@ export const ProfileContainer = () => {
40
51
  const updateProfile = useMemo(
41
52
  () =>
42
53
  debounce(
43
- (profile: Partial<Profile>) =>
54
+ (profile: Partial<UserProfile>) =>
44
55
  client.halo.updateProfile({
45
56
  displayName: profile.displayName,
46
57
  data: {
@@ -53,34 +64,50 @@ export const ProfileContainer = () => {
53
64
  [],
54
65
  );
55
66
 
56
- const handleSave = useCallback(
57
- (profile: Profile) => {
58
- setDisplayNameDirectly(profile.displayName);
59
- setEmojiDirectly(profile.emoji);
60
- setHueDirectly(profile.hue);
61
- updateProfile(profile);
67
+ const handleChange = useCallback(
68
+ (profile: Partial<UserProfile>, meta: FormUpdateMeta<UserProfile>) => {
69
+ for (const [path, changed] of Object.entries(meta.changed)) {
70
+ if (changed) {
71
+ switch (path) {
72
+ case 'displayName':
73
+ setDisplayNameDirectly(profile.displayName ?? '');
74
+ break;
75
+ case 'emoji':
76
+ setEmojiDirectly(profile.emoji ?? getDefaultEmojiValue(identity));
77
+ break;
78
+ case 'hue':
79
+ setHueDirectly(profile.hue ?? getDefaultHueValue(identity));
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ }
86
+
87
+ void updateProfile(profile);
62
88
  },
63
89
  [identity],
64
90
  );
65
91
 
66
92
  const values = useMemo(
67
93
  () => ({
94
+ did: identity?.did,
68
95
  displayName,
69
96
  emoji,
70
97
  hue,
71
- did: identity?.did,
72
98
  }),
73
99
  [identity, displayName, emoji, hue],
74
100
  );
75
101
 
76
102
  // TODO(wittjosiah): Integrate descriptions with the form schema.
77
- const customElements: Partial<Record<string, InputComponent>> = useMemo(
103
+ const fieldMap = useMemo<FormFieldMap>(
78
104
  () => ({
79
105
  displayName: ({ type, label, getValue, onValueChange }) => {
80
106
  const handleChange = useCallback(
81
107
  ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
82
108
  [onValueChange, type],
83
109
  );
110
+
84
111
  return (
85
112
  <ControlItemInput title={label} description={t('display name description')}>
86
113
  <Input.TextInput
@@ -98,6 +125,7 @@ export const ProfileContainer = () => {
98
125
  () => onValueChange(type, getDefaultEmojiValue(identity)),
99
126
  [onValueChange, type],
100
127
  );
128
+
101
129
  return (
102
130
  <ControlItem title={label} description={t('icon description')}>
103
131
  <EmojiPickerBlock
@@ -116,14 +144,12 @@ export const ProfileContainer = () => {
116
144
  () => onValueChange(type, getDefaultHueValue(identity)),
117
145
  [onValueChange, type],
118
146
  );
147
+
119
148
  return (
120
149
  <ControlItem title={label} description={t('hue description')}>
121
- <HuePicker
122
- value={getValue()}
123
- onChange={handleChange}
124
- onReset={handleHueReset}
125
- classNames='[--hue-preview-size:1.5rem] justify-self-end'
126
- />
150
+ <div role='none' className='flex justify-self-end'>
151
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
152
+ </div>
127
153
  </ControlItem>
128
154
  );
129
155
  },
@@ -143,31 +169,16 @@ export const ProfileContainer = () => {
143
169
  );
144
170
 
145
171
  return (
146
- <StackItem.Content classNames='block overflow-y-auto'>
147
- <ControlPage>
148
- <Clipboard.Provider>
149
- <ControlSection title={t('profile label')} description={t('profile description')}>
150
- <Form
151
- schema={ProfileSchema}
152
- values={values}
153
- autoSave
154
- onSave={handleSave}
155
- Custom={customElements}
156
- classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4'
157
- outerSpacing={false}
158
- />
159
- </ControlSection>
160
- </Clipboard.Provider>
161
- </ControlPage>
162
- </StackItem.Content>
172
+ <ControlPage>
173
+ <Clipboard.Provider>
174
+ <ControlSection title={t('profile label')} description={t('profile description')}>
175
+ <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>
176
+ <Form.Content>
177
+ <Form.FieldSet classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]' />
178
+ </Form.Content>
179
+ </Form.Root>
180
+ </ControlSection>
181
+ </Clipboard.Provider>
182
+ </ControlPage>
163
183
  );
164
184
  };
165
-
166
- // TODO(wittjosiah): Integrate annotations with translations.
167
- const ProfileSchema = Schema.Struct({
168
- displayName: Schema.String.annotations({ title: 'Display name' }),
169
- emoji: Schema.String.annotations({ title: 'Avatar' }),
170
- hue: Schema.String.annotations({ title: 'Color' }),
171
- did: Schema.String.annotations({ title: 'DID' }),
172
- });
173
- type Profile = Schema.Schema.Type<typeof ProfileSchema>;
@@ -2,19 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useState } from 'react';
9
7
 
10
8
  import { useClient } from '@dxos/react-client';
11
9
  import { withClientProvider } from '@dxos/react-client/testing';
12
10
  import { AlertDialog, useAsyncEffect } from '@dxos/react-ui';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
- import { RecoveryCodeDialog, type RecoveryCodeDialogProps } from './RecoveryCodeDialog';
16
13
  import { translations } from '../translations';
17
14
 
15
+ import { RecoveryCodeDialog } from './RecoveryCodeDialog';
16
+
18
17
  const DefaultStory = () => {
19
18
  const client = useClient();
20
19
  const [recoveryCode, setRecoveryCode] = useState<string>();
@@ -32,19 +31,19 @@ const DefaultStory = () => {
32
31
  );
33
32
  };
34
33
 
35
- const meta: Meta<RecoveryCodeDialogProps> = {
34
+ const meta = {
36
35
  title: 'plugins/plugin-client/RecoveryCodeDialog',
37
- component: RecoveryCodeDialog,
36
+ component: RecoveryCodeDialog as any,
38
37
  render: DefaultStory,
39
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
38
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
40
39
  parameters: {
41
40
  layout: 'fullscreen',
42
41
  translations,
43
42
  },
44
- };
43
+ } satisfies Meta<typeof DefaultStory>;
45
44
 
46
45
  export default meta;
47
46
 
48
- type Story = StoryObj<RecoveryCodeDialogProps>;
47
+ type Story = StoryObj<typeof meta>;
49
48
 
50
49
  export const Default: Story = {};
@@ -6,16 +6,14 @@ import React, { useCallback, useState } from 'react';
6
6
 
7
7
  import { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { CLIENT_PLUGIN } from '../meta';
10
-
11
- export const RECOVERY_CODE_DIALOG = `${CLIENT_PLUGIN}/RecoveryCodeDialog`;
9
+ import { meta } from '../meta';
12
10
 
13
11
  export type RecoveryCodeDialogProps = {
14
12
  code: string;
15
13
  };
16
14
 
17
15
  export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
18
- const { t } = useTranslation(CLIENT_PLUGIN);
16
+ const { t } = useTranslation(meta.id);
19
17
  const [confirmation, setConfirmation] = useState(false);
20
18
 
21
19
  const handleConfirmation = useCallback((checked: boolean) => setConfirmation(checked), []);
@@ -23,11 +21,11 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
23
21
  return (
24
22
  <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
25
23
  <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
26
- <p className='py-4'>{t('recovery code dialog description')}</p>
24
+ <p className='plb-4'>{t('recovery code dialog description')}</p>
27
25
  <Clipboard.Provider>
28
26
  <Code code={code} />
29
27
  </Clipboard.Provider>
30
- <div className='flex flex-col py-4 gap-2'>
28
+ <div className='flex flex-col plb-4 gap-2'>
31
29
  <p>{t('recovery code dialog warning 1')}</p>
32
30
  <p>{t('recovery code dialog warning 2')}</p>
33
31
  </div>
@@ -60,7 +58,7 @@ const Code = ({ code }: { code: string }) => {
60
58
  <div className='grid grid-cols-4'>
61
59
  {words.map((word, i) => (
62
60
  <div key={i} className='flex items-center p-2 gap-2'>
63
- <div className='w-4 text-xs text-center text-subdued'>{i + 1}</div>
61
+ <div className='is-4 text-xs text-center text-subdued'>{i + 1}</div>
64
62
  <div className='text-sm'>{word}</div>
65
63
  </div>
66
64
  ))}