@dxos/plugin-space 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

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 (389) hide show
  1. package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-WTHWY4YS.mjs} +10 -10
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs +144 -0
  4. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs +144 -0
  6. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs +551 -0
  10. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-SXIQ425K.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-SXIQ425K.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-5CSSKOWR.mjs} +42 -16
  14. package/dist/lib/browser/chunk-5CSSKOWR.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-C6DAPIFF.mjs +20 -0
  16. package/dist/lib/browser/chunk-C6DAPIFF.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-E4BEMEZ3.mjs +399 -0
  18. package/dist/lib/browser/chunk-E4BEMEZ3.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-XUYKJUU7.mjs → chunk-IJCMB5B5.mjs} +269 -145
  20. package/dist/lib/browser/chunk-IJCMB5B5.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-POFUXISV.mjs} +69 -62
  22. package/dist/lib/browser/chunk-POFUXISV.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  24. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  26. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-V7MJSSBQ.mjs → chunk-XKQCDLXX.mjs} +734 -615
  28. package/dist/lib/browser/chunk-XKQCDLXX.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-NAXTPQXE.mjs} +6 -6
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +92 -139
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-TIXVDYN7.mjs → intent-resolver-QEIM7NQT.mjs} +118 -109
  34. package/dist/lib/browser/intent-resolver-QEIM7NQT.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-T6ZETLD2.mjs +30 -0
  37. package/dist/lib/browser/react-root-T6ZETLD2.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-TPNLWJJH.mjs → react-surface-MLN5BZ2G.mjs} +120 -120
  39. package/dist/lib/browser/react-surface-MLN5BZ2G.mjs.map +7 -0
  40. package/dist/lib/browser/repair-CNLE35NF.mjs +44 -0
  41. package/dist/lib/browser/repair-CNLE35NF.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-4IMP5RYT.mjs → settings-EGTCHS7U.mjs} +5 -5
  43. package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-EGTCHS7U.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-YS4BBZXW.mjs} +29 -20
  45. package/dist/lib/browser/spaces-ready-YS4BBZXW.mjs.map +7 -0
  46. package/dist/lib/browser/{state-QYZAB45H.mjs → state-C7N6EDDZ.mjs} +7 -7
  47. package/dist/lib/browser/state-C7N6EDDZ.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +10 -4
  49. package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-KHXYT3SH.mjs} +10 -10
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs +145 -0
  52. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs +552 -0
  58. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-P2X4W7LI.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-P2X4W7LI.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-4AOMYKDE.mjs → chunk-3D4NGZPW.mjs} +269 -145
  62. package/dist/lib/node-esm/chunk-3D4NGZPW.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-P442DOQ3.mjs → chunk-AX3UGL5D.mjs} +69 -62
  64. package/dist/lib/node-esm/chunk-AX3UGL5D.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  66. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  68. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs +400 -0
  70. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-UMZ7G6G4.mjs} +41 -16
  72. package/dist/lib/node-esm/chunk-UMZ7G6G4.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs +21 -0
  74. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-6X5DLJM5.mjs → chunk-XD532BVR.mjs} +734 -615
  76. package/dist/lib/node-esm/chunk-XD532BVR.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-OXLKCJE3.mjs} +6 -6
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +92 -139
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-MHGHRGDT.mjs → intent-resolver-ZWCBVABN.mjs} +118 -109
  82. package/dist/lib/node-esm/intent-resolver-ZWCBVABN.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-KW3TGJGY.mjs → react-root-SKB4UJ4K.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-SKB4UJ4K.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-UUIUUD6P.mjs → react-surface-BVZGNSBB.mjs} +120 -120
  87. package/dist/lib/node-esm/react-surface-BVZGNSBB.mjs.map +7 -0
  88. package/dist/lib/node-esm/repair-EHZS6MFY.mjs +45 -0
  89. package/dist/lib/node-esm/repair-EHZS6MFY.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-SAOBPND3.mjs → settings-N3F6JCIR.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-N3F6JCIR.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-U2K5P4LB.mjs} +29 -20
  93. package/dist/lib/node-esm/spaces-ready-U2K5P4LB.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-ZVEHQ4BJ.mjs → state-45TXZQJ6.mjs} +7 -7
  95. package/dist/lib/node-esm/state-45TXZQJ6.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +10 -4
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  102. package/dist/types/src/capabilities/capabilities.d.ts +14 -8
  103. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  105. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/index.d.ts +11 -12
  107. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  111. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/repair.d.ts +4 -0
  115. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/settings.d.ts +1 -1
  117. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  118. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/state.d.ts +1 -1
  120. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  121. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  122. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  123. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  124. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  125. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -3
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1588 -4
  129. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +18 -9
  131. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  132. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  133. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  134. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  135. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  136. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  137. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  138. package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +3 -2
  139. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1591 -0
  141. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts.map +1 -0
  142. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  143. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  144. package/dist/types/src/components/ObjectCardStack/ObjectCardStack.d.ts +8 -0
  145. package/dist/types/src/components/ObjectCardStack/ObjectCardStack.d.ts.map +1 -0
  146. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts +9 -0
  147. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts.map +1 -0
  148. package/dist/types/src/components/ObjectCardStack/index.d.ts +3 -0
  149. package/dist/types/src/components/ObjectCardStack/index.d.ts.map +1 -0
  150. package/dist/types/src/components/{ObjectSettings → ObjectDetails}/BaseObjectSettings.d.ts +2 -2
  151. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.d.ts.map +1 -0
  152. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts +1424 -0
  153. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts.map +1 -0
  154. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts +8 -0
  155. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts.map +1 -0
  156. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts +8 -0
  157. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts.map +1 -0
  158. package/dist/types/src/components/ObjectDetails/index.d.ts +3 -0
  159. package/dist/types/src/components/ObjectDetails/index.d.ts.map +1 -0
  160. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  161. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  162. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  163. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  164. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  165. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  166. package/dist/types/src/components/RecordArticle.stories.d.ts +1591 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  168. package/dist/types/src/components/SchemaContainer.d.ts +2 -2
  169. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  171. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
  172. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  173. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1421 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  177. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  179. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  181. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +1 -1
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1421 -4
  184. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  186. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1422 -5
  187. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  189. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  190. package/dist/types/src/components/index.d.ts +10 -12
  191. package/dist/types/src/components/index.d.ts.map +1 -1
  192. package/dist/types/src/events.d.ts.map +1 -1
  193. package/dist/types/src/helpers/index.d.ts +2 -0
  194. package/dist/types/src/helpers/index.d.ts.map +1 -0
  195. package/dist/types/src/helpers/query.d.ts +7 -0
  196. package/dist/types/src/helpers/query.d.ts.map +1 -0
  197. package/dist/types/src/helpers/query.test.d.ts +2 -0
  198. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  199. package/dist/types/src/hooks/index.d.ts +1 -0
  200. package/dist/types/src/hooks/index.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  202. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +2 -8
  203. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  204. package/dist/types/src/hooks/usePath.d.ts +1 -1
  205. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  206. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  207. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  208. package/dist/types/src/index.d.ts +1 -0
  209. package/dist/types/src/index.d.ts.map +1 -1
  210. package/dist/types/src/meta.d.ts +0 -1
  211. package/dist/types/src/meta.d.ts.map +1 -1
  212. package/dist/types/src/translations.d.ts +1261 -67
  213. package/dist/types/src/translations.d.ts.map +1 -1
  214. package/dist/types/src/types/form.d.ts +22 -0
  215. package/dist/types/src/types/form.d.ts.map +1 -0
  216. package/dist/types/src/types/index.d.ts +1 -0
  217. package/dist/types/src/types/index.d.ts.map +1 -1
  218. package/dist/types/src/types/types.d.ts +96 -157
  219. package/dist/types/src/types/types.d.ts.map +1 -1
  220. package/dist/types/src/util.d.ts +25 -36
  221. package/dist/types/src/util.d.ts.map +1 -1
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +70 -59
  224. package/src/SpacePlugin.ts +182 -222
  225. package/src/capabilities/app-graph-builder.ts +271 -246
  226. package/src/capabilities/app-graph-serializer.ts +12 -12
  227. package/src/capabilities/capabilities.ts +28 -17
  228. package/src/capabilities/identity-created.ts +3 -3
  229. package/src/capabilities/index.ts +1 -2
  230. package/src/capabilities/intent-resolver.ts +92 -81
  231. package/src/capabilities/react-root.tsx +6 -4
  232. package/src/capabilities/react-surface.tsx +127 -155
  233. package/src/capabilities/repair.ts +57 -0
  234. package/src/capabilities/spaces-ready.ts +38 -17
  235. package/src/capabilities/state.ts +5 -4
  236. package/src/components/AwaitingObject.tsx +12 -14
  237. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  238. package/src/components/CollectionSection.tsx +8 -6
  239. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  240. package/src/components/CreateDialog/CreateObjectDialog.tsx +74 -46
  241. package/src/components/CreateDialog/CreateObjectPanel.tsx +65 -43
  242. package/src/components/CreateDialog/CreateSpaceDialog.tsx +45 -22
  243. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  244. package/src/components/JoinDialog/index.ts +5 -0
  245. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  246. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
  247. package/src/components/MembersContainer/index.ts +5 -0
  248. package/src/components/MenuFooter.tsx +2 -2
  249. package/src/components/ObjectCardStack/ObjectCardStack.tsx +64 -0
  250. package/src/components/ObjectCardStack/ObjectForm.tsx +90 -0
  251. package/src/components/ObjectCardStack/index.ts +7 -0
  252. package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +63 -0
  253. package/src/components/ObjectDetails/BaseObjectSettings.tsx +118 -0
  254. package/src/components/{ObjectSettings → ObjectDetails}/ForeignKeys.tsx +8 -8
  255. package/src/components/ObjectDetails/ObjectDetails.tsx +35 -0
  256. package/src/components/ObjectDetails/index.ts +7 -0
  257. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
  258. package/src/components/ObjectRenamePopover/index.ts +5 -0
  259. package/src/components/RecordArticle.stories.tsx +115 -0
  260. package/src/components/RecordArticle.tsx +114 -0
  261. package/src/components/SchemaContainer.tsx +26 -29
  262. package/src/components/SpacePluginSettings.tsx +16 -11
  263. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
  264. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
  265. package/src/components/SpacePresence/index.ts +5 -0
  266. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  267. package/src/components/SpaceRenamePopover/index.ts +5 -0
  268. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  269. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +190 -155
  270. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  271. package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
  272. package/src/components/SyncStatus/SyncStatus.tsx +109 -12
  273. package/src/components/ViewEditor.tsx +56 -23
  274. package/src/components/index.ts +7 -7
  275. package/src/events.ts +7 -7
  276. package/src/helpers/index.ts +5 -0
  277. package/src/helpers/query.test.ts +24 -0
  278. package/src/helpers/query.ts +152 -0
  279. package/src/hooks/index.ts +1 -0
  280. package/src/hooks/useActiveSpace.ts +3 -2
  281. package/src/hooks/useInputSurfaceLookup.tsx +9 -13
  282. package/src/hooks/usePath.ts +1 -1
  283. package/src/hooks/useTypeOptions.ts +25 -0
  284. package/src/index.ts +1 -0
  285. package/src/meta.ts +6 -3
  286. package/src/translations.ts +68 -58
  287. package/src/types/form.ts +69 -0
  288. package/src/types/index.ts +1 -0
  289. package/src/types/types.ts +51 -52
  290. package/src/util.tsx +269 -147
  291. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  292. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +0 -88
  293. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +0 -7
  294. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs +0 -479
  295. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs.map +0 -7
  296. package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-CEFHNVU7.mjs +0 -20
  298. package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  300. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
  302. package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-SGTQ52SU.mjs +0 -338
  305. package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-V7MJSSBQ.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +0 -7
  309. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  310. package/dist/lib/browser/intent-resolver-TIXVDYN7.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-N2J7TDRX.mjs +0 -29
  312. package/dist/lib/browser/react-root-N2J7TDRX.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-TPNLWJJH.mjs.map +0 -7
  314. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs +0 -26
  315. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs.map +0 -7
  316. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  317. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  318. package/dist/lib/browser/spaces-ready-TOPG6IV4.mjs.map +0 -7
  319. package/dist/lib/browser/state-QYZAB45H.mjs.map +0 -7
  320. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  321. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +0 -89
  322. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +0 -7
  323. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs +0 -480
  324. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs.map +0 -7
  325. package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
  328. package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
  330. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-6X5DLJM5.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  333. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs +0 -339
  335. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
  338. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  339. package/dist/lib/node-esm/intent-resolver-MHGHRGDT.mjs.map +0 -7
  340. package/dist/lib/node-esm/react-root-KW3TGJGY.mjs.map +0 -7
  341. package/dist/lib/node-esm/react-surface-UUIUUD6P.mjs.map +0 -7
  342. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs +0 -27
  343. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs.map +0 -7
  344. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  345. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  346. package/dist/lib/node-esm/spaces-ready-HIUKNDZK.mjs.map +0 -7
  347. package/dist/lib/node-esm/state-ZVEHQ4BJ.mjs.map +0 -7
  348. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  349. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  350. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  351. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  352. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  353. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  354. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  355. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  356. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  357. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  358. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  359. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  360. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  361. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  362. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts +0 -7
  363. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  364. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  365. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +0 -8
  366. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  367. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts +0 -8
  368. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  369. package/dist/types/src/components/ObjectSettings/index.d.ts +0 -2
  370. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  371. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  372. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  373. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  374. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  375. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  376. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  377. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  378. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  379. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  380. package/src/capabilities/schema-defs.ts +0 -30
  381. package/src/capabilities/schema-tool.test.ts +0 -44
  382. package/src/capabilities/schema-tools.ts +0 -125
  383. package/src/components/MembersContainer.stories.tsx +0 -30
  384. package/src/components/ObjectDetailsPanel.tsx +0 -77
  385. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +0 -80
  386. package/src/components/ObjectSettings/BaseObjectSettings.tsx +0 -47
  387. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +0 -36
  388. package/src/components/ObjectSettings/index.ts +0 -5
  389. package/src/components/PersistenceStatus.tsx +0 -83
