@dxos/plugin-client 0.8.4-main.3f58842 → 0.8.4-main.52d7546f51

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 (400) hide show
  1. package/dist/lib/browser/app-graph-builder-DTETNB5U.mjs +119 -0
  2. package/dist/lib/browser/app-graph-builder-DTETNB5U.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-G7C3S2BE.mjs +15 -0
  6. package/dist/lib/browser/chunk-G7C3S2BE.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-MY6BJCB6.mjs +18 -0
  8. package/dist/lib/browser/chunk-MY6BJCB6.mjs.map +7 -0
  9. package/dist/lib/browser/cli/index.mjs +1049 -0
  10. package/dist/lib/browser/cli/index.mjs.map +7 -0
  11. package/dist/lib/browser/client-XOQQ5POJ.mjs +86 -0
  12. package/dist/lib/browser/client-XOQQ5POJ.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +77 -82
  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-YNQ7L5GT.mjs +24 -0
  17. package/dist/lib/browser/migrations-YNQ7L5GT.mjs.map +7 -0
  18. package/dist/lib/browser/operation-resolver-N4YCJ4KS.mjs +299 -0
  19. package/dist/lib/browser/operation-resolver-N4YCJ4KS.mjs.map +7 -0
  20. package/dist/lib/browser/react-context-FDXHIBZL.mjs +24 -0
  21. package/dist/lib/browser/react-context-FDXHIBZL.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-ZP3FLVRS.mjs +676 -0
  23. package/dist/lib/browser/react-surface-ZP3FLVRS.mjs.map +7 -0
  24. package/dist/lib/browser/schema-defs-AYXOYD2M.mjs +27 -0
  25. package/dist/lib/browser/schema-defs-AYXOYD2M.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +9 -4
  27. package/dist/lib/node-esm/app-graph-builder-PFKVFRXI.mjs +120 -0
  28. package/dist/lib/node-esm/app-graph-builder-PFKVFRXI.mjs.map +7 -0
  29. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs +295 -0
  30. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-MUOMX53G.mjs +20 -0
  32. package/dist/lib/node-esm/chunk-MUOMX53G.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 +1050 -0
  36. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  37. package/dist/lib/node-esm/client-3YIMWKR7.mjs +87 -0
  38. package/dist/lib/node-esm/client-3YIMWKR7.mjs.map +7 -0
  39. package/dist/lib/node-esm/index.mjs +77 -82
  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-ZH5GNG4U.mjs +25 -0
  43. package/dist/lib/node-esm/migrations-ZH5GNG4U.mjs.map +7 -0
  44. package/dist/lib/node-esm/operation-resolver-CHGWI5P2.mjs +300 -0
  45. package/dist/lib/node-esm/operation-resolver-CHGWI5P2.mjs.map +7 -0
  46. package/dist/lib/node-esm/react-context-7Z2TVUTV.mjs +25 -0
  47. package/dist/lib/node-esm/react-context-7Z2TVUTV.mjs.map +7 -0
  48. package/dist/lib/node-esm/react-surface-BHJMHIMH.mjs +677 -0
  49. package/dist/lib/node-esm/react-surface-BHJMHIMH.mjs.map +7 -0
  50. package/dist/lib/node-esm/schema-defs-TV2SCKSH.mjs +28 -0
  51. package/dist/lib/node-esm/schema-defs-TV2SCKSH.mjs.map +7 -0
  52. package/dist/lib/node-esm/types/index.mjs +9 -4
  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 +18 -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 +2 -0
  230. package/dist/types/src/types/index.d.ts.map +1 -1
  231. package/dist/types/src/types/schema.d.ts +168 -8
  232. package/dist/types/src/types/schema.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +56 -39
  235. package/src/ClientPlugin.ts +41 -60
  236. package/src/capabilities/app-graph-builder/app-graph-builder.ts +96 -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 +249 -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 +75 -0
  249. package/src/capabilities/schema-defs/index.ts +7 -0
  250. package/src/capabilities/schema-defs/schema-defs.ts +36 -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 +34 -0
  306. package/src/cli/testing/test-console.ts +88 -0
  307. package/src/components/DevicesContainer.stories.tsx +16 -15
  308. package/src/components/DevicesContainer.tsx +67 -89
  309. package/src/components/JoinDialog.tsx +15 -17
  310. package/src/components/ProfileContainer.stories.tsx +8 -9
  311. package/src/components/ProfileContainer.tsx +66 -63
  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 +49 -54
  316. package/src/components/ResetDialog.stories.tsx +37 -18
  317. package/src/components/ResetDialog.tsx +26 -22
  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 +6 -3
  322. package/src/types/capabilities.ts +16 -0
  323. package/src/types/events.ts +15 -0
  324. package/src/types/index.ts +2 -0
  325. package/src/types/schema.ts +121 -8
  326. package/dist/lib/browser/app-graph-builder-JNIES5L4.mjs +0 -123
  327. package/dist/lib/browser/app-graph-builder-JNIES5L4.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-3F2Q2RKC.mjs +0 -18
  329. package/dist/lib/browser/chunk-3F2Q2RKC.mjs.map +0 -7
  330. package/dist/lib/browser/chunk-CAF2COXW.mjs +0 -19
  331. package/dist/lib/browser/chunk-CAF2COXW.mjs.map +0 -7
  332. package/dist/lib/browser/chunk-GS3LDHYD.mjs +0 -12
  333. package/dist/lib/browser/chunk-GS3LDHYD.mjs.map +0 -7
  334. package/dist/lib/browser/chunk-RMHBOY3Y.mjs +0 -110
  335. package/dist/lib/browser/chunk-RMHBOY3Y.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-SV3MHIKI.mjs +0 -695
  337. package/dist/lib/browser/chunk-SV3MHIKI.mjs.map +0 -7
  338. package/dist/lib/browser/client-SKVKXPLY.mjs +0 -37
  339. package/dist/lib/browser/client-SKVKXPLY.mjs.map +0 -7
  340. package/dist/lib/browser/intent-resolver-LNPLD5CA.mjs +0 -305
  341. package/dist/lib/browser/intent-resolver-LNPLD5CA.mjs.map +0 -7
  342. package/dist/lib/browser/migrations-D76RCG72.mjs +0 -23
  343. package/dist/lib/browser/migrations-D76RCG72.mjs.map +0 -7
  344. package/dist/lib/browser/react-context-YWVPZUMU.mjs +0 -24
  345. package/dist/lib/browser/react-context-YWVPZUMU.mjs.map +0 -7
  346. package/dist/lib/browser/react-surface-QFZTDNLS.mjs +0 -66
  347. package/dist/lib/browser/react-surface-QFZTDNLS.mjs.map +0 -7
  348. package/dist/lib/browser/schema-defs-HKW6VNZB.mjs +0 -25
  349. package/dist/lib/browser/schema-defs-HKW6VNZB.mjs.map +0 -7
  350. package/dist/lib/node-esm/app-graph-builder-SWFB4FID.mjs +0 -124
  351. package/dist/lib/node-esm/app-graph-builder-SWFB4FID.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-5V3RCXZV.mjs +0 -111
  353. package/dist/lib/node-esm/chunk-5V3RCXZV.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-FBYODKEL.mjs +0 -696
  355. package/dist/lib/node-esm/chunk-FBYODKEL.mjs.map +0 -7
  356. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs +0 -19
  357. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs.map +0 -7
  358. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs +0 -14
  359. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs.map +0 -7
  360. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs +0 -20
  361. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs.map +0 -7
  362. package/dist/lib/node-esm/client-SLL6GDC2.mjs +0 -38
  363. package/dist/lib/node-esm/client-SLL6GDC2.mjs.map +0 -7
  364. package/dist/lib/node-esm/intent-resolver-L7C6YRWV.mjs +0 -306
  365. package/dist/lib/node-esm/intent-resolver-L7C6YRWV.mjs.map +0 -7
  366. package/dist/lib/node-esm/migrations-YISDI7LF.mjs +0 -24
  367. package/dist/lib/node-esm/migrations-YISDI7LF.mjs.map +0 -7
  368. package/dist/lib/node-esm/react-context-EEHS4S3L.mjs +0 -25
  369. package/dist/lib/node-esm/react-context-EEHS4S3L.mjs.map +0 -7
  370. package/dist/lib/node-esm/react-surface-2K6W37R4.mjs +0 -67
  371. package/dist/lib/node-esm/react-surface-2K6W37R4.mjs.map +0 -7
  372. package/dist/lib/node-esm/schema-defs-5ZNI63RW.mjs +0 -26
  373. package/dist/lib/node-esm/schema-defs-5ZNI63RW.mjs.map +0 -7
  374. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  375. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/capabilities.d.ts +0 -9
  377. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/client.d.ts +0 -9
  379. package/dist/types/src/capabilities/client.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -8
  381. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/migrations.d.ts +0 -4
  383. package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/react-context.d.ts +0 -8
  385. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/react-surface.d.ts +0 -8
  387. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  388. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  389. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  390. package/dist/types/src/events.d.ts +0 -8
  391. package/dist/types/src/events.d.ts.map +0 -1
  392. package/src/capabilities/app-graph-builder.ts +0 -113
  393. package/src/capabilities/capabilities.ts +0 -18
  394. package/src/capabilities/client.ts +0 -41
  395. package/src/capabilities/intent-resolver.ts +0 -250
  396. package/src/capabilities/migrations.ts +0 -25
  397. package/src/capabilities/react-context.tsx +0 -20
  398. package/src/capabilities/react-surface.tsx +0 -67
  399. package/src/capabilities/schema-defs.ts +0 -29
  400. package/src/events.ts +0 -15
