@dxos/plugin-space 0.8.2-main.f11618f → 0.8.2-staging.7ac8446

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 (245) hide show
  1. package/dist/lib/browser/{app-graph-builder-ZWNOWRAX.mjs → app-graph-builder-GMFCSOLG.mjs} +7 -61
  2. package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-UUJH7JRN.mjs → app-graph-serializer-DSF2U3A5.mjs} +8 -8
  4. package/dist/lib/browser/app-graph-serializer-DSF2U3A5.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-DIJ7LMCS.mjs → chunk-5BDV575R.mjs} +8 -20
  6. package/dist/lib/browser/chunk-5BDV575R.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-O7WGQVLQ.mjs → chunk-AYW4IDRT.mjs} +4 -35
  8. package/dist/lib/browser/chunk-AYW4IDRT.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-4226DMDP.mjs → chunk-JZXWPMLA.mjs} +666 -522
  10. package/dist/lib/browser/chunk-JZXWPMLA.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-JS6ZV4GV.mjs → chunk-LO5UL6RU.mjs} +141 -60
  12. package/dist/lib/browser/chunk-LO5UL6RU.mjs.map +7 -0
  13. package/dist/lib/browser/{identity-created-NRVE4XLL.mjs → identity-created-JR7BNXFH.mjs} +4 -4
  14. package/dist/lib/browser/identity-created-JR7BNXFH.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +33 -12
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-NP55M7C7.mjs → intent-resolver-RKYILWWQ.mjs} +82 -92
  18. package/dist/lib/browser/intent-resolver-RKYILWWQ.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-root-XKAUZ3X2.mjs → react-root-6H7NX2M2.mjs} +4 -4
  21. package/dist/lib/browser/{react-surface-2DW2UDRX.mjs → react-surface-7AGLOVMK.mjs} +47 -121
  22. package/dist/lib/browser/react-surface-7AGLOVMK.mjs.map +7 -0
  23. package/dist/lib/browser/{settings-MVT32NP6.mjs → settings-PJPTJUPE.mjs} +4 -4
  24. package/dist/lib/browser/settings-PJPTJUPE.mjs.map +7 -0
  25. package/dist/lib/browser/{spaces-ready-ERNSICUW.mjs → spaces-ready-BSSP7HHG.mjs} +5 -5
  26. package/dist/lib/browser/spaces-ready-BSSP7HHG.mjs.map +7 -0
  27. package/dist/lib/browser/{state-CYV6QCTN.mjs → state-X7VLCC6E.mjs} +3 -1
  28. package/dist/lib/browser/state-X7VLCC6E.mjs.map +7 -0
  29. package/dist/lib/browser/types/index.mjs +1 -7
  30. package/dist/lib/node/{app-graph-builder-LLIV422L.cjs → app-graph-builder-DPY7AUZE.cjs} +30 -83
  31. package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs.map +7 -0
  32. package/dist/lib/node/{app-graph-serializer-M6Z2OPA4.cjs → app-graph-serializer-JELGJUAY.cjs} +20 -20
  33. package/dist/lib/node/app-graph-serializer-JELGJUAY.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-ZMQO74LX.cjs → chunk-3GKCNADA.cjs} +655 -513
  35. package/dist/lib/node/chunk-3GKCNADA.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-UOCR4G2D.cjs → chunk-PU2EYH4E.cjs} +12 -24
  37. package/dist/lib/node/chunk-PU2EYH4E.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-XADZLQAJ.cjs → chunk-TUZWEPGX.cjs} +167 -84
  39. package/dist/lib/node/chunk-TUZWEPGX.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-EQ5BPSQ7.cjs → chunk-WDEIFDTX.cjs} +7 -41
  41. package/dist/lib/node/chunk-WDEIFDTX.cjs.map +7 -0
  42. package/dist/lib/node/{identity-created-YDTRMOMX.cjs → identity-created-XU4HFV2T.cjs} +6 -6
  43. package/dist/lib/node/identity-created-XU4HFV2T.cjs.map +7 -0
  44. package/dist/lib/node/index.cjs +89 -68
  45. package/dist/lib/node/index.cjs.map +3 -3
  46. package/dist/lib/node/{intent-resolver-3J52ARFL.cjs → intent-resolver-VJ7YV74L.cjs} +131 -141
  47. package/dist/lib/node/intent-resolver-VJ7YV74L.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-XUE2J7HT.cjs → react-root-TEL5RW3N.cjs} +8 -8
  50. package/dist/lib/node/{react-surface-IWSTOZ2E.cjs → react-surface-2H3S5TY5.cjs} +74 -146
  51. package/dist/lib/node/react-surface-2H3S5TY5.cjs.map +7 -0
  52. package/dist/lib/node/{settings-JLV7YT6Q.cjs → settings-WVFP2UEP.cjs} +7 -7
  53. package/dist/lib/node/settings-WVFP2UEP.cjs.map +7 -0
  54. package/dist/lib/node/{spaces-ready-6EBR4SM4.cjs → spaces-ready-7DNZSUOG.cjs} +12 -12
  55. package/dist/lib/node/spaces-ready-7DNZSUOG.cjs.map +7 -0
  56. package/dist/lib/node/{state-JLN7TGRR.cjs → state-5KX6WBJH.cjs} +6 -4
  57. package/dist/lib/node/state-5KX6WBJH.cjs.map +7 -0
  58. package/dist/lib/node/types/index.cjs +12 -18
  59. package/dist/lib/node/types/index.cjs.map +2 -2
  60. package/dist/lib/node-esm/{app-graph-builder-HSGLCS76.mjs → app-graph-builder-42IGWRPL.mjs} +7 -61
  61. package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs.map +7 -0
  62. package/dist/lib/node-esm/{app-graph-serializer-J3B4WSXU.mjs → app-graph-serializer-FXONFKOE.mjs} +8 -8
  63. package/dist/lib/node-esm/app-graph-serializer-FXONFKOE.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-OLISVDCF.mjs → chunk-3ZOUV4DF.mjs} +8 -20
  65. package/dist/lib/node-esm/chunk-3ZOUV4DF.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-PQI4D4SH.mjs → chunk-BEWBZ4Q4.mjs} +666 -522
  67. package/dist/lib/node-esm/chunk-BEWBZ4Q4.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-FJPCLEKN.mjs → chunk-FC4UHDPL.mjs} +4 -35
  69. package/dist/lib/node-esm/chunk-FC4UHDPL.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-ABTVMAG5.mjs → chunk-ZGLK25WQ.mjs} +141 -60
  71. package/dist/lib/node-esm/chunk-ZGLK25WQ.mjs.map +7 -0
  72. package/dist/lib/node-esm/{identity-created-EC6SVYB5.mjs → identity-created-WJKAS2PV.mjs} +4 -4
  73. package/dist/lib/node-esm/identity-created-WJKAS2PV.mjs.map +7 -0
  74. package/dist/lib/node-esm/index.mjs +33 -12
  75. package/dist/lib/node-esm/index.mjs.map +3 -3
  76. package/dist/lib/node-esm/{intent-resolver-MXQIFIRC.mjs → intent-resolver-ZFNSA4CM.mjs} +82 -92
  77. package/dist/lib/node-esm/intent-resolver-ZFNSA4CM.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-root-ZBCJCEFS.mjs → react-root-PRBJMWLQ.mjs} +4 -4
  80. package/dist/lib/node-esm/{react-surface-JCHDAPGM.mjs → react-surface-RCZG2PNF.mjs} +47 -121
  81. package/dist/lib/node-esm/react-surface-RCZG2PNF.mjs.map +7 -0
  82. package/dist/lib/node-esm/{settings-AILIMHTE.mjs → settings-FJZPC2TV.mjs} +4 -4
  83. package/dist/lib/node-esm/settings-FJZPC2TV.mjs.map +7 -0
  84. package/dist/lib/node-esm/{spaces-ready-5PXESKHX.mjs → spaces-ready-7X5PGB2V.mjs} +5 -5
  85. package/dist/lib/node-esm/spaces-ready-7X5PGB2V.mjs.map +7 -0
  86. package/dist/lib/node-esm/{state-YZPY5T5A.mjs → state-Z6E2YTNC.mjs} +3 -1
  87. package/dist/lib/node-esm/state-Z6E2YTNC.mjs.map +7 -0
  88. package/dist/lib/node-esm/types/index.mjs +1 -7
  89. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/index.d.ts +0 -1
  92. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -2
  94. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  97. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  98. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -2
  99. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  101. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  102. package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
  103. package/dist/types/src/components/ObjectSettingsContainer/AdvancedObjectSettings.d.ts.map +1 -0
  104. package/dist/types/src/components/ObjectSettingsContainer/BaseObjectSettings.d.ts.map +1 -0
  105. package/dist/types/src/components/ObjectSettingsContainer/ForeignKeys.d.ts.map +1 -0
  106. package/dist/types/src/components/ObjectSettingsContainer/ObjectSettingsContainer.d.ts.map +1 -0
  107. package/dist/types/src/components/ObjectSettingsContainer/index.d.ts.map +1 -0
  108. package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -1
  109. package/dist/types/src/components/PopoverRenameObject.d.ts +2 -2
  110. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  111. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  112. package/dist/types/src/components/ShareSpaceButton.d.ts +9 -0
  113. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -0
  114. package/dist/types/src/components/ShareSpaceButton.stories.d.ts +10 -0
  115. package/dist/types/src/components/ShareSpaceButton.stories.d.ts.map +1 -0
  116. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  117. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  118. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts +7 -0
  119. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts.map +1 -0
  120. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts +7 -0
  121. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +2 -0
  123. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  124. package/dist/types/src/components/SpaceSettings/index.d.ts +1 -0
  125. package/dist/types/src/components/SpaceSettings/index.d.ts.map +1 -1
  126. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  127. package/dist/types/src/components/SyncStatus/Space.d.ts +13 -0
  128. package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -0
  129. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +8 -1
  130. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  131. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +9 -0
  132. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -0
  133. package/dist/types/src/components/SyncStatus/sync-state.d.ts +18 -0
  134. package/dist/types/src/components/SyncStatus/sync-state.d.ts.map +1 -0
  135. package/dist/types/src/components/index.d.ts +2 -2
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/hooks/index.d.ts +0 -1
  138. package/dist/types/src/hooks/index.d.ts.map +1 -1
  139. package/dist/types/src/translations.d.ts +9 -45
  140. package/dist/types/src/translations.d.ts.map +1 -1
  141. package/dist/types/src/types/thread.d.ts +17 -241
  142. package/dist/types/src/types/thread.d.ts.map +1 -1
  143. package/dist/types/src/types/types.d.ts +14 -40
  144. package/dist/types/src/types/types.d.ts.map +1 -1
  145. package/dist/types/src/util.d.ts +5 -27
  146. package/dist/types/src/util.d.ts.map +1 -1
  147. package/package.json +43 -44
  148. package/src/SpacePlugin.tsx +13 -3
  149. package/src/capabilities/app-graph-builder.ts +5 -44
  150. package/src/capabilities/app-graph-serializer.ts +4 -4
  151. package/src/capabilities/identity-created.ts +2 -2
  152. package/src/capabilities/intent-resolver.ts +84 -87
  153. package/src/capabilities/react-surface.tsx +37 -106
  154. package/src/capabilities/settings.ts +2 -2
  155. package/src/capabilities/spaces-ready.ts +2 -2
  156. package/src/capabilities/state.ts +2 -0
  157. package/src/components/CollectionMain.tsx +5 -2
  158. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +2 -2
  159. package/src/components/CreateDialog/CreateObjectDialog.tsx +3 -3
  160. package/src/components/CreateDialog/CreateObjectPanel.tsx +25 -3
  161. package/src/components/CreateDialog/CreateSpaceDialog.tsx +0 -4
  162. package/src/components/MembersContainer.tsx +54 -80
  163. package/src/components/PopoverAddSpace.tsx +3 -9
  164. package/src/components/PopoverRenameObject.tsx +8 -14
  165. package/src/components/PopoverRenameSpace.tsx +0 -8
  166. package/src/components/ShareSpaceButton.stories.tsx +27 -0
  167. package/src/components/ShareSpaceButton.tsx +32 -0
  168. package/src/components/SpacePluginSettings.tsx +2 -27
  169. package/src/components/SpacePresence.tsx +25 -29
  170. package/src/components/SpaceSettings/{SpaceSettingsContainer.stories.tsx → SpacePropertiesForm.stories.tsx} +6 -6
  171. package/src/components/SpaceSettings/SpacePropertiesForm.tsx +136 -0
  172. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +39 -157
  173. package/src/components/SpaceSettings/index.ts +1 -0
  174. package/src/components/SyncStatus/InlineSyncStatus.tsx +7 -5
  175. package/src/components/SyncStatus/Space.tsx +133 -0
  176. package/src/components/SyncStatus/SyncStatus.tsx +69 -6
  177. package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +89 -0
  178. package/src/components/SyncStatus/sync-state.ts +101 -0
  179. package/src/components/index.ts +2 -2
  180. package/src/hooks/index.ts +0 -1
  181. package/src/translations.ts +5 -18
  182. package/src/types/types.ts +8 -30
  183. package/src/util.tsx +103 -43
  184. package/dist/lib/browser/app-graph-builder-ZWNOWRAX.mjs.map +0 -7
  185. package/dist/lib/browser/app-graph-serializer-UUJH7JRN.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-4226DMDP.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-DIJ7LMCS.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-JS6ZV4GV.mjs.map +0 -7
  189. package/dist/lib/browser/chunk-O7WGQVLQ.mjs.map +0 -7
  190. package/dist/lib/browser/identity-created-NRVE4XLL.mjs.map +0 -7
  191. package/dist/lib/browser/intent-resolver-NP55M7C7.mjs.map +0 -7
  192. package/dist/lib/browser/react-surface-2DW2UDRX.mjs.map +0 -7
  193. package/dist/lib/browser/settings-MVT32NP6.mjs.map +0 -7
  194. package/dist/lib/browser/spaces-ready-ERNSICUW.mjs.map +0 -7
  195. package/dist/lib/browser/state-CYV6QCTN.mjs.map +0 -7
  196. package/dist/lib/node/app-graph-builder-LLIV422L.cjs.map +0 -7
  197. package/dist/lib/node/app-graph-serializer-M6Z2OPA4.cjs.map +0 -7
  198. package/dist/lib/node/chunk-EQ5BPSQ7.cjs.map +0 -7
  199. package/dist/lib/node/chunk-UOCR4G2D.cjs.map +0 -7
  200. package/dist/lib/node/chunk-XADZLQAJ.cjs.map +0 -7
  201. package/dist/lib/node/chunk-ZMQO74LX.cjs.map +0 -7
  202. package/dist/lib/node/identity-created-YDTRMOMX.cjs.map +0 -7
  203. package/dist/lib/node/intent-resolver-3J52ARFL.cjs.map +0 -7
  204. package/dist/lib/node/react-surface-IWSTOZ2E.cjs.map +0 -7
  205. package/dist/lib/node/settings-JLV7YT6Q.cjs.map +0 -7
  206. package/dist/lib/node/spaces-ready-6EBR4SM4.cjs.map +0 -7
  207. package/dist/lib/node/state-JLN7TGRR.cjs.map +0 -7
  208. package/dist/lib/node-esm/app-graph-builder-HSGLCS76.mjs.map +0 -7
  209. package/dist/lib/node-esm/app-graph-serializer-J3B4WSXU.mjs.map +0 -7
  210. package/dist/lib/node-esm/chunk-ABTVMAG5.mjs.map +0 -7
  211. package/dist/lib/node-esm/chunk-FJPCLEKN.mjs.map +0 -7
  212. package/dist/lib/node-esm/chunk-OLISVDCF.mjs.map +0 -7
  213. package/dist/lib/node-esm/chunk-PQI4D4SH.mjs.map +0 -7
  214. package/dist/lib/node-esm/identity-created-EC6SVYB5.mjs.map +0 -7
  215. package/dist/lib/node-esm/intent-resolver-MXQIFIRC.mjs.map +0 -7
  216. package/dist/lib/node-esm/react-surface-JCHDAPGM.mjs.map +0 -7
  217. package/dist/lib/node-esm/settings-AILIMHTE.mjs.map +0 -7
  218. package/dist/lib/node-esm/spaces-ready-5PXESKHX.mjs.map +0 -7
  219. package/dist/lib/node-esm/state-YZPY5T5A.mjs.map +0 -7
  220. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  221. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  222. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  223. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  224. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  225. package/dist/types/src/components/SchemaContainer.d.ts +0 -13
  226. package/dist/types/src/components/SchemaContainer.d.ts.map +0 -1
  227. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +0 -7
  228. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +0 -1
  229. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +0 -14
  230. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +0 -1
  231. package/src/components/SchemaContainer.tsx +0 -59
  232. package/src/hooks/useInputSurfaceLookup.tsx +0 -31
  233. /package/dist/lib/browser/{react-root-XKAUZ3X2.mjs.map → react-root-6H7NX2M2.mjs.map} +0 -0
  234. /package/dist/lib/node/{react-root-XUE2J7HT.cjs.map → react-root-TEL5RW3N.cjs.map} +0 -0
  235. /package/dist/lib/node-esm/{react-root-ZBCJCEFS.mjs.map → react-root-PRBJMWLQ.mjs.map} +0 -0
  236. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.d.ts +0 -0
  237. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.d.ts +0 -0
  238. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.d.ts +0 -0
  239. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.d.ts +0 -0
  240. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/index.d.ts +0 -0
  241. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.tsx +0 -0
  242. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.tsx +0 -0
  243. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.tsx +0 -0
  244. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.tsx +0 -0
  245. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/index.ts +0 -0