@@ -2,19 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
8
  import { IdentityDid, PublicKey } from '@dxos/keys';
11
9
  import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
12
- import { withLayout, withTheme } from '@dxos/storybook-utils';
10
+ import { withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { translations } from '../../translations';
13
13
 
14
- import { FullPresence, type MemberPresenceProps, SmallPresence, type Member } from './SpacePresence';
15
- import { translations } from '../translations';
14
+ import { FullPresence, type Member, type MemberPresenceProps, SmallPresence } from './SpacePresence';
16
15
 
17
- const nViewers = (n: number, currentlyAttended = true): Member[] =>
16
+ const viewers = (n: number, currentlyAttended = true): Member[] =>
18
17
  Array.from({ length: n }, () => ({
19
18
  role: HaloSpaceMember.Role.ADMIN,
20
19
  identity: { did: IdentityDid.random(), identityKey: PublicKey.random() },
@@ -23,6 +22,16 @@ const nViewers = (n: number, currentlyAttended = true): Member[] =>
23
22
  currentlyAttended,
24
23
  }));
25
24
 
25
+ const meta = {
26
+ title: 'plugins/plugin-space/SpacePresence',
27
+ decorators: [withTheme],
28
+ parameters: {
29
+ translations,
30
+ },
31
+ } satisfies Meta<typeof IdentityDid>;
32
+
33
+ export default meta;
34
+
26
35
  export const Full = (props: MemberPresenceProps) => {
27
36
  const p: MemberPresenceProps = {
28
37
  ...props,
@@ -31,31 +40,31 @@ export const Full = (props: MemberPresenceProps) => {
31
40
  return (
32
41
  <div className='p-4'>
33
42
  <div className='p-3'>
34
- <FullPresence members={nViewers(1)} {...p} />
43
+ <FullPresence members={viewers(1)} {...p} />
35
44
  </div>
36
45
  <div className='p-3'>
37
- <FullPresence members={nViewers(2)} {...p} />
46
+ <FullPresence members={viewers(2)} {...p} />
38
47
  </div>
39
48
  <div className='p-3'>
40
- <FullPresence members={nViewers(3)} {...p} />
49
+ <FullPresence members={viewers(3)} {...p} />
41
50
  </div>
42
51
  <div className='p-3'>
43
- <FullPresence members={nViewers(3, false)} {...p} />
52
+ <FullPresence members={viewers(3, false)} {...p} />
44
53
  </div>
45
54
  <div className='p-3'>
46
- <FullPresence members={nViewers(4)} {...p} />
55
+ <FullPresence members={viewers(4)} {...p} />
47
56
  </div>
48
57
  <div className='p-3'>
49
- <FullPresence members={nViewers(5)} {...p} />
58
+ <FullPresence members={viewers(5)} {...p} />
50
59
  </div>
51
60
  <div className='p-3'>
52
- <FullPresence members={nViewers(5, false)} {...p} />
61
+ <FullPresence members={viewers(5, false)} {...p} />
53
62
  </div>
54
63
  <div className='p-3'>
55
- <FullPresence members={nViewers(10)} {...p} />
64
+ <FullPresence members={viewers(10)} {...p} />
56
65
  </div>
57
66
  <div className='p-3'>
58
- <FullPresence members={nViewers(100)} {...p} />
67
+ <FullPresence members={viewers(100)} {...p} />
59
68
  </div>
60
69
  </div>
61
70
  );
@@ -97,11 +106,3 @@ export const Small = () => {
97
106
  </div>
98
107
  );
99
108
  };
100
-
101
- const meta: Meta = {
102
- title: 'plugins/plugin-space/SpacePresence',
103
- decorators: [withTheme, withLayout()],
104
- parameters: { translations },
105
- };
106
-
107
- export default meta;
@@ -2,35 +2,35 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
5
+ import * as Option from 'effect/Option';
6
6
  import React, { forwardRef, useCallback, useEffect, useState } from 'react';
7
7
 
8
- import { useAppGraph, useCapability } from '@dxos/app-framework';
8
+ import { useAppGraph, useCapability } from '@dxos/app-framework/react';
9
9
  import { generateName } from '@dxos/display-name';
10
- import { type Type } from '@dxos/echo';
10
+ import { Obj } from '@dxos/echo';
11
11
  import { PublicKey, useClient } from '@dxos/react-client';
12
- import { getSpace, useMembers, type SpaceMember, fullyQualifiedId } from '@dxos/react-client/echo';
12
+ import { type SpaceMember, getSpace, useMembers } from '@dxos/react-client/echo';
13
13
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
14
14
  import {
15
15
  Avatar,
16
16
  type AvatarContentProps,
17
+ type DxAvatar,
18
+ List,
19
+ ListItem,
20
+ Popover,
17
21
  type Size,
18
22
  type ThemedClassName,
19
23
  Tooltip,
20
- Popover,
21
- useTranslation,
22
- List,
23
- ListItem,
24
24
  useDefaultValue,
25
- type DxAvatar,
25
+ useTranslation,
26
26
  } from '@dxos/react-ui';
27
- import { AttentionGlyph, useAttended, useAttention, type AttentionGlyphProps } from '@dxos/react-ui-attention';
27
+ import { AttentionGlyph, type AttentionGlyphProps, useAttended, useAttention } from '@dxos/react-ui-attention';
28
28
  import { ComplexMap, keyToFallback } from '@dxos/util';
29
29
 
30
- import { SpaceCapabilities } from '../capabilities';
31
- import { usePath } from '../hooks';
32
- import { SPACE_PLUGIN } from '../meta';
33
- import type { ObjectViewerProps } from '../types';
30
+ import { SpaceCapabilities } from '../../capabilities';
31
+ import { usePath } from '../../hooks';
32
+ import { meta } from '../../meta';
33
+ import { type ObjectViewerProps } from '../../types';
34
34
 
35
35
  // TODO(thure): Get/derive these values from protocol
36
36
  const REFRESH_INTERVAL = 5000;
@@ -42,7 +42,12 @@ const noViewers = new ComplexMap<PublicKey, ObjectViewerProps>(PublicKey.hash);
42
42
  // TODO(wittjosiah): Factor out?
43
43
  const getName = (identity: Identity) => identity.profile?.displayName ?? generateName(identity.identityKey.toHex());
44
44
 
45
- export const SpacePresence = ({ object, spaceKey }: { object: Type.Expando; spaceKey?: PublicKey }) => {
45
+ export type SpacePresenceProps = {
46
+ object: Obj.Any;
47
+ spaceKey?: PublicKey;
48
+ };
49
+
50
+ export const SpacePresence = ({ object, spaceKey }: SpacePresenceProps) => {
46
51
  // TODO(wittjosiah): Doesn't need to be mutable but readonly type messes with ComplexMap.
47
52
  const spaceState = useCapability(SpaceCapabilities.MutableState);
48
53
  const client = useClient();
@@ -70,7 +75,7 @@ export const SpacePresence = ({ object, spaceKey }: { object: Type.Expando; spac
70
75
  return null;
71
76
  }
72
77
 
73
- const currentObjectViewers = spaceState.viewersByObject[fullyQualifiedId(object)] ?? noViewers;
78
+ const currentObjectViewers = spaceState.viewersByObject[Obj.getDXN(object).toString()] ?? noViewers;
74
79
 
75
80
  const membersForObject = spaceMembers
76
81
  .filter((member) => memberOnline(member) && memberIsNotSelf(member))
@@ -254,7 +259,7 @@ export type SmallPresenceProps = {
254
259
  } & Pick<AttentionGlyphProps, 'attended' | 'containsAttended'>;
255
260
 
256
261
  export const SmallPresence = ({ count = 0, attended, containsAttended }: SmallPresenceProps) => {
257
- const { t } = useTranslation(SPACE_PLUGIN);
262
+ const { t } = useTranslation(meta.id);
258
263
 
259
264
  return (
260
265
  <Tooltip.Trigger asChild content={t('presence label', { count })} side='bottom'>
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './SpacePresence';
@@ -4,16 +4,17 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
- import { type Space } from '@dxos/react-client/echo';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
9
+ import { type Space } from '@dxos/client/echo';
9
10
  import { Button, Input, Popover, useTranslation } from '@dxos/react-ui';
10
11
 
11
- import { SPACE_PLUGIN } from '../meta';
12
+ import { meta } from '../../meta';
12
13
 
13
- export const POPOVER_RENAME_SPACE = `${SPACE_PLUGIN}/PopoverRenameSpace`;
14
+ export const SPACE_RENAME_POPOVER = `${meta.id}/SpaceRenamePopover`;
14
15
 
15
- export const PopoverRenameSpace = ({ space }: { space: Space }) => {
16
- const { t } = useTranslation(SPACE_PLUGIN);
16
+ export const SpaceRenamePopover = ({ space }: { space: Space }) => {
17
+ const { t } = useTranslation(meta.id);
17
18
  const doneButton = useRef<HTMLButtonElement>(null);
18
19
  const [name, setName] = useState(space.properties.name ?? '');
19
20
  const { dispatchPromise: dispatch } = useIntentDispatcher();
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './SpaceRenamePopover';
@@ -2,37 +2,45 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
8
+ import { IntentPlugin } from '@dxos/app-framework';
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
10
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
- import { withTheme } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
12
12
 
13
- import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
14
13
  import { translations } from '../../translations';
15
14
 
16
- const Story = (args: Partial<SpaceSettingsContainerProps>) => {
15
+ import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
16
+
17
+ const Story = (props: Partial<SpaceSettingsContainerProps>) => {
17
18
  const { space } = useClientProvider();
18
19
  return (
19
20
  <div role='none' className='p-2 border border-primary-500 rounded'>
20
- <SpaceSettingsContainer {...args} space={space!} />
21
+ <SpaceSettingsContainer {...props} space={space!} />
21
22
  </div>
22
23
  );
23
24
  };
24
25
 
25
- const meta: Meta = {
26
+ const meta = {
26
27
  title: 'plugins/plugin-space/SpaceSettingsContainer',
27
28
  component: SpaceSettingsContainer,
28
29
  render: Story,
29
- decorators: [withClientProvider({ createIdentity: true, createSpace: true }), withTheme],
30
+ decorators: [
31
+ withTheme,
32
+ withClientProvider({ createIdentity: true, createSpace: true }),
33
+ // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
34
+ withPluginManager({ plugins: [IntentPlugin()] }),
35
+ ],
30
36
  parameters: {
31
37
  translations,
32
38
  layout: 'centered',
33
39
  },
34
- };
40
+ } satisfies Meta<typeof SpaceSettingsContainer>;
35
41
 
36
42
  export default meta;
37
43
 
44
+ type Story = StoryObj<typeof meta>;
45
+
38
46
  export const Default: StoryObj<typeof SpaceSettingsContainer> = {};
@@ -2,31 +2,38 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { pipe, Schema } from 'effect';
6
- import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
5
+ import * as Function from 'effect/Function';
6
+ import * as Schema from 'effect/Schema';
7
+ import React, { type ChangeEvent, forwardRef, useCallback, useMemo, useState } from 'react';
7
8
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
9
+ import { LayoutAction, chain, createIntent } from '@dxos/app-framework';
10
+ import { useCapabilities, useIntentDispatcher } from '@dxos/app-framework/react';
9
11
  import { log } from '@dxos/log';
10
12
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
13
  import { useClient } from '@dxos/react-client';
12
- import { SpaceState, type Space } from '@dxos/react-client/echo';
13
- import { Button, Input, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
+ import { type Space, SpaceState } from '@dxos/react-client/echo';
15
+ import { Button, Input, useFileDownload, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
16
  import {
15
- Form,
16
- type InputComponent,
17
17
  ControlItem,
18
18
  ControlItemInput,
19
- ControlSection,
20
19
  ControlPage,
20
+ ControlSection,
21
+ Form,
22
+ type FormFieldMap,
21
23
  } from '@dxos/react-ui-form';
22
24
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
23
25
  import { StackItem } from '@dxos/react-ui-stack';
24
26
 
25
- import { SPACE_PLUGIN } from '../../meta';
27
+ import { SpaceCapabilities } from '../../capabilities';
28
+ import { meta } from '../../meta';
26
29
  import { SpaceAction, SpaceForm } from '../../types';
27
30
 
28
- const FormSchema = SpaceForm.pipe(
29
- Schema.extend(Schema.Struct({ archived: Schema.Boolean.annotations({ title: 'Archive space' }) })),
31
+ const SpaceFormSchema = SpaceForm.pipe(
32
+ Schema.extend(
33
+ Schema.Struct({
34
+ archived: Schema.Boolean.annotations({ title: 'Archive Space' }),
35
+ }),
36
+ ),
30
37
  );
31
38
 
32
39
  export type SpaceSettingsContainerProps = {
@@ -34,151 +41,179 @@ export type SpaceSettingsContainerProps = {
34
41
  };
35
42
 
36
43
  // TODO(wittjosiah): Handle space migrations here?
37
- export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) => {
38
- const { t } = useTranslation(SPACE_PLUGIN);
39
- const { dispatchPromise: dispatch } = useIntentDispatcher();
40
- const client = useClient();
41
- const archived = useMulticastObservable(space.state) === SpaceState.SPACE_INACTIVE;
42
- const [edgeReplication, setEdgeReplication] = useState(
43
- space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED,
44
- );
45
- const toggleEdgeReplication = useCallback(
46
- async (next: boolean) => {
47
- setEdgeReplication(next);
48
- await space?.internal
49
- .setEdgeReplicationPreference(next ? EdgeReplicationSetting.ENABLED : EdgeReplicationSetting.DISABLED)
50
- .catch((err: unknown) => {
51
- log.catch(err);
52
- setEdgeReplication(!next);
53
- });
54
- },
55
- [space],
56
- );
44
+ export const SpaceSettingsContainer = forwardRef<HTMLDivElement, SpaceSettingsContainerProps>(
45
+ ({ space }, forwardedRef) => {
46
+ const { t } = useTranslation(meta.id);
47
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
48
+ const client = useClient();
49
+ const archived = useMulticastObservable(space.state) === SpaceState.SPACE_INACTIVE;
50
+ const [edgeReplication, setEdgeReplication] = useState(
51
+ space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED,
52
+ );
53
+ const toggleEdgeReplication = useCallback(
54
+ async (next: boolean) => {
55
+ setEdgeReplication(next);
56
+ await space?.internal
57
+ .setEdgeReplicationPreference(next ? EdgeReplicationSetting.ENABLED : EdgeReplicationSetting.DISABLED)
58
+ .catch((err: unknown) => {
59
+ log.catch(err);
60
+ setEdgeReplication(!next);
61
+ });
62
+ },
63
+ [space],
64
+ );
57
65
 
58
- const handleSave = useCallback(
59
- (properties: Schema.Schema.Type<typeof FormSchema>) => {
60
- void toggleEdgeReplication(properties.edgeReplication);
61
- if (properties.name !== space.properties.name) {
62
- space.properties.name = properties.name;
63
- }
64
- if (properties.icon !== space.properties.icon) {
65
- space.properties.icon = properties.icon;
66
- }
67
- if (properties.hue !== space.properties.hue) {
68
- space.properties.hue = properties.hue;
69
- }
70
- if (properties.archived && !archived) {
71
- void dispatch(
72
- pipe(
73
- createIntent(SpaceAction.Close, { space }),
74
- chain(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: client.spaces.default.id }),
75
- ),
76
- );
77
- } else if (!properties.archived && archived) {
78
- void dispatch(createIntent(SpaceAction.Open, { space }));
79
- }
80
- },
81
- [space, toggleEdgeReplication, archived],
82
- );
66
+ const handleSave = useCallback(
67
+ (properties: Schema.Schema.Type<typeof SpaceFormSchema>) => {
68
+ void toggleEdgeReplication(properties.edgeReplication ?? false);
69
+ if (properties.name !== space.properties.name) {
70
+ space.properties.name = properties.name;
71
+ }
72
+ if (properties.icon !== space.properties.icon) {
73
+ space.properties.icon = properties.icon;
74
+ }
75
+ if (properties.hue !== space.properties.hue) {
76
+ space.properties.hue = properties.hue;
77
+ }
78
+ if (properties.archived && !archived) {
79
+ void dispatch(
80
+ Function.pipe(
81
+ createIntent(SpaceAction.Close, { space }),
82
+ chain(LayoutAction.SwitchWorkspace, {
83
+ part: 'workspace',
84
+ subject: client.spaces.default.id,
85
+ }),
86
+ ),
87
+ );
88
+ } else if (!properties.archived && archived) {
89
+ void dispatch(createIntent(SpaceAction.Open, { space }));
90
+ }
91
+ },
92
+ [space, toggleEdgeReplication, archived],
93
+ );
83
94
 
84
- const values = useMemo(
85
- () => ({
86
- name: space.properties.name,
87
- icon: space.properties.icon,
88
- hue: space.properties.hue,
89
- edgeReplication,
90
- archived,
91
- }),
92
- [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication, archived],
93
- );
95
+ const values = useMemo(
96
+ () => ({
97
+ name: space.properties.name,
98
+ icon: space.properties.icon,
99
+ hue: space.properties.hue,
100
+ edgeReplication,
101
+ archived,
102
+ }),
103
+ [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication, archived],
104
+ );
94
105
 
95
- const customElements: Partial<Record<string, InputComponent>> = useMemo(
96
- () => ({
97
- name: ({ type, label, getValue, onValueChange }) => {
98
- const handleChange = useCallback(
99
- ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
100
- [onValueChange, type],
101
- );
102
- return (
103
- <ControlItemInput title={label} description={t('display name description')}>
104
- <Input.TextInput
105
- value={getValue()}
106
- onChange={handleChange}
107
- placeholder={t('display name input placeholder')}
108
- classNames='min-is-64'
109
- />
110
- </ControlItemInput>
111
- );
112
- },
113
- icon: ({ type, label, getValue, onValueChange }) => {
114
- const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);
115
- const handleEmojiReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
116
- return (
117
- <ControlItem title={label} description={t('icon description')}>
118
- <IconPicker
119
- value={getValue()}
120
- onChange={handleChange}
121
- onReset={handleEmojiReset}
122
- classNames='justify-self-end'
123
- iconSize={5}
124
- />
125
- </ControlItem>
126
- );
127
- },
128
- hue: ({ type, label, getValue, onValueChange }) => {
129
- const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
130
- const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
131
- return (
132
- <ControlItem title={label} description={t('hue description')}>
133
- <HuePicker
134
- value={getValue()}
135
- onChange={handleChange}
136
- onReset={handleHueReset}
137
- classNames='[--hue-preview-size:1.25rem] justify-self-end'
138
- />
139
- </ControlItem>
140
- );
141
- },
142
- edgeReplication: ({ type, label, getValue, onValueChange }) => {
143
- const handleChange = useCallback((checked: boolean) => onValueChange(type, checked), [onValueChange, type]);
144
- return (
145
- <ControlItemInput title={label} description={t('edge replication description')}>
146
- <Input.Switch checked={getValue()} onCheckedChange={handleChange} classNames='justify-self-end' />
147
- </ControlItemInput>
148
- );
149
- },
150
- archived: ({ type, label, getValue, onValueChange }) => {
151
- const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
152
- return (
153
- <ControlItemInput title={label} description={t('archive space description')}>
154
- <Button disabled={space === client.spaces.default} onClick={handleChange}>
155
- {getValue() ? t('unarchive space label') : t('archive space label')}
156
- </Button>
157
- </ControlItemInput>
158
- );
159
- },
160
- }),
161
- [t, space],
162
- );
106
+ const fieldMap = useMemo<FormFieldMap>(
107
+ () => ({
108
+ name: ({ type, label, getValue, onValueChange }) => {
109
+ const handleChange = useCallback(
110
+ ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
111
+ [onValueChange, type],
112
+ );
113
+ return (
114
+ <ControlItemInput title={label} description={t('display name description')}>
115
+ <Input.TextInput
116
+ value={getValue()}
117
+ onChange={handleChange}
118
+ placeholder={t('display name input placeholder')}
119
+ classNames='min-is-64'
120
+ />
121
+ </ControlItemInput>
122
+ );
123
+ },
124
+ icon: ({ type, label, getValue, onValueChange }) => {
125
+ const handleChange = useCallback((icon: string) => onValueChange(type, icon), [onValueChange, type]);
126
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
127
+ return (
128
+ <ControlItem title={label} description={t('icon description')}>
129
+ <IconPicker
130
+ value={getValue()}
131
+ onChange={handleChange}
132
+ onReset={handleReset}
133
+ classNames='justify-self-end'
134
+ />
135
+ </ControlItem>
136
+ );
137
+ },
138
+ hue: ({ type, label, getValue, onValueChange }) => {
139
+ const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
140
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
141
+ return (
142
+ <ControlItem title={label} description={t('hue description')}>
143
+ <HuePicker
144
+ value={getValue()}
145
+ onChange={handleChange}
146
+ onReset={handleReset}
147
+ classNames='justify-self-end'
148
+ />
149
+ </ControlItem>
150
+ );
151
+ },
152
+ edgeReplication: ({ type, label, getValue, onValueChange }) => {
153
+ const handleChange = useCallback((checked: boolean) => onValueChange(type, checked), [onValueChange, type]);
154
+ return (
155
+ <ControlItemInput title={label} description={t('edge replication description')}>
156
+ <Input.Switch checked={getValue()} onCheckedChange={handleChange} classNames='justify-self-end' />
157
+ </ControlItemInput>
158
+ );
159
+ },
160
+ archived: ({ type, label, getValue, onValueChange }) => {
161
+ const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
162
+ return (
163
+ <ControlItemInput title={label} description={t('archive space description')}>
164
+ <Button
165
+ disabled={space === client.spaces.default}
166
+ variant={getValue() ? 'default' : 'destructive'}
167
+ onClick={handleChange}
168
+ >
169
+ {getValue() ? t('unarchive space label') : t('archive space label')}
170
+ </Button>
171
+ </ControlItemInput>
172
+ );
173
+ },
174
+ }),
175
+ [t, space],
176
+ );
163
177
 
164
- return (
165
- <StackItem.Content classNames='block overflow-y-auto pli-2'>
166
- <ControlPage>
167
- <ControlSection
168
- title={t('space properties settings verbose label', { ns: SPACE_PLUGIN })}
169
- description={t('space properties settings description', { ns: SPACE_PLUGIN })}
170
- >
171
- <Form
172
- schema={FormSchema}
173
- values={values}
174
- autoSave
175
- onSave={handleSave}
176
- Custom={customElements}
177
- outerSpacing={false}
178
- classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4'
179
- />
180
- </ControlSection>
181
- </ControlPage>
182
- </StackItem.Content>
183
- );
184
- };
178
+ const download = useFileDownload();
179
+ const handleBackup = useCallback(async () => {
180
+ const archive = await space.internal.export();
181
+ download(new Blob([archive.contents as Uint8Array<ArrayBuffer>]), archive.filename);
182
+ }, [space, download]);
183
+
184
+ const repairs = useCapabilities(SpaceCapabilities.Repair);
185
+ const handleRepair = useCallback(async () => {
186
+ await Promise.all(repairs.map((repair) => repair({ space, isDefault: client.spaces.default === space })));
187
+ }, [client, space, repairs]);
188
+
189
+ return (
190
+ <StackItem.Content scrollable ref={forwardedRef}>
191
+ <ControlPage>
192
+ <ControlSection
193
+ title={t('space properties settings verbose label')}
194
+ description={t('space properties settings description', {
195
+ ns: meta.id,
196
+ })}
197
+ >
198
+ <Form.Root fieldMap={fieldMap} schema={SpaceFormSchema} values={values} autoSave onSave={handleSave}>
199
+ <Form.FieldSet />
200
+ </Form.Root>
201
+ </ControlSection>
202
+
203
+ <ControlSection title={t('space controls title')} description={t('space controls description')}>
204
+ <div role='none' className='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'>
205
+ <ControlItemInput title={t('backup space title')} description={t('backup space description')}>
206
+ <Button onClick={handleBackup}>{t('download backup label')}</Button>
207
+ </ControlItemInput>
208
+ <ControlItemInput title={t('repair space title')} description={t('repair space description')}>
209
+ <Button onClick={handleRepair}>{t('repair space label')}</Button>
210
+ </ControlItemInput>
211
+ </div>
212
+ </ControlSection>
213
+ </ControlPage>
214
+ </StackItem.Content>
215
+ );
216
+ },
217
+ );
218
+
219
+ SpaceSettingsContainer.displayName = 'SpaceSettingsContainer';