@@ -5,116 +5,94 @@
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
  import { QR } from 'react-qr-rounded';
7
7
 
8
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
9
9
  import { log } from '@dxos/log';
10
10
  import { useClient, useMulticastObservable } from '@dxos/react-client';
11
11
  import { type Device, useDevices } from '@dxos/react-client/halo';
12
12
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
13
13
  import { useNetworkStatus } from '@dxos/react-client/mesh';
14
- import { Button, Clipboard, IconButton, List, useId, useTranslation, Icon } from '@dxos/react-ui';
15
- import {
16
- ControlFrame,
17
- ControlFrameItem,
18
- ControlGroup,
19
- ControlItem,
20
- ControlPage,
21
- ControlSection,
22
- } from '@dxos/react-ui-form';
23
- import { StackItem } from '@dxos/react-ui-stack';
24
- import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';
14
+ import { Button, Clipboard, Icon, IconButton, List, useId, useTranslation } from '@dxos/react-ui';
15
+ import { Settings } from '@dxos/react-ui-form';
16
+ import { AuthCode, Centered, DeviceListItem, Emoji, Viewport, translationKey } from '@dxos/shell/react';
17
+ import { osTranslations } from '@dxos/ui-theme';
25
18
  import { hexToEmoji } from '@dxos/util';
26
19
 
27
- import { CLIENT_PLUGIN } from '../meta';
28
- import { ClientAction } from '../types';
20
+ import { meta } from '../meta';
21
+ import { ClientOperation } from '../types';
29
22
 
30
23
  export type DevicesContainerProps = {
31
24
  createInvitationUrl?: (invitationCode: string) => string;
32
25
  };
33
26
 
34
27
  export const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps) => {
35
- const { t } = useTranslation('os');
36
- const { dispatchPromise: dispatch } = useIntentDispatcher();
28
+ const { t } = useTranslation(translationKey);
29
+ const { invokePromise } = useOperationInvoker();
37
30
  const devices = useDevices();
38
31
  const { swarm: connectionState } = useNetworkStatus();
39
32
 
40
- const handleResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ResetStorage)), [dispatch]);
33
+ const handleResetStorage = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);
41
34
 
42
35
  const handleRecover = useCallback(
43
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'recover' })),
44
- [dispatch],
36
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),
37
+ [invokePromise],
45
38
  );
46
39
 
47
40
  const handleJoinNewIdentity = useCallback(
48
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'join new identity' })),
49
- [dispatch],
41
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'join new identity' }),
42
+ [invokePromise],
50
43
  );
51
44
 
52
45
  return (
53
46
  <Clipboard.Provider>
54
- <StackItem.Content classNames='block overflow-y-auto'>
55
- <ControlPage>
56
- <ControlSection
57
- title={t('devices verbose label', { ns: CLIENT_PLUGIN })}
58
- description={t('devices description', { ns: CLIENT_PLUGIN })}
59
- >
60
- <ControlFrame>
61
- <ControlFrameItem title={t('devices label', { ns: CLIENT_PLUGIN })}>
62
- <List>
63
- {devices.map((device: Device) => {
64
- return (
65
- <DeviceListItem
66
- key={device.deviceKey.toHex()}
67
- device={device}
68
- connectionState={connectionState}
69
- />
70
- );
71
- })}
72
- </List>
73
- </ControlFrameItem>
74
- {createInvitationUrl && (
75
- <ControlFrameItem title='Add device'>
76
- <DeviceInvitation createInvitationUrl={createInvitationUrl} />
77
- </ControlFrameItem>
78
- )}
79
- </ControlFrame>
80
- </ControlSection>
81
- <ControlSection
82
- title={t('danger zone title', { ns: CLIENT_PLUGIN })}
83
- description={t('danger zone description', { ns: CLIENT_PLUGIN })}
84
- >
85
- <ControlGroup>
86
- <ControlItem
87
- title={t('reset device label')}
88
- description={t('reset device description', { ns: CLIENT_PLUGIN })}
89
- >
90
- <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
91
- {t('reset device label')}
92
- </Button>
93
- </ControlItem>
94
- <ControlItem
95
- title={t('recover identity label')}
96
- description={t('recover identity description', { ns: CLIENT_PLUGIN })}
97
- >
98
- <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
99
- {t('recover identity label')}
100
- </Button>
101
- </ControlItem>
102
- <ControlItem
103
- title={t('join new identity label')}
104
- description={t('join new identity description', { ns: CLIENT_PLUGIN })}
105
- >
106
- <Button
107
- variant='destructive'
108
- onClick={handleJoinNewIdentity}
109
- data-testid='devicesContainer.joinExisting'
110
- >
111
- {t('join new identity label')}
112
- </Button>
113
- </ControlItem>
114
- </ControlGroup>
115
- </ControlSection>
116
- </ControlPage>
117
- </StackItem.Content>
47
+ <Settings.Root>
48
+ <Settings.Section
49
+ title={t('devices verbose label', { ns: meta.id })}
50
+ description={t('devices description', { ns: meta.id })}
51
+ >
52
+ <Settings.Frame>
53
+ <Settings.FrameItem title={t('devices label', { ns: meta.id })}>
54
+ <List>
55
+ {devices.map((device: Device) => (
56
+ <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />
57
+ ))}
58
+ </List>
59
+ </Settings.FrameItem>
60
+ {createInvitationUrl && (
61
+ <Settings.FrameItem title='Add device'>
62
+ <DeviceInvitation createInvitationUrl={createInvitationUrl} />
63
+ </Settings.FrameItem>
64
+ )}
65
+ </Settings.Frame>
66
+ </Settings.Section>
67
+ <Settings.Section
68
+ title={t('danger zone title', { ns: meta.id })}
69
+ description={t('danger zone description', { ns: meta.id })}
70
+ >
71
+ <Settings.Group>
72
+ <Settings.Item title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>
73
+ <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
74
+ {t('reset device label')}
75
+ </Button>
76
+ </Settings.Item>
77
+ <Settings.Item
78
+ title={t('recover identity label')}
79
+ description={t('recover identity description', { ns: meta.id })}
80
+ >
81
+ <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
82
+ {t('recover identity label')}
83
+ </Button>
84
+ </Settings.Item>
85
+ <Settings.Item
86
+ title={t('join new identity label')}
87
+ description={t('join new identity description', { ns: meta.id })}
88
+ >
89
+ <Button variant='destructive' onClick={handleJoinNewIdentity} data-testid='devicesContainer.joinExisting'>
90
+ {t('join new identity label')}
91
+ </Button>
92
+ </Settings.Item>
93
+ </Settings.Group>
94
+ </Settings.Section>
95
+ </Settings.Root>
118
96
  </Clipboard.Provider>
119
97
  );
120
98
  };
@@ -189,7 +167,7 @@ const InvitationSection = ({
189
167
  onInvitationDone = () => {},
190
168
  onInvitationCreate = () => {},
191
169
  }: InvitationComponentProps) => {
192
- const { t } = useTranslation(CLIENT_PLUGIN);
170
+ const { t } = useTranslation(meta.id);
193
171
  const activeView =
194
172
  state < 0
195
173
  ? 'init'
@@ -231,12 +209,12 @@ const InvitationSection = ({
231
209
  };
232
210
 
233
211
  const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {
234
- const { t } = useTranslation('os');
212
+ const { t } = useTranslation(osTranslations);
235
213
  const qrLabel = useId('devices-container__qr-code');
236
214
  const emoji = hexToEmoji(id);
237
215
  return (
238
216
  <>
239
- <p className='text-description'>{t('qr code description', { ns: CLIENT_PLUGIN })}</p>
217
+ <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>
240
218
  <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>
241
219
  <div role='none' className='is-full aspect-square relative text-description'>
242
220
  <QR
@@ -271,7 +249,7 @@ const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel
271
249
  };
272
250
 
273
251
  const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {
274
- const { t } = useTranslation('os');
252
+ const { t } = useTranslation(osTranslations);
275
253
  const emoji = hexToEmoji(id);
276
254
 
277
255
  return (
@@ -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 { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { LayoutOperation } from '@dxos/app-toolkit';
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(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,35 +2,38 @@
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';
9
9
  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
- import {
13
- Form,
14
- type InputComponent,
15
- ControlItem,
16
- ControlItemInput,
17
- ControlSection,
18
- ControlPage,
19
- } from '@dxos/react-ui-form';
12
+ import { Form, type FormFieldMap, type FormUpdateMeta, Settings } from '@dxos/react-ui-form';
20
13
  import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
21
- import { StackItem } from '@dxos/react-ui-stack';
22
- import { hexToHue, hexToEmoji } from '@dxos/util';
14
+ import { hexToEmoji, hexToHue } from '@dxos/util';
23
15
 
24
- import { CLIENT_PLUGIN } from '../meta';
16
+ import { meta } from '../meta';
17
+
18
+ // TOOD(burdon): Factor out?
19
+ // TODO(wittjosiah): Integrate annotations with translations.
20
+ const UserProfile = Schema.Struct({
21
+ did: Schema.String.annotations({ title: 'DID' }),
22
+ displayName: Schema.String.annotations({ title: 'Display name' }),
23
+ emoji: Schema.String.annotations({ title: 'Avatar' }),
24
+ hue: Schema.String.annotations({ title: 'Color' }),
25
+ });
26
+
27
+ type UserProfile = Schema.Schema.Type<typeof UserProfile>;
25
28
 
26
29
  // TODO(thure): Factor out?
27
30
  const getDefaultHueValue = (identity: Identity | null) => hexToHue(identity?.identityKey.toHex() ?? '0');
28
- const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
29
31
  const getHueValue = (identity: Identity | null) => identity?.profile?.data?.hue || getDefaultHueValue(identity);
32
+ const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
30
33
  const getEmojiValue = (identity: Identity | null) => identity?.profile?.data?.emoji || getDefaultEmojiValue(identity);
31
34
 
32
35
  export const ProfileContainer = () => {
33
- const { t } = useTranslation(CLIENT_PLUGIN);
36
+ const { t } = useTranslation(meta.id);
34
37
  const client = useClient();
35
38
  const identity = useIdentity();
36
39
  const [displayName, setDisplayNameDirectly] = useState(identity?.profile?.displayName ?? '');
@@ -40,7 +43,7 @@ export const ProfileContainer = () => {
40
43
  const updateProfile = useMemo(
41
44
  () =>
42
45
  debounce(
43
- (profile: Partial<Profile>) =>
46
+ (profile: Partial<UserProfile>) =>
44
47
  client.halo.updateProfile({
45
48
  displayName: profile.displayName,
46
49
  data: {
@@ -53,11 +56,26 @@ export const ProfileContainer = () => {
53
56
  [],
54
57
  );
55
58
 
56
- const handleSave = useCallback(
57
- (profile: Profile) => {
58
- setDisplayNameDirectly(profile.displayName);
59
- setEmojiDirectly(profile.emoji);
60
- setHueDirectly(profile.hue);
59
+ const handleChange = useCallback(
60
+ (profile: Partial<UserProfile>, meta: FormUpdateMeta<UserProfile>) => {
61
+ for (const [path, changed] of Object.entries(meta.changed)) {
62
+ if (changed) {
63
+ switch (path) {
64
+ case 'displayName':
65
+ setDisplayNameDirectly(profile.displayName ?? '');
66
+ break;
67
+ case 'emoji':
68
+ setEmojiDirectly(profile.emoji ?? getDefaultEmojiValue(identity));
69
+ break;
70
+ case 'hue':
71
+ setHueDirectly(profile.hue ?? getDefaultHueValue(identity));
72
+ break;
73
+ default:
74
+ break;
75
+ }
76
+ }
77
+ }
78
+
61
79
  void updateProfile(profile);
62
80
  },
63
81
  [identity],
@@ -65,31 +83,32 @@ export const ProfileContainer = () => {
65
83
 
66
84
  const values = useMemo(
67
85
  () => ({
86
+ did: identity?.did,
68
87
  displayName,
69
88
  emoji,
70
89
  hue,
71
- did: identity?.did,
72
90
  }),
73
91
  [identity, displayName, emoji, hue],
74
92
  );
75
93
 
76
94
  // TODO(wittjosiah): Integrate descriptions with the form schema.
77
- const customElements: Partial<Record<string, InputComponent>> = useMemo(
95
+ const fieldMap = useMemo<FormFieldMap>(
78
96
  () => ({
79
97
  displayName: ({ type, label, getValue, onValueChange }) => {
80
98
  const handleChange = useCallback(
81
99
  ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
82
100
  [onValueChange, type],
83
101
  );
102
+
84
103
  return (
85
- <ControlItemInput title={label} description={t('display name description')}>
104
+ <Settings.ItemInput title={label} description={t('display name description')}>
86
105
  <Input.TextInput
87
106
  value={getValue()}
88
107
  onChange={handleChange}
89
108
  placeholder={t('display name input placeholder')}
90
109
  classNames='min-is-64'
91
110
  />
92
- </ControlItemInput>
111
+ </Settings.ItemInput>
93
112
  );
94
113
  },
95
114
  emoji: ({ type, label, getValue, onValueChange }) => {
@@ -98,8 +117,9 @@ export const ProfileContainer = () => {
98
117
  () => onValueChange(type, getDefaultEmojiValue(identity)),
99
118
  [onValueChange, type],
100
119
  );
120
+
101
121
  return (
102
- <ControlItem title={label} description={t('icon description')}>
122
+ <Settings.Item title={label} description={t('icon description')}>
103
123
  <EmojiPickerBlock
104
124
  triggerVariant='default'
105
125
  emoji={getValue()}
@@ -107,7 +127,7 @@ export const ProfileContainer = () => {
107
127
  onClickClear={handleEmojiReset}
108
128
  classNames='justify-self-end'
109
129
  />
110
- </ControlItem>
130
+ </Settings.Item>
111
131
  );
112
132
  },
113
133
  hue: ({ type, label, getValue, onValueChange }) => {
@@ -116,26 +136,24 @@ export const ProfileContainer = () => {
116
136
  () => onValueChange(type, getDefaultHueValue(identity)),
117
137
  [onValueChange, type],
118
138
  );
139
+
119
140
  return (
120
- <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
- />
127
- </ControlItem>
141
+ <Settings.Item title={label} description={t('hue description')}>
142
+ <div role='none' className='flex justify-self-end'>
143
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
144
+ </div>
145
+ </Settings.Item>
128
146
  );
129
147
  },
130
148
  // TODO(wittjosiah): We need text input annotations for disabled and copyable.
131
149
  did: ({ label, getValue }) => {
132
150
  return (
133
- <ControlItemInput title={label} description={t('did description')}>
134
- <ButtonGroup>
151
+ <Settings.ItemInput title={label} description={t('did description')}>
152
+ <ButtonGroup classNames='is-full'>
135
153
  <Input.TextInput value={getValue()} disabled classNames='min-is-64' />
136
154
  <Clipboard.IconButton value={getValue() ?? ''} />
137
155
  </ButtonGroup>
138
- </ControlItemInput>
156
+ </Settings.ItemInput>
139
157
  );
140
158
  },
141
159
  }),
@@ -143,31 +161,16 @@ export const ProfileContainer = () => {
143
161
  );
144
162
 
145
163
  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>
164
+ <Clipboard.Provider>
165
+ <Settings.Root>
166
+ <Settings.Section title={t('profile label')} description={t('profile description')}>
167
+ <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>
168
+ <Form.Content>
169
+ <Form.FieldSet classNames='space-y-trimMd' />
170
+ </Form.Content>
171
+ </Form.Root>
172
+ </Settings.Section>
173
+ </Settings.Root>
174
+ </Clipboard.Provider>
163
175
  );
164
176
  };
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
  ))}