@dxos/plugin-space 0.7.4 → 0.7.5-labs.071a3e2

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 (257) hide show
  1. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs +367 -0
  2. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs +80 -0
  4. package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-2NMUVDMZ.mjs +1715 -0
  6. package/dist/lib/browser/chunk-2NMUVDMZ.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-ENRYFGYE.mjs +133 -0
  8. package/dist/lib/browser/chunk-ENRYFGYE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-H2AR4OLP.mjs +316 -0
  10. package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-PQXZCNAU.mjs +13 -0
  12. package/dist/lib/browser/chunk-PQXZCNAU.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RLZQJD47.mjs +22 -0
  14. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-S5IGZNXJ.mjs +528 -0
  16. package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +7 -0
  17. package/dist/lib/browser/identity-created-VICTPQX7.mjs +28 -0
  18. package/dist/lib/browser/identity-created-VICTPQX7.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +193 -3521
  20. package/dist/lib/browser/index.mjs.map +4 -4
  21. package/dist/lib/browser/intent-resolver-A5274MUR.mjs +537 -0
  22. package/dist/lib/browser/intent-resolver-A5274MUR.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/react-root-N6QTWYCV.mjs +28 -0
  25. package/dist/lib/browser/react-root-N6QTWYCV.mjs.map +7 -0
  26. package/dist/lib/browser/react-surface-STMNA7W7.mjs +231 -0
  27. package/dist/lib/browser/react-surface-STMNA7W7.mjs.map +7 -0
  28. package/dist/lib/browser/settings-HN5UIYQO.mjs +24 -0
  29. package/dist/lib/browser/settings-HN5UIYQO.mjs.map +7 -0
  30. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs +199 -0
  31. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +7 -0
  32. package/dist/lib/browser/state-6DCY5YJP.mjs +47 -0
  33. package/dist/lib/browser/state-6DCY5YJP.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +14 -5
  35. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs +370 -0
  36. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +7 -0
  37. package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs +88 -0
  38. package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs.map +7 -0
  39. package/dist/lib/node/chunk-2RCJT3P2.cjs +1712 -0
  40. package/dist/lib/node/chunk-2RCJT3P2.cjs.map +7 -0
  41. package/dist/lib/node/chunk-I2LRRRMV.cjs +150 -0
  42. package/dist/lib/node/chunk-I2LRRRMV.cjs.map +7 -0
  43. package/dist/lib/node/chunk-MMXP2NHE.cjs +556 -0
  44. package/dist/lib/node/chunk-MMXP2NHE.cjs.map +7 -0
  45. package/dist/lib/node/chunk-SPCSJ2CY.cjs +345 -0
  46. package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +7 -0
  47. package/dist/lib/node/chunk-UX3U4RU2.cjs +42 -0
  48. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +7 -0
  49. package/dist/lib/node/{meta.cjs → chunk-WZR6OAN3.cjs} +13 -13
  50. package/dist/lib/node/chunk-WZR6OAN3.cjs.map +7 -0
  51. package/dist/lib/node/identity-created-JNDKMFKI.cjs +44 -0
  52. package/dist/lib/node/identity-created-JNDKMFKI.cjs.map +7 -0
  53. package/dist/lib/node/index.cjs +176 -3506
  54. package/dist/lib/node/index.cjs.map +4 -4
  55. package/dist/lib/node/intent-resolver-NVTAESKB.cjs +536 -0
  56. package/dist/lib/node/intent-resolver-NVTAESKB.cjs.map +7 -0
  57. package/dist/lib/node/meta.json +1 -1
  58. package/dist/lib/node/react-root-YCHSAYQE.cjs +50 -0
  59. package/dist/lib/node/react-root-YCHSAYQE.cjs.map +7 -0
  60. package/dist/lib/node/react-surface-ANSZ4FKK.cjs +229 -0
  61. package/dist/lib/node/react-surface-ANSZ4FKK.cjs.map +7 -0
  62. package/dist/lib/node/settings-RBBL22DJ.cjs +38 -0
  63. package/dist/lib/node/settings-RBBL22DJ.cjs.map +7 -0
  64. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs +210 -0
  65. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +7 -0
  66. package/dist/lib/node/state-WPZC4JXB.cjs +61 -0
  67. package/dist/lib/node/state-WPZC4JXB.cjs.map +7 -0
  68. package/dist/lib/node/types/index.cjs +23 -14
  69. package/dist/lib/node/types/index.cjs.map +2 -2
  70. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs +368 -0
  71. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +7 -0
  72. package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs +81 -0
  73. package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-4HICD7AU.mjs +1716 -0
  75. package/dist/lib/node-esm/chunk-4HICD7AU.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs +529 -0
  77. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-ESWV7ICX.mjs +134 -0
  79. package/dist/lib/node-esm/chunk-ESWV7ICX.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs +15 -0
  81. package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs +23 -0
  83. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs +317 -0
  85. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +7 -0
  86. package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs +29 -0
  87. package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs.map +7 -0
  88. package/dist/lib/node-esm/index.mjs +193 -3521
  89. package/dist/lib/node-esm/index.mjs.map +4 -4
  90. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs +538 -0
  91. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs.map +7 -0
  92. package/dist/lib/node-esm/meta.json +1 -1
  93. package/dist/lib/node-esm/react-root-NBQQKAZD.mjs +29 -0
  94. package/dist/lib/node-esm/react-root-NBQQKAZD.mjs.map +7 -0
  95. package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs +232 -0
  96. package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs.map +7 -0
  97. package/dist/lib/node-esm/settings-VBAUB37B.mjs +25 -0
  98. package/dist/lib/node-esm/settings-VBAUB37B.mjs.map +7 -0
  99. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs +200 -0
  100. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +7 -0
  101. package/dist/lib/node-esm/state-5GH2D5U4.mjs +48 -0
  102. package/dist/lib/node-esm/state-5GH2D5U4.mjs.map +7 -0
  103. package/dist/lib/node-esm/types/index.mjs +14 -5
  104. package/dist/types/src/SpacePlugin.d.ts +3 -22
  105. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/app-graph-serializer.d.ts +4 -0
  109. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/capabilities.d.ts +21 -0
  111. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/identity-created.d.ts +4 -0
  113. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/index.d.ts +196 -0
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/intent-resolver.d.ts +9 -0
  117. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/react-root.d.ts +7 -0
  119. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/react-surface.d.ts +7 -0
  121. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/settings.d.ts +4 -0
  123. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/spaces-ready.d.ts +4 -0
  125. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/state.d.ts +5 -0
  127. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  128. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +7 -0
  129. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -0
  130. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +8 -0
  131. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -0
  132. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts +2 -0
  133. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts.map +1 -0
  134. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  135. package/dist/types/src/components/BaseObjectSettings.d.ts +7 -0
  136. package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -0
  137. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +5 -4
  138. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  139. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +9 -9
  140. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  141. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -0
  142. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  143. package/dist/types/src/components/JoinDialog.d.ts +1 -0
  144. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  145. package/dist/types/src/components/PopoverRenameObject.d.ts +1 -0
  146. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  147. package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -0
  148. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  149. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
  150. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  151. package/dist/types/src/components/SpacePresence.d.ts +9 -6
  152. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  153. package/dist/types/src/components/SpacePresence.stories.d.ts +1 -1
  154. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +1 -0
  156. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  157. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +4 -3
  159. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  160. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts.map +1 -1
  161. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +3 -3
  162. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  163. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  164. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +2 -2
  165. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +2 -1
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/events.d.ts +5 -0
  169. package/dist/types/src/events.d.ts.map +1 -0
  170. package/dist/types/src/hooks/index.d.ts +2 -0
  171. package/dist/types/src/hooks/index.d.ts.map +1 -0
  172. package/dist/types/src/hooks/usePath.d.ts +11 -0
  173. package/dist/types/src/hooks/usePath.d.ts.map +1 -0
  174. package/dist/types/src/index.d.ts +3 -5
  175. package/dist/types/src/index.d.ts.map +1 -1
  176. package/dist/types/src/meta.d.ts +2 -27
  177. package/dist/types/src/meta.d.ts.map +1 -1
  178. package/dist/types/src/translations.d.ts +18 -3
  179. package/dist/types/src/translations.d.ts.map +1 -1
  180. package/dist/types/src/types/collection.d.ts +8 -12
  181. package/dist/types/src/types/collection.d.ts.map +1 -1
  182. package/dist/types/src/types/thread.d.ts +180 -186
  183. package/dist/types/src/types/thread.d.ts.map +1 -1
  184. package/dist/types/src/types/types.d.ts +228 -16
  185. package/dist/types/src/types/types.d.ts.map +1 -1
  186. package/dist/types/src/util.d.ts +9 -8
  187. package/dist/types/src/util.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -0
  189. package/package.json +39 -46
  190. package/src/SpacePlugin.tsx +121 -1538
  191. package/src/capabilities/app-graph-builder.ts +393 -0
  192. package/src/capabilities/app-graph-serializer.ts +73 -0
  193. package/src/capabilities/capabilities.ts +26 -0
  194. package/src/capabilities/identity-created.ts +26 -0
  195. package/src/capabilities/index.ts +17 -0
  196. package/src/capabilities/intent-resolver.ts +518 -0
  197. package/src/capabilities/react-root.tsx +20 -0
  198. package/src/capabilities/react-surface.tsx +226 -0
  199. package/src/capabilities/settings.ts +17 -0
  200. package/src/capabilities/spaces-ready.ts +230 -0
  201. package/src/capabilities/state.ts +45 -0
  202. package/src/components/AdvancedObjectSettings/AdvancedObjectSettings.tsx +72 -0
  203. package/src/components/AdvancedObjectSettings/ForeignKeys.tsx +51 -0
  204. package/src/components/AdvancedObjectSettings/index.ts +5 -0
  205. package/src/components/AwaitingObject.tsx +15 -19
  206. package/src/components/{DefaultObjectSettings.tsx → BaseObjectSettings.tsx} +2 -2
  207. package/src/components/CreateDialog/CreateObjectDialog.tsx +49 -38
  208. package/src/components/CreateDialog/CreateObjectPanel.tsx +137 -101
  209. package/src/components/CreateDialog/CreateSpaceDialog.tsx +22 -17
  210. package/src/components/JoinDialog.tsx +40 -48
  211. package/src/components/PersistenceStatus.tsx +1 -1
  212. package/src/components/PopoverRenameObject.tsx +2 -0
  213. package/src/components/PopoverRenameSpace.tsx +2 -0
  214. package/src/components/ShareSpaceButton.tsx +5 -4
  215. package/src/components/SpacePluginSettings.tsx +5 -16
  216. package/src/components/SpacePresence.stories.tsx +27 -19
  217. package/src/components/SpacePresence.tsx +41 -21
  218. package/src/components/SpaceSettings/SpaceSettingsDialog.stories.tsx +2 -3
  219. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +19 -2
  220. package/src/components/SpaceSettings/SpaceSettingsPanel.stories.tsx +7 -5
  221. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +7 -7
  222. package/src/components/SyncStatus/InlineSyncStatus.tsx +37 -27
  223. package/src/components/SyncStatus/SyncStatus.tsx +2 -1
  224. package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +55 -51
  225. package/src/components/index.ts +2 -1
  226. package/src/events.ts +12 -0
  227. package/src/hooks/index.ts +5 -0
  228. package/src/hooks/usePath.ts +44 -0
  229. package/src/index.ts +3 -7
  230. package/src/meta.ts +2 -29
  231. package/src/translations.ts +7 -2
  232. package/src/types/collection.ts +3 -3
  233. package/src/types/thread.ts +6 -6
  234. package/src/types/types.ts +177 -42
  235. package/src/util.tsx +82 -65
  236. package/dist/lib/browser/chunk-FTKV32QZ.mjs +0 -43
  237. package/dist/lib/browser/chunk-FTKV32QZ.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-MWKXNS5S.mjs +0 -124
  239. package/dist/lib/browser/chunk-MWKXNS5S.mjs.map +0 -7
  240. package/dist/lib/browser/meta.mjs +0 -15
  241. package/dist/lib/browser/meta.mjs.map +0 -7
  242. package/dist/lib/node/chunk-6SNOZF7Y.cjs +0 -152
  243. package/dist/lib/node/chunk-6SNOZF7Y.cjs.map +0 -7
  244. package/dist/lib/node/chunk-QNVEU2UD.cjs +0 -69
  245. package/dist/lib/node/chunk-QNVEU2UD.cjs.map +0 -7
  246. package/dist/lib/node/meta.cjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-OHEAWSCA.mjs +0 -126
  248. package/dist/lib/node-esm/chunk-OHEAWSCA.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-UMV7XREB.mjs +0 -45
  250. package/dist/lib/node-esm/chunk-UMV7XREB.mjs.map +0 -7
  251. package/dist/lib/node-esm/meta.mjs +0 -16
  252. package/dist/lib/node-esm/meta.mjs.map +0 -7
  253. package/dist/types/src/components/DefaultObjectSettings.d.ts +0 -7
  254. package/dist/types/src/components/DefaultObjectSettings.d.ts.map +0 -1
  255. package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts +0 -6
  256. package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts.map +0 -1
  257. package/src/components/SyncStatus/InlineSyncStatus.stories.tsx +0 -57
@@ -3,15 +3,16 @@
3
3
  //
4
4
 
5
5
  import { CheckCircle, CircleDashed, CircleNotch } from '@phosphor-icons/react';
6
- import React, { useEffect, useState } from 'react';
6
+ import React, { useCallback, useEffect, useState } from 'react';
7
7
 
8
- import { parseIntentPlugin, useResolvePlugin, parseNavigationPlugin, NavigationAction } from '@dxos/app-framework';
8
+ import { createIntent, LayoutAction, useIntentDispatcher, useLayout } from '@dxos/app-framework';
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import { Filter, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';
11
11
  import { Button, Toast, useTranslation } from '@dxos/react-ui';
12
12
  import { getSize, mx } from '@dxos/react-ui-theme';
13
13
 
14
- import { SpaceAction, SPACE_PLUGIN } from '../meta';
14
+ import { SPACE_PLUGIN } from '../meta';
15
+ import { SpaceAction } from '../types';
15
16
 
16
17
  const WAIT_FOR_OBJECT_TIMEOUT = 180e3; // 3 minutes
17
18
  const TOAST_TIMEOUT = 240e3; // 4 minutes
@@ -21,8 +22,8 @@ export const AwaitingObject = ({ id }: { id: string }) => {
21
22
  const [waiting, setWaiting] = useState(true);
22
23
  const [found, setFound] = useState(false);
23
24
  const { t } = useTranslation(SPACE_PLUGIN);
24
- const intentPlugin = useResolvePlugin(parseIntentPlugin);
25
- const navigationPlugin = useResolvePlugin(parseNavigationPlugin);
25
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
26
+ const layout = useLayout();
26
27
 
27
28
  const client = useClient();
28
29
  const objects = useQuery(client.spaces, Filter.all());
@@ -43,26 +44,21 @@ export const AwaitingObject = ({ id }: { id: string }) => {
43
44
  if (objects.findIndex((object) => fullyQualifiedId(object) === id) > -1) {
44
45
  setFound(true);
45
46
 
46
- if (navigationPlugin?.provides.location.active.solo?.[0].id === id) {
47
+ if (layout.active.includes(id)) {
47
48
  setOpen(false);
48
49
  }
49
50
  }
50
- }, [id, objects, intentPlugin]);
51
+ }, [id, objects, layout]);
51
52
 
52
- const handleClose = async () =>
53
- intentPlugin?.provides.intent.dispatch({
54
- plugin: SPACE_PLUGIN,
55
- action: SpaceAction.WAIT_FOR_OBJECT,
56
- data: { id: undefined },
57
- });
53
+ const handleClose = useCallback(
54
+ async () => dispatch(createIntent(SpaceAction.WaitForObject, { id: undefined })),
55
+ [dispatch],
56
+ );
58
57
 
59
- const handleNavigate = () => {
60
- void intentPlugin?.provides.intent.dispatch({
61
- action: NavigationAction.OPEN,
62
- data: { activeParts: { main: [id] } },
63
- });
58
+ const handleNavigate = useCallback(() => {
59
+ void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [id] }));
64
60
  void handleClose();
65
- };
61
+ }, [id, handleClose, dispatch]);
66
62
 
67
63
  return (
68
64
  <Toast.Root open={open} duration={TOAST_TIMEOUT} onOpenChange={setOpen}>
@@ -9,11 +9,11 @@ import { Input, useTranslation } from '@dxos/react-ui';
9
9
 
10
10
  import { SPACE_PLUGIN } from '../meta';
11
11
 
12
- export type DefaultObjectSettingsProps = {
12
+ export type BaseObjectSettingsProps = {
13
13
  object: ReactiveEchoObject<any>;
14
14
  };
15
15
 
16
- export const DefaultObjectSettings = ({ object }: DefaultObjectSettingsProps) => {
16
+ export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
17
17
  const { t } = useTranslation(SPACE_PLUGIN);
18
18
  // TODO(burdon): Standardize forms.
19
19
  return (
@@ -2,20 +2,30 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { pipe } from 'effect';
5
6
  import React, { useCallback, useRef } from 'react';
6
7
 
7
- import { type MetadataResolver, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
9
  import { useClient } from '@dxos/react-client';
9
- import { type AbstractTypedObject, getSpace, isReactiveObject, isSpace, useSpaces } from '@dxos/react-client/echo';
10
+ import {
11
+ getSpace,
12
+ isReactiveObject,
13
+ isSpace,
14
+ type ReactiveObject,
15
+ type TypedObject,
16
+ useSpaces,
17
+ } from '@dxos/react-client/echo';
10
18
  import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
11
19
 
12
20
  import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
13
- import { SPACE_PLUGIN, SpaceAction } from '../../meta';
14
- import { CollectionType } from '../../types';
21
+ import { SPACE_PLUGIN } from '../../meta';
22
+ import { CollectionType, SpaceAction } from '../../types';
23
+
24
+ export const CREATE_OBJECT_DIALOG = `${SPACE_PLUGIN}/CreateObjectDialog`;
15
25
 
16
26
  export type CreateObjectDialogProps = Pick<CreateObjectPanelProps, 'schemas' | 'target' | 'typename' | 'name'> & {
17
- resolve?: MetadataResolver;
18
- navigableCollections?: boolean;
27
+ resolve?: (typename: string) => Record<string, any>;
28
+ shouldNavigate?: (object: ReactiveObject<any>) => boolean;
19
29
  };
20
30
 
21
31
  export const CreateObjectDialog = ({
@@ -23,28 +33,30 @@ export const CreateObjectDialog = ({
23
33
  target,
24
34
  typename,
25
35
  name,
26
- navigableCollections,
36
+ shouldNavigate: _shouldNavigate,
27
37
  resolve,
28
38
  }: CreateObjectDialogProps) => {
29
39
  const closeRef = useRef<HTMLButtonElement | null>(null);
30
40
  const { t } = useTranslation(SPACE_PLUGIN);
31
41
  const client = useClient();
32
42
  const spaces = useSpaces();
33
- const dispatch = useIntentDispatcher();
43
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
34
44
 
35
45
  const handleCreateObject = useCallback(
36
46
  async ({
37
47
  schema,
38
48
  target: _target,
39
- name,
49
+ data,
40
50
  }: {
41
- schema: AbstractTypedObject;
51
+ schema: TypedObject;
42
52
  target: CreateObjectPanelProps['target'];
43
- name?: string;
53
+ data?: Record<string, any>;
44
54
  }) => {
45
- const target = isSpace(_target) ? (_target.properties[CollectionType.typename] as CollectionType) : _target;
46
- const createObjectAction = resolve?.(schema.typename)?.createObject;
47
- if (!createObjectAction || !target) {
55
+ const target = isSpace(_target)
56
+ ? (_target.properties[CollectionType.typename]?.target as CollectionType | undefined)
57
+ : _target;
58
+ const createObjectIntent = resolve?.(schema.typename)?.createObject;
59
+ if (!createObjectIntent || !target) {
48
60
  // TODO(wittjosiah): UI feedback.
49
61
  return;
50
62
  }
@@ -53,17 +65,16 @@ export const CreateObjectDialog = ({
53
65
  closeRef.current?.click();
54
66
 
55
67
  const space = isSpace(target) ? target : getSpace(target);
56
- const result = await dispatch({ action: createObjectAction, data: { name, space } });
57
- const object = result?.data;
68
+ const result = await dispatch(createObjectIntent(data, { space }));
69
+ const object = result.data?.object;
58
70
  if (isReactiveObject(object)) {
59
- await dispatch([
60
- {
61
- plugin: SPACE_PLUGIN,
62
- action: SpaceAction.ADD_OBJECT,
63
- data: { target, object },
64
- },
65
- ...(!(object instanceof CollectionType) || navigableCollections ? [{ action: NavigationAction.OPEN }] : []),
66
- ]);
71
+ const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
72
+ const shouldNavigate = _shouldNavigate ?? (() => true);
73
+ if (shouldNavigate(object)) {
74
+ await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
75
+ } else {
76
+ await dispatch(addObjectIntent);
77
+ }
67
78
  }
68
79
  },
69
80
  [dispatch, resolve],
@@ -72,8 +83,8 @@ export const CreateObjectDialog = ({
72
83
  return (
73
84
  // TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
74
85
  // Consider factoring it out to the tabs package.
75
- <Dialog.Content classNames='p-0 bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
76
- <div role='none' className='flex justify-between pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>
86
+ <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>
87
+ <div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
77
88
  <Dialog.Title>{t('create object dialog title')}</Dialog.Title>
78
89
  <Dialog.Close asChild>
79
90
  <Button ref={closeRef} density='fine' variant='ghost' autoFocus>
@@ -81,18 +92,18 @@ export const CreateObjectDialog = ({
81
92
  </Button>
82
93
  </Dialog.Close>
83
94
  </div>
84
- <div className='p-4'>
85
- <CreateObjectPanel
86
- schemas={schemas}
87
- spaces={spaces}
88
- target={target}
89
- typename={typename}
90
- name={name}
91
- defaultSpaceId={client.spaces.default.id}
92
- resolve={resolve}
93
- onCreateObject={handleCreateObject}
94
- />
95
- </div>
95
+
96
+ <CreateObjectPanel
97
+ classNames='p-4'
98
+ schemas={schemas}
99
+ spaces={spaces}
100
+ target={target}
101
+ typename={typename}
102
+ name={name}
103
+ defaultSpaceId={client.spaces.default.id}
104
+ resolve={resolve}
105
+ onCreateObject={handleCreateObject}
106
+ />
96
107
  </Dialog.Content>
97
108
  );
98
109
  };
@@ -2,36 +2,60 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback, useState } from 'react';
5
+ import React, { useCallback, useMemo, useState } from 'react';
6
6
 
7
- import { type MetadataResolver } from '@dxos/app-framework';
8
- import { type AbstractTypedObject, getObjectAnnotation, S } from '@dxos/echo-schema';
9
- import { type SpaceId, type Space, isSpace } from '@dxos/react-client/echo';
10
- import { Icon, IconButton, Input, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
- import { Form, InputHeader } from '@dxos/react-ui-form';
7
+ import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
8
+ import { type TypedObject, getObjectAnnotation, type ObjectAnnotation, S } from '@dxos/echo-schema';
9
+ import { type SpaceId, type Space } from '@dxos/react-client/echo';
10
+ import { Icon, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
+ import { Form, type InputProps } from '@dxos/react-ui-form';
12
12
  import { SearchList } from '@dxos/react-ui-searchlist';
13
+ import { mx } from '@dxos/react-ui-theme';
13
14
  import { nonNullable, type MaybePromise } from '@dxos/util';
14
15
 
15
16
  import { SPACE_PLUGIN } from '../../meta';
16
17
  import { type CollectionType } from '../../types';
17
18
  import { getSpaceDisplayName } from '../../util';
18
19
 
19
- export type CreateObjectPanelProps = {
20
- schemas: AbstractTypedObject[];
20
+ // TODO(ZaymonFC): Move this if you find yourself needing it elsewhere.
21
+ /**
22
+ * Creates a surface input component based on plugin context.
23
+ * @param baseData Additional data that will be merged with form data and passed to the surface.
24
+ * This allows providing more context to the surface than what's available from the form itself.
25
+ */
26
+ const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
27
+ const pluginManager = usePluginManager();
28
+
29
+ return useCallback(
30
+ ({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps }) => {
31
+ const composedData = { prop, schema, ...baseData };
32
+ if (!isSurfaceAvailable(pluginManager.context, { role: 'form-input', data: composedData })) {
33
+ return undefined;
34
+ }
35
+
36
+ return <Surface role='form-input' data={composedData} {...inputProps} />;
37
+ },
38
+ [pluginManager, baseData],
39
+ );
40
+ };
41
+
42
+ export type CreateObjectPanelProps = ThemedClassName<{
43
+ schemas: TypedObject[];
21
44
  spaces: Space[];
22
45
  typename?: string;
23
46
  target?: Space | CollectionType;
24
47
  name?: string;
25
48
  defaultSpaceId?: SpaceId;
26
- resolve?: MetadataResolver;
49
+ resolve?: (typename: string) => Record<string, any>;
27
50
  onCreateObject?: (params: {
28
- schema: AbstractTypedObject;
51
+ schema: TypedObject;
29
52
  target: Space | CollectionType;
30
- name?: string;
53
+ data: Record<string, any>;
31
54
  }) => MaybePromise<void>;
32
- };
55
+ }>;
33
56
 
34
57
  export const CreateObjectPanel = ({
58
+ classNames,
35
59
  schemas,
36
60
  spaces,
37
61
  typename: initialTypename,
@@ -45,125 +69,137 @@ export const CreateObjectPanel = ({
45
69
  const [typename, setTypename] = useState<string | undefined>(initialTypename);
46
70
  const [target, setTarget] = useState<Space | CollectionType | undefined>(initialTarget);
47
71
  const schema = schemas.find((schema) => getObjectAnnotation(schema)?.typename === typename);
48
- const options = schemas.map(getObjectAnnotation).filter(nonNullable);
49
-
50
- const handleClearSchema = useCallback(() => setTypename(undefined), []);
51
- const handleClearTarget = useCallback(() => setTarget(undefined), []);
72
+ const options: ObjectAnnotation[] = schemas
73
+ .map(getObjectAnnotation)
74
+ .filter(nonNullable)
75
+ .sort((a, b) => {
76
+ const nameA = t('typename label', { ns: a.typename, defaultValue: a.typename });
77
+ const nameB = t('typename label', { ns: b.typename, defaultValue: b.typename });
78
+ return nameA.localeCompare(nameB);
79
+ });
52
80
 
53
81
  const handleCreateObject = useCallback(
54
- async ({ name }: { name?: string }) => {
82
+ async (props: Record<string, any>) => {
55
83
  if (!schema || !target) {
56
84
  return;
57
85
  }
58
-
59
- await onCreateObject?.({ schema, target, name });
86
+ await onCreateObject?.({ schema, target, data: props });
60
87
  },
61
88
  [onCreateObject, schema, target],
62
89
  );
63
90
 
64
- // TODO(wittjosiah): All of these inputs should be rolled into a `Form` once it supports the necessary variants.
65
- const schemaInput = (
66
- <SearchList.Root label={t('schema input label')} classNames='flex flex-col grow overflow-hidden my-2 px-2'>
91
+ const metadata = useMemo(() => {
92
+ if (!typename) {
93
+ return;
94
+ }
95
+ return resolve?.(typename);
96
+ }, [resolve, typename]);
97
+
98
+ const inputSurfaceLookup = useInputSurfaceLookup({ target });
99
+
100
+ const form = useMemo(() => {
101
+ // TODO(ZaymonFC): Move this default object creation schema somewhere?
102
+ const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
103
+
104
+ return (
105
+ <Form
106
+ classNames='!p-0'
107
+ autoFocus
108
+ values={{ name: initialName }}
109
+ schema={schema}
110
+ testId='create-object-form'
111
+ onSave={handleCreateObject}
112
+ lookupComponent={inputSurfaceLookup}
113
+ />
114
+ );
115
+ }, [initialName, handleCreateObject, metadata]);
116
+
117
+ // TODO(wittjosiah): These inputs should be rolled into a `Form` once it supports the necessary variants.
118
+ return (
119
+ <div role='form' className={mx('flex flex-col gap-2', classNames)}>
120
+ {!schema ? (
121
+ <SelectSchema options={options} resolve={resolve} onChange={setTypename} />
122
+ ) : !target ? (
123
+ <SelectSpace spaces={spaces} defaultSpaceId={defaultSpaceId} onChange={setTarget} />
124
+ ) : (
125
+ form
126
+ )}
127
+ </div>
128
+ );
129
+ };
130
+
131
+ const SelectSpace = ({
132
+ spaces,
133
+ defaultSpaceId,
134
+ onChange,
135
+ }: { onChange: (space: Space) => void } & Pick<CreateObjectPanelProps, 'spaces' | 'defaultSpaceId'>) => {
136
+ const { t } = useTranslation(SPACE_PLUGIN);
137
+
138
+ return (
139
+ <SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
67
140
  <SearchList.Input
68
141
  autoFocus
69
- data-testid='create-object-form.schema-input'
70
- placeholder={t('schema input placeholder')}
142
+ data-testid='create-object-form.space-input'
143
+ placeholder={t('space input placeholder')}
71
144
  classNames='px-1 my-2'
72
145
  />
73
146
  <SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
74
- {options.map((option) => (
75
- <SearchList.Item
76
- key={option.typename}
77
- value={t('typename label', { ns: option.typename, defaultValue: option.typename })}
78
- onSelect={() => setTypename(option.typename)}
79
- classNames='flex items-center gap-2'
80
- >
81
- <span className='flex gap-2 items-center grow truncate'>
82
- <Icon icon={resolve?.(option.typename).icon ?? 'ph--placeholder--regular'} size={5} />
83
- {t('typename label', { ns: option.typename, defaultValue: option.typename })}
84
- </span>
85
- </SearchList.Item>
86
- ))}
147
+ {spaces
148
+ .sort((a, b) => {
149
+ const aName = toLocalizedString(getSpaceDisplayName(a, { personal: a.id === defaultSpaceId }), t);
150
+ const bName = toLocalizedString(getSpaceDisplayName(b, { personal: b.id === defaultSpaceId }), t);
151
+ return aName.localeCompare(bName);
152
+ })
153
+ .map((space) => (
154
+ <SearchList.Item
155
+ key={space.id}
156
+ value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
157
+ onSelect={() => onChange(space)}
158
+ classNames='flex items-center gap-2'
159
+ >
160
+ <span className='grow truncate'>
161
+ {toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
162
+ </span>
163
+ </SearchList.Item>
164
+ ))}
87
165
  </SearchList.Content>
88
166
  </SearchList.Root>
89
167
  );
168
+ };
169
+
170
+ const SelectSchema = ({
171
+ options,
172
+ resolve,
173
+ onChange,
174
+ }: {
175
+ options: ObjectAnnotation[];
176
+ onChange: (type: string) => void;
177
+ } & Pick<CreateObjectPanelProps, 'resolve'>) => {
178
+ const { t } = useTranslation(SPACE_PLUGIN);
90
179
 
91
- const spaceInput = (
92
- <SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden my-2 px-2'>
180
+ return (
181
+ <SearchList.Root label={t('schema input label')} classNames='flex flex-col grow overflow-hidden'>
93
182
  <SearchList.Input
94
183
  autoFocus
95
- data-testid='create-object-form.space-input'
96
- placeholder={t('space input placeholder')}
184
+ data-testid='create-object-form.schema-input'
185
+ placeholder={t('schema input placeholder')}
97
186
  classNames='px-1 my-2'
98
187
  />
99
188
  <SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
100
- {spaces.map((space) => (
189
+ {options.map((option) => (
101
190
  <SearchList.Item
102
- key={space.id}
103
- value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
104
- onSelect={() => setTarget(space)}
191
+ key={option.typename}
192
+ value={t('typename label', { ns: option.typename, defaultValue: option.typename })}
193
+ onSelect={() => onChange(option.typename)}
105
194
  classNames='flex items-center gap-2'
106
195
  >
107
- <span className='grow truncate'>
108
- {toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
196
+ <span className='flex gap-2 items-center grow truncate'>
197
+ <Icon icon={resolve?.(option.typename).icon ?? 'ph--placeholder--regular'} size={5} />
198
+ {t('typename label', { ns: option.typename, defaultValue: option.typename })}
109
199
  </span>
110
200
  </SearchList.Item>
111
201
  ))}
112
202
  </SearchList.Content>
113
203
  </SearchList.Root>
114
204
  );
115
-
116
- const form = (
117
- <Form
118
- autoFocus
119
- values={{ name: initialName }}
120
- schema={S.Struct({ name: S.optional(S.String) })}
121
- testId='create-object-form'
122
- onSave={handleCreateObject}
123
- />
124
- );
125
-
126
- return (
127
- <div role='form' className='flex flex-col gap-2'>
128
- {target && (
129
- <div role='none' className='px-2'>
130
- <Input.Root>
131
- <InputHeader>
132
- <Input.Label>
133
- {t(isSpace(target) ? 'creating in space label' : 'creating in collection label')}
134
- </Input.Label>
135
- </InputHeader>
136
- <div role='none' className='flex gap-2'>
137
- <Input.TextInput
138
- disabled
139
- value={
140
- isSpace(target)
141
- ? toLocalizedString(getSpaceDisplayName(target, { personal: target.id === defaultSpaceId }), t)
142
- : target.name || t('unnamed collection label')
143
- }
144
- />
145
- <IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearTarget} />
146
- </div>
147
- </Input.Root>
148
- </div>
149
- )}
150
- {schema && (
151
- <div role='none' className='px-2'>
152
- <Input.Root>
153
- <InputHeader>
154
- <Input.Label>{t('creating object type label')}</Input.Label>
155
- </InputHeader>
156
- <div role='none' className='flex gap-2'>
157
- <Input.TextInput
158
- disabled
159
- value={t('typename label', { ns: schema.typename, defaultValue: schema.typename })}
160
- />
161
- <IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearSchema} />
162
- </div>
163
- </Input.Root>
164
- </div>
165
- )}
166
- {!schema ? schemaInput : !target ? spaceInput : form}
167
- </div>
168
- );
169
205
  };
@@ -2,15 +2,18 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { Effect } from 'effect';
5
6
  import React, { useCallback, useRef } from 'react';
6
7
 
7
- import { useIntentDispatcher } from '@dxos/app-framework';
8
+ import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
9
  import { type S } from '@dxos/echo-schema';
9
10
  import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
10
11
  import { Form } from '@dxos/react-ui-form';
11
12
 
12
- import { SPACE_PLUGIN, SpaceAction } from '../../meta';
13
- import { SpaceForm } from '../../types';
13
+ import { SPACE_PLUGIN } from '../../meta';
14
+ import { SpaceAction, SpaceForm } from '../../types';
15
+
16
+ export const CREATE_SPACE_DIALOG = `${SPACE_PLUGIN}/CreateSpaceDialog`;
14
17
 
15
18
  type FormValues = S.Schema.Type<typeof SpaceForm>;
16
19
  const initialValues: FormValues = { edgeReplication: true };
@@ -18,21 +21,16 @@ const initialValues: FormValues = { edgeReplication: true };
18
21
  export const CreateSpaceDialog = () => {
19
22
  const closeRef = useRef<HTMLButtonElement | null>(null);
20
23
  const { t } = useTranslation(SPACE_PLUGIN);
21
- const dispatch = useIntentDispatcher();
24
+ const { dispatch } = useIntentDispatcher();
22
25
 
23
26
  const handleCreateSpace = useCallback(
24
27
  async (data: FormValues) => {
25
- const result = await dispatch({
26
- action: SpaceAction.CREATE,
27
- data,
28
+ const program = Effect.gen(function* () {
29
+ const { space } = yield* dispatch(createIntent(SpaceAction.Create, data));
30
+ yield* dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: space.id }));
31
+ yield* dispatch(createIntent(SpaceAction.OpenCreateObject, { target: space }));
28
32
  });
29
- const target = result?.data.space;
30
- if (target) {
31
- await dispatch({
32
- action: SpaceAction.OPEN_CREATE_OBJECT,
33
- data: { target },
34
- });
35
- }
33
+ await Effect.runPromise(program);
36
34
  },
37
35
  [dispatch],
38
36
  );
@@ -40,8 +38,8 @@ export const CreateSpaceDialog = () => {
40
38
  return (
41
39
  // TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
42
40
  // Consider factoring it out to the tabs package.
43
- <Dialog.Content classNames='p-0 bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
44
- <div role='none' className='flex justify-between pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>
41
+ <Dialog.Content classNames='p-0 bs-content min-bs-[16rem] max-bs-full md:max-is-[32rem] overflow-hidden'>
42
+ <div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
45
43
  <Dialog.Title>{t('create space dialog title')}</Dialog.Title>
46
44
  <Dialog.Close asChild>
47
45
  <Button ref={closeRef} density='fine' variant='ghost' autoFocus>
@@ -50,7 +48,14 @@ export const CreateSpaceDialog = () => {
50
48
  </Dialog.Close>
51
49
  </div>
52
50
  <div className='p-4'>
53
- <Form testId='create-space-form' values={initialValues} schema={SpaceForm} onSave={handleCreateSpace} />
51
+ <Form
52
+ testId='create-space-form'
53
+ classNames='!p-0'
54
+ autoFocus
55
+ values={initialValues}
56
+ schema={SpaceForm}
57
+ onSave={handleCreateSpace}
58
+ />
54
59
  </div>
55
60
  </Dialog.Content>
56
61
  );