@@ -4,23 +4,21 @@
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 Live } from '@dxos/live-object';
7
+ import { type ReactiveObject } from '@dxos/live-object';
9
8
  import { log } from '@dxos/log';
10
- import { Button, Input, useTranslation } from '@dxos/react-ui';
9
+ import { Button, Input, Popover, useTranslation } from '@dxos/react-ui';
11
10
 
12
11
  import { SPACE_PLUGIN } from '../meta';
13
12
 
14
13
  export const POPOVER_RENAME_OBJECT = `${SPACE_PLUGIN}/PopoverRenameObject`;
15
14
 
16
- export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
15
+ export const PopoverRenameObject = ({ object: obj }: { object: ReactiveObject<any> }) => {
17
16
  const { t } = useTranslation(SPACE_PLUGIN);
18
17
  const doneButton = useRef<HTMLButtonElement>(null);
19
18
  // TODO(wittjosiah): Use schema here.
20
19
  const object = obj as any;
21
20
  // TODO(burdon): Field should not be hardcoded field.
22
21
  const [name, setName] = useState(object.name || object.title || '');
23
- const { dispatchPromise: dispatch } = useIntentDispatcher();
24
22
 
25
23
  const handleDone = useCallback(() => {
26
24
  try {
@@ -32,12 +30,6 @@ export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
32
30
  log.error('Failed to rename object', { err });
33
31
  }
34
32
  }
35
- void dispatch(
36
- createIntent(LayoutAction.UpdatePopover, {
37
- part: 'popover',
38
- options: { variant: 'react', anchorId: '', state: false },
39
- }),
40
- );
41
33
  }, [object, name]);
42
34
 
43
35
  return (
@@ -54,9 +46,11 @@ export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
54
46
  />
55
47
  </Input.Root>
56
48
  </div>
57
- <Button ref={doneButton} classNames='self-stretch' onClick={handleDone}>
58
- {t('done label', { ns: 'os' })}
59
- </Button>
49
+ <Popover.Close asChild>
50
+ <Button ref={doneButton} classNames='self-stretch' onClick={handleDone}>
51
+ {t('done label', { ns: 'os' })}
52
+ </Button>
53
+ </Popover.Close>
60
54
  </div>
61
55
  );
62
56
  };
@@ -4,7 +4,6 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
7
  import { type Space } from '@dxos/react-client/echo';
9
8
  import { Button, Input, Popover, useTranslation } from '@dxos/react-ui';
10
9
 
@@ -16,16 +15,9 @@ export const PopoverRenameSpace = ({ space }: { space: Space }) => {
16
15
  const { t } = useTranslation(SPACE_PLUGIN);
17
16
  const doneButton = useRef<HTMLButtonElement>(null);
18
17
  const [name, setName] = useState(space.properties.name ?? '');
19
- const { dispatchPromise: dispatch } = useIntentDispatcher();
20
18
 
21
19
  const handleDone = useCallback(() => {
22
20
  space.properties.name = name;
23
- void dispatch(
24
- createIntent(LayoutAction.UpdatePopover, {
25
- part: 'popover',
26
- options: { variant: 'react', anchorId: '', state: false },
27
- }),
28
- );
29
21
  }, [space, name]);
30
22
 
31
23
  // TODO(thure): Why does the input value need to be uncontrolled to work?
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Meta } from '@storybook/react';
8
+
9
+ import { withTheme } from '@dxos/storybook-utils';
10
+
11
+ import { ShareSpaceButtonImpl } from './ShareSpaceButton';
12
+ import translations from '../translations';
13
+
14
+ export const Default = {
15
+ args: {
16
+ onClick: () => console.log('clicked'),
17
+ },
18
+ };
19
+
20
+ const meta: Meta = {
21
+ title: 'plugins/plugin-space/ShareSpaceButton',
22
+ component: ShareSpaceButtonImpl,
23
+ decorators: [withTheme],
24
+ parameters: { translations },
25
+ };
26
+
27
+ export default meta;
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { type Space } from '@dxos/react-client/echo';
9
+ import { IconButton, useTranslation } from '@dxos/react-ui';
10
+
11
+ import { SPACE_PLUGIN } from '../meta';
12
+ import { SpaceAction } from '../types';
13
+
14
+ export const ShareSpaceButton = ({ space }: { space: Space }) => {
15
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
16
+
17
+ return <ShareSpaceButtonImpl onClick={() => dispatch(createIntent(SpaceAction.Share, { space }))} />;
18
+ };
19
+
20
+ // TODO(wittjosiah): Better way to name pure/impure components?
21
+ export const ShareSpaceButtonImpl = ({ onClick }: { onClick: () => void }) => {
22
+ const { t } = useTranslation(SPACE_PLUGIN);
23
+
24
+ return (
25
+ <IconButton
26
+ data-testid='spacePlugin.shareSpaceButton'
27
+ icon='ph--users--regular'
28
+ label={t('share space label')}
29
+ onClick={onClick}
30
+ />
31
+ );
32
+ };
@@ -4,45 +4,20 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
- import { useClient } from '@dxos/react-client';
9
- import { useSpaces } from '@dxos/react-client/echo';
10
- import { Input, toLocalizedString, useTranslation, List, ListItem, Button } from '@dxos/react-ui';
7
+ import { Input, useTranslation } from '@dxos/react-ui';
11
8
  import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
12
9
 
13
10
  import { SPACE_PLUGIN } from '../meta';
14
- import { SpaceAction, type SpaceSettingsProps } from '../types';
15
- import { getSpaceDisplayName } from '../util';
11
+ import { type SpaceSettingsProps } from '../types';
16
12
 
17
13
  export const SpacePluginSettings = ({ settings }: { settings: SpaceSettingsProps }) => {
18
14
  const { t } = useTranslation(SPACE_PLUGIN);
19
- const { dispatchPromise: dispatch } = useIntentDispatcher();
20
- const client = useClient();
21
- const spaces = useSpaces({ all: settings.showHidden });
22
15
 
23
- // TODO(wittjosiah): Migrate to new form container.
24
16
  return (
25
17
  <DeprecatedFormContainer>
26
18
  <DeprecatedFormInput label={t('show hidden spaces label')}>
27
19
  <Input.Switch checked={settings.showHidden} onCheckedChange={(checked) => (settings.showHidden = !!checked)} />
28
20
  </DeprecatedFormInput>
29
- <div role='none'>
30
- <h2 className='text-xl my-4'>Space Settings</h2>
31
- <List classNames='max-w-md mx-auto'>
32
- {spaces.map((space) => (
33
- <ListItem.Root key={space.id}>
34
- <ListItem.Heading classNames='flex flex-col grow truncate mbe-2'>
35
- {toLocalizedString(getSpaceDisplayName(space, { personal: space === client.spaces.default }), t)}
36
- </ListItem.Heading>
37
- <ListItem.Endcap>
38
- <Button onClick={() => dispatch(createIntent(SpaceAction.OpenSettings, { space }))}>
39
- {t('open space settings label')}
40
- </Button>
41
- </ListItem.Endcap>
42
- </ListItem.Root>
43
- ))}
44
- </List>
45
- </div>
46
21
  </DeprecatedFormContainer>
47
22
  );
48
23
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { forwardRef, useCallback, useEffect, useState } from 'react';
5
+ import React, { useCallback, useEffect, useState } from 'react';
6
6
 
7
7
  import { useAppGraph, useCapability } from '@dxos/app-framework';
8
8
  import { generateName } from '@dxos/display-name';
@@ -20,7 +20,6 @@ import {
20
20
  List,
21
21
  ListItem,
22
22
  useDefaultValue,
23
- type DxAvatar,
24
23
  } from '@dxos/react-ui';
25
24
  import { AttentionGlyph, useAttended, useAttention, type AttentionGlyphProps } from '@dxos/react-ui-attention';
26
25
  import { ComplexMap, keyToFallback } from '@dxos/util';
@@ -116,8 +115,8 @@ export const FullPresence = (props: MemberPresenceProps) => {
116
115
  <div className='dx-avatar-group' data-testid='spacePlugin.presence'>
117
116
  {members.slice(0, 3).map((member, i) => (
118
117
  <Tooltip.Root key={member.identity.identityKey.toHex()}>
119
- <Tooltip.Trigger className='grid focus:outline-none'>
120
- <PresenceAvatar
118
+ <Tooltip.Trigger>
119
+ <PrensenceAvatar
121
120
  identity={member.identity}
122
121
  match={member.currentlyAttended} // TODO(Zan): Match always true now we're showing 'members viewing current object'.
123
122
  index={members.length - i}
@@ -136,14 +135,13 @@ export const FullPresence = (props: MemberPresenceProps) => {
136
135
 
137
136
  {members.length > 3 && (
138
137
  <Tooltip.Root>
139
- <Tooltip.Trigger className='grid focus:outline-none'>
138
+ <Tooltip.Trigger>
140
139
  <Avatar.Root>
141
140
  {/* TODO(wittjosiah): Make text fit. */}
142
141
  <Avatar.Content
143
142
  status='inactive'
144
143
  style={{ zIndex: members.length - 4 }}
145
144
  fallback={`+${members.length - 3}`}
146
- size={size}
147
145
  />
148
146
  </Avatar.Root>
149
147
  </Tooltip.Trigger>
@@ -159,7 +157,7 @@ export const FullPresence = (props: MemberPresenceProps) => {
159
157
  data-testid='identity-list-item'
160
158
  >
161
159
  {/* TODO(Zan): Match always true now we're showing 'members viewing current object'. */}
162
- <PresenceAvatar identity={member.identity} size={size} showName match={member.currentlyAttended} />
160
+ <PrensenceAvatar identity={member.identity} size={size} showName match={member.currentlyAttended} />
163
161
  </ListItem.Root>
164
162
  ))}
165
163
  </List>
@@ -179,28 +177,26 @@ type PresenceAvatarProps = Pick<AvatarContentProps, 'size'> & {
179
177
  onClick?: () => void;
180
178
  };
181
179
 
182
- const PresenceAvatar = forwardRef<DxAvatar, PresenceAvatarProps>(
183
- ({ identity, showName, match, index, onClick, size }, forwardedRef) => {
184
- const status = match ? 'current' : 'active';
185
- const fallbackValue = keyToFallback(identity.identityKey);
186
- return (
187
- <Avatar.Root>
188
- <Avatar.Content
189
- status={status}
190
- hue={identity.profile?.data?.hue || fallbackValue.hue}
191
- data-testid='spacePlugin.presence.member'
192
- data-status={status}
193
- size={size}
194
- {...(index ? { style: { zIndex: index } } : {})}
195
- onClick={onClick}
196
- fallback={identity.profile?.data?.emoji || fallbackValue.emoji}
197
- ref={forwardedRef}
198
- />
199
- <Avatar.Label classNames={showName ? 'text-sm truncate pli-2' : 'sr-only'}>{getName(identity)}</Avatar.Label>
200
- </Avatar.Root>
201
- );
202
- },
203
- );
180
+ const PrensenceAvatar = ({ identity, showName, match, index, onClick, size }: PresenceAvatarProps) => {
181
+ const status = match ? 'current' : 'active';
182
+ const fallbackValue = keyToFallback(identity.identityKey);
183
+ return (
184
+ <Avatar.Root>
185
+ <Avatar.Content
186
+ status={status}
187
+ hue={identity.profile?.data?.hue || fallbackValue.hue}
188
+ data-testid='spacePlugin.presence.member'
189
+ data-status={status}
190
+ size={size}
191
+ classNames='mbs-2 mie-4'
192
+ {...(index ? { style: { zIndex: index } } : {})}
193
+ onClick={() => onClick?.()}
194
+ fallback={identity.profile?.data?.emoji || fallbackValue.emoji}
195
+ />
196
+ <Avatar.Label classNames={showName ? 'text-sm truncate pli-2' : 'sr-only'}>{getName(identity)}</Avatar.Label>
197
+ </Avatar.Root>
198
+ );
199
+ };
204
200
 
205
201
  export type SmallPresenceLiveProps = {
206
202
  id?: string;
@@ -10,21 +10,21 @@ import React from 'react';
10
10
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
11
  import { withTheme } from '@dxos/storybook-utils';
12
12
 
13
- import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
13
+ import { SpacePropertiesForm, type SpacePropertiesFormProps } from './SpacePropertiesForm';
14
14
  import translations from '../../translations';
15
15
 
16
- const Story = (args: Partial<SpaceSettingsContainerProps>) => {
16
+ const Story = (args: Partial<SpacePropertiesFormProps>) => {
17
17
  const { space } = useClientProvider();
18
18
  return (
19
19
  <div role='none' className='p-2 border border-primary-500 rounded'>
20
- <SpaceSettingsContainer {...args} space={space!} />
20
+ <SpacePropertiesForm {...args} space={space!} />
21
21
  </div>
22
22
  );
23
23
  };
24
24
 
25
25
  const meta: Meta = {
26
- title: 'plugins/plugin-space/SpaceSettingsContainer',
27
- component: SpaceSettingsContainer,
26
+ title: 'plugins/plugin-space/SpacePropertiesForm',
27
+ component: SpacePropertiesForm,
28
28
  render: Story,
29
29
  decorators: [withClientProvider({ createIdentity: true, createSpace: true }), withTheme],
30
30
  parameters: {
@@ -35,4 +35,4 @@ const meta: Meta = {
35
35
 
36
36
  export default meta;
37
37
 
38
- export const Default: StoryObj<typeof SpaceSettingsContainer> = {};
38
+ export const Default: StoryObj<typeof SpacePropertiesForm> = {};
@@ -0,0 +1,136 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Schema as S } from 'effect';
6
+ import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
+
8
+ import { log } from '@dxos/log';
9
+ import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
10
+ import { type Space } from '@dxos/react-client/echo';
11
+ import { Input, useTranslation } from '@dxos/react-ui';
12
+ import { Form, type InputComponent, ControlItem, ControlItemInput } from '@dxos/react-ui-form';
13
+ import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
14
+
15
+ import { SPACE_PLUGIN } from '../../meta';
16
+ import { SpaceForm } from '../../types';
17
+
18
+ export type SpacePropertiesFormProps = {
19
+ space: Space;
20
+ };
21
+
22
+ export const SpacePropertiesForm = ({ space }: SpacePropertiesFormProps) => {
23
+ const { t } = useTranslation(SPACE_PLUGIN);
24
+
25
+ const [edgeReplication, setEdgeReplication] = useState(
26
+ space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED,
27
+ );
28
+ const toggleEdgeReplication = useCallback(
29
+ async (next: boolean) => {
30
+ setEdgeReplication(next);
31
+ await space?.internal
32
+ .setEdgeReplicationPreference(next ? EdgeReplicationSetting.ENABLED : EdgeReplicationSetting.DISABLED)
33
+ .catch((err: unknown) => {
34
+ log.catch(err);
35
+ setEdgeReplication(!next);
36
+ });
37
+ },
38
+ [space],
39
+ );
40
+
41
+ const handleSave = useCallback(
42
+ (properties: S.Schema.Type<typeof SpaceForm>) => {
43
+ void toggleEdgeReplication(properties.edgeReplication);
44
+ if (properties.name !== space.properties.name) {
45
+ space.properties.name = properties.name;
46
+ }
47
+ if (properties.icon !== space.properties.icon) {
48
+ space.properties.icon = properties.icon;
49
+ }
50
+ if (properties.hue !== space.properties.hue) {
51
+ space.properties.hue = properties.hue;
52
+ }
53
+ },
54
+ [space, toggleEdgeReplication],
55
+ );
56
+
57
+ const values = useMemo(
58
+ () => ({
59
+ name: space.properties.name,
60
+ icon: space.properties.icon,
61
+ hue: space.properties.hue,
62
+ edgeReplication,
63
+ }),
64
+ [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication],
65
+ );
66
+
67
+ const customElements: Partial<Record<string, InputComponent>> = useMemo(
68
+ () => ({
69
+ name: ({ type, label, getValue, onValueChange }) => {
70
+ const handleChange = useCallback(
71
+ ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
72
+ [onValueChange, type],
73
+ );
74
+ return (
75
+ <ControlItemInput title={label} description={t('display name description')}>
76
+ <Input.TextInput
77
+ value={getValue()}
78
+ onChange={handleChange}
79
+ placeholder={t('display name input placeholder')}
80
+ classNames='min-is-64'
81
+ />
82
+ </ControlItemInput>
83
+ );
84
+ },
85
+ icon: ({ type, label, getValue, onValueChange }) => {
86
+ const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);
87
+ const handleEmojiReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
88
+ return (
89
+ <ControlItem title={label} description={t('icon description')}>
90
+ <IconPicker
91
+ value={getValue()}
92
+ onChange={handleChange}
93
+ onReset={handleEmojiReset}
94
+ classNames='justify-self-end'
95
+ iconSize={5}
96
+ />
97
+ </ControlItem>
98
+ );
99
+ },
100
+ hue: ({ type, label, getValue, onValueChange }) => {
101
+ const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
102
+ const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
103
+ return (
104
+ <ControlItem title={label} description={t('hue description')}>
105
+ <HuePicker
106
+ value={getValue()}
107
+ onChange={handleChange}
108
+ onReset={handleHueReset}
109
+ classNames='[--hue-preview-size:1.25rem] justify-self-end'
110
+ />
111
+ </ControlItem>
112
+ );
113
+ },
114
+ edgeReplication: ({ type, label, getValue, onValueChange }) => {
115
+ const handleChange = useCallback((checked: boolean) => onValueChange(type, checked), [onValueChange, type]);
116
+ return (
117
+ <ControlItemInput title={label} description={t('edge replication description')}>
118
+ <Input.Switch checked={getValue()} onCheckedChange={handleChange} classNames='justify-self-end' />
119
+ </ControlItemInput>
120
+ );
121
+ },
122
+ }),
123
+ [t],
124
+ );
125
+
126
+ return (
127
+ <Form
128
+ schema={SpaceForm}
129
+ values={values}
130
+ autoSave
131
+ onSave={handleSave}
132
+ Custom={customElements}
133
+ classNames='p-0 container-max-width [&_[role="form"]]:grid [&_[role="form"]]:grid-cols-1 md:[&_[role="form"]]:grid-cols-[1fr_min-content] [&_[role="form"]]:gap-4'
134
+ />
135
+ );
136
+ };