@dxos/plugin-space 0.8.4-main.f9ba587 → 0.8.4-main.fd6878d

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 (217) hide show
  1. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs +31 -0
  2. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs +88 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs.map +7 -0
  5. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs +68 -0
  6. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-builder-PMDF6PJV.mjs → app-graph-builder-VZW75QPJ.mjs} +174 -26
  8. package/dist/lib/browser/app-graph-builder-VZW75QPJ.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-serializer-UKYMBX4O.mjs → app-graph-serializer-YPHYVZAP.mjs} +4 -4
  10. package/dist/lib/browser/{chunk-S6NY637J.mjs → chunk-3UFG6LQQ.mjs} +57 -3
  11. package/dist/lib/browser/chunk-3UFG6LQQ.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-C7KGJTAL.mjs → chunk-CBYL62HG.mjs} +3 -2
  13. package/dist/lib/browser/chunk-CBYL62HG.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-DYKFFVN6.mjs} +2 -2
  15. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs.map → chunk-DYKFFVN6.mjs.map} +3 -3
  16. package/dist/lib/browser/{chunk-GVTXQCIW.mjs → chunk-PSIBVBTA.mjs} +386 -319
  17. package/dist/lib/browser/chunk-PSIBVBTA.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-XXIPJLJF.mjs → chunk-Q5EEPP3S.mjs} +2 -1
  19. package/dist/lib/browser/chunk-Q5EEPP3S.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-WBSEOLEM.mjs → chunk-SMB4DGYO.mjs} +129 -25
  21. package/dist/lib/browser/chunk-SMB4DGYO.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-6VLSHG4A.mjs → chunk-WAXS2ZVX.mjs} +68 -7
  23. package/dist/lib/browser/chunk-WAXS2ZVX.mjs.map +7 -0
  24. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-T6ZNVE7S.mjs} +2 -2
  25. package/dist/lib/browser/{identity-created-23XJJV2N.mjs.map → identity-created-T6ZNVE7S.mjs.map} +3 -3
  26. package/dist/lib/browser/index.mjs +103 -12
  27. package/dist/lib/browser/index.mjs.map +3 -3
  28. package/dist/lib/browser/{intent-resolver-WK5WYFH3.mjs → intent-resolver-TS6CCKST.mjs} +166 -16
  29. package/dist/lib/browser/intent-resolver-TS6CCKST.mjs.map +7 -0
  30. package/dist/lib/browser/meta.json +1 -1
  31. package/dist/lib/browser/{react-root-7S6FIC5G.mjs → react-root-RQGTZ2ZO.mjs} +6 -6
  32. package/dist/lib/browser/{react-root-7S6FIC5G.mjs.map → react-root-RQGTZ2ZO.mjs.map} +2 -2
  33. package/dist/lib/browser/{react-surface-6C3YJNDK.mjs → react-surface-V3ARS2BP.mjs} +48 -16
  34. package/dist/lib/browser/react-surface-V3ARS2BP.mjs.map +7 -0
  35. package/dist/lib/browser/{schema-defs-K3B3OAH4.mjs → schema-defs-5LBA43X5.mjs} +2 -2
  36. package/dist/lib/browser/schema-defs-5LBA43X5.mjs.map +7 -0
  37. package/dist/lib/browser/{schema-tools-BNP4JTD7.mjs → schema-tools-LPL35WOJ.mjs} +11 -11
  38. package/dist/lib/browser/schema-tools-LPL35WOJ.mjs.map +7 -0
  39. package/dist/lib/browser/{settings-XNWYRWNM.mjs → settings-FLLBP5KI.mjs} +2 -2
  40. package/dist/lib/browser/{spaces-ready-K7NSNBHM.mjs → spaces-ready-FXEP6XEW.mjs} +14 -12
  41. package/dist/lib/browser/spaces-ready-FXEP6XEW.mjs.map +7 -0
  42. package/dist/lib/browser/{state-522XTUR4.mjs → state-K3UBPKYP.mjs} +2 -2
  43. package/dist/lib/{node-esm/state-C4IOXPZP.mjs.map → browser/state-K3UBPKYP.mjs.map} +2 -2
  44. package/dist/lib/browser/types/index.mjs +1 -1
  45. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs +32 -0
  46. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +7 -0
  47. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs +89 -0
  48. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs.map +7 -0
  49. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs +70 -0
  50. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs.map +7 -0
  51. package/dist/lib/node-esm/{app-graph-builder-TO72W6MI.mjs → app-graph-builder-XNVQOJLE.mjs} +174 -26
  52. package/dist/lib/node-esm/app-graph-builder-XNVQOJLE.mjs.map +7 -0
  53. package/dist/lib/node-esm/{app-graph-serializer-LA3IZDXJ.mjs → app-graph-serializer-PKVLWV6V.mjs} +4 -4
  54. package/dist/lib/node-esm/{chunk-AT7LGFER.mjs → chunk-7MZ3J3LI.mjs} +2 -1
  55. package/dist/lib/node-esm/chunk-7MZ3J3LI.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-HJJHLWKY.mjs → chunk-CTQMR7E3.mjs} +129 -25
  57. package/dist/lib/node-esm/chunk-CTQMR7E3.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-72QMMRKC.mjs → chunk-FJZNSJC4.mjs} +3 -2
  59. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-SXD6T2N4.mjs → chunk-HYIZVPOA.mjs} +68 -7
  61. package/dist/lib/node-esm/chunk-HYIZVPOA.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-KLG4Y4GY.mjs} +2 -2
  63. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs.map → chunk-KLG4Y4GY.mjs.map} +3 -3
  64. package/dist/lib/node-esm/{chunk-OUBADVJE.mjs → chunk-KYUHPPRN.mjs} +386 -319
  65. package/dist/lib/node-esm/chunk-KYUHPPRN.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-2THX6G4C.mjs → chunk-S7MKRQHY.mjs} +57 -3
  67. package/dist/lib/node-esm/chunk-S7MKRQHY.mjs.map +7 -0
  68. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-AL7NNCKH.mjs} +2 -2
  69. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs.map → identity-created-AL7NNCKH.mjs.map} +3 -3
  70. package/dist/lib/node-esm/index.mjs +103 -12
  71. package/dist/lib/node-esm/index.mjs.map +3 -3
  72. package/dist/lib/node-esm/{intent-resolver-HSR27ME4.mjs → intent-resolver-W6P27SCF.mjs} +166 -16
  73. package/dist/lib/node-esm/intent-resolver-W6P27SCF.mjs.map +7 -0
  74. package/dist/lib/node-esm/meta.json +1 -1
  75. package/dist/lib/node-esm/{react-root-HUK3ANLV.mjs → react-root-N27KETKT.mjs} +6 -6
  76. package/dist/lib/node-esm/{react-root-HUK3ANLV.mjs.map → react-root-N27KETKT.mjs.map} +2 -2
  77. package/dist/lib/node-esm/{react-surface-AGAWX7DD.mjs → react-surface-TNPAUQCM.mjs} +48 -16
  78. package/dist/lib/node-esm/react-surface-TNPAUQCM.mjs.map +7 -0
  79. package/dist/lib/node-esm/{schema-defs-4MCDG4DV.mjs → schema-defs-TPWZPDCR.mjs} +2 -2
  80. package/dist/lib/node-esm/schema-defs-TPWZPDCR.mjs.map +7 -0
  81. package/dist/lib/node-esm/{schema-tools-KWW5PTML.mjs → schema-tools-PJE2FKWH.mjs} +11 -11
  82. package/dist/lib/node-esm/schema-tools-PJE2FKWH.mjs.map +7 -0
  83. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs → settings-WKUWY3P6.mjs} +2 -2
  84. package/dist/lib/node-esm/{spaces-ready-UM2P3DCR.mjs → spaces-ready-PQLLIO5W.mjs} +14 -12
  85. package/dist/lib/node-esm/spaces-ready-PQLLIO5W.mjs.map +7 -0
  86. package/dist/lib/node-esm/{state-C4IOXPZP.mjs → state-4M5A6OSB.mjs} +2 -2
  87. package/dist/lib/node-esm/state-4M5A6OSB.mjs.map +7 -0
  88. package/dist/lib/node-esm/types/index.mjs +1 -1
  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/capabilities.d.ts +9 -3
  92. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/schema-defs.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  101. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  102. package/dist/types/src/components/CollectionMain.d.ts +1 -0
  103. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  104. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -2
  105. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  106. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +1 -1
  108. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  109. package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
  110. package/dist/types/src/components/MembersContainer.stories.d.ts +1 -1
  111. package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  113. package/dist/types/src/components/ObjectDetailsPanel.d.ts +9 -0
  114. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +1 -0
  115. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  116. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  117. package/dist/types/src/components/PopoverRenameObject.d.ts +1 -1
  118. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  119. package/dist/types/src/components/RecordMain.d.ts +7 -0
  120. package/dist/types/src/components/RecordMain.d.ts.map +1 -0
  121. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  122. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  124. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +1 -1
  126. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  127. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  128. package/dist/types/src/components/SyncStatus/status.d.ts +5 -5
  129. package/dist/types/src/components/ViewEditor.d.ts +8 -0
  130. package/dist/types/src/components/ViewEditor.d.ts.map +1 -0
  131. package/dist/types/src/components/index.d.ts +11 -1
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/events.d.ts +1 -0
  134. package/dist/types/src/events.d.ts.map +1 -1
  135. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  136. package/dist/types/src/translations.d.ts +65 -4
  137. package/dist/types/src/translations.d.ts.map +1 -1
  138. package/dist/types/src/types/types.d.ts +82 -2
  139. package/dist/types/src/types/types.d.ts.map +1 -1
  140. package/dist/types/src/util.d.ts +31 -5
  141. package/dist/types/src/util.d.ts.map +1 -1
  142. package/dist/types/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +50 -50
  144. package/src/SpacePlugin.ts +88 -5
  145. package/src/capabilities/app-graph-builder.ts +210 -12
  146. package/src/capabilities/capabilities.ts +8 -3
  147. package/src/capabilities/identity-created.ts +1 -1
  148. package/src/capabilities/intent-resolver.ts +120 -10
  149. package/src/capabilities/react-root.tsx +2 -1
  150. package/src/capabilities/react-surface.tsx +66 -15
  151. package/src/capabilities/schema-defs.ts +3 -2
  152. package/src/capabilities/schema-tool.test.ts +1 -1
  153. package/src/capabilities/schema-tools.ts +11 -11
  154. package/src/capabilities/spaces-ready.ts +10 -7
  155. package/src/capabilities/state.ts +3 -2
  156. package/src/components/AwaitingObject.tsx +5 -7
  157. package/src/components/CollectionMain.tsx +2 -0
  158. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +2 -1
  159. package/src/components/CreateDialog/CreateObjectDialog.tsx +32 -27
  160. package/src/components/CreateDialog/CreateObjectPanel.tsx +3 -3
  161. package/src/components/CreateDialog/CreateSpaceDialog.tsx +1 -1
  162. package/src/components/JoinDialog.tsx +1 -1
  163. package/src/components/MembersContainer.stories.tsx +4 -3
  164. package/src/components/MembersContainer.tsx +7 -5
  165. package/src/components/MenuFooter.tsx +2 -3
  166. package/src/components/ObjectDetailsPanel.tsx +77 -0
  167. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +2 -1
  168. package/src/components/PersistenceStatus.tsx +5 -6
  169. package/src/components/PopoverRenameObject.tsx +7 -13
  170. package/src/components/PopoverRenameSpace.tsx +1 -1
  171. package/src/components/RecordMain.tsx +43 -0
  172. package/src/components/SchemaContainer.tsx +2 -2
  173. package/src/components/SpacePluginSettings.tsx +2 -2
  174. package/src/components/SpacePresence.stories.tsx +2 -1
  175. package/src/components/SpacePresence.tsx +7 -7
  176. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +2 -1
  177. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +6 -6
  178. package/src/components/SyncStatus/SyncStatus.stories.tsx +2 -1
  179. package/src/components/SyncStatus/SyncStatus.tsx +4 -3
  180. package/src/components/SyncStatus/status.ts +4 -4
  181. package/src/components/ViewEditor.tsx +64 -0
  182. package/src/components/index.ts +7 -1
  183. package/src/events.ts +2 -1
  184. package/src/hooks/useActiveSpace.ts +1 -1
  185. package/src/hooks/useInputSurfaceLookup.tsx +1 -1
  186. package/src/translations.ts +66 -4
  187. package/src/types/types.ts +56 -3
  188. package/src/util.tsx +126 -25
  189. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-6VLSHG4A.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-C7KGJTAL.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-GVTXQCIW.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-S6NY637J.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-WBSEOLEM.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-XXIPJLJF.mjs.map +0 -7
  196. package/dist/lib/browser/intent-resolver-WK5WYFH3.mjs.map +0 -7
  197. package/dist/lib/browser/react-surface-6C3YJNDK.mjs.map +0 -7
  198. package/dist/lib/browser/schema-defs-K3B3OAH4.mjs.map +0 -7
  199. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  200. package/dist/lib/browser/spaces-ready-K7NSNBHM.mjs.map +0 -7
  201. package/dist/lib/browser/state-522XTUR4.mjs.map +0 -7
  202. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs.map +0 -7
  203. package/dist/lib/node-esm/chunk-2THX6G4C.mjs.map +0 -7
  204. package/dist/lib/node-esm/chunk-72QMMRKC.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-AT7LGFER.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-HJJHLWKY.mjs.map +0 -7
  207. package/dist/lib/node-esm/chunk-OUBADVJE.mjs.map +0 -7
  208. package/dist/lib/node-esm/chunk-SXD6T2N4.mjs.map +0 -7
  209. package/dist/lib/node-esm/intent-resolver-HSR27ME4.mjs.map +0 -7
  210. package/dist/lib/node-esm/react-surface-AGAWX7DD.mjs.map +0 -7
  211. package/dist/lib/node-esm/schema-defs-4MCDG4DV.mjs.map +0 -7
  212. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  213. package/dist/lib/node-esm/spaces-ready-UM2P3DCR.mjs.map +0 -7
  214. /package/dist/lib/browser/{app-graph-serializer-UKYMBX4O.mjs.map → app-graph-serializer-YPHYVZAP.mjs.map} +0 -0
  215. /package/dist/lib/browser/{settings-XNWYRWNM.mjs.map → settings-FLLBP5KI.mjs.map} +0 -0
  216. /package/dist/lib/node-esm/{app-graph-serializer-LA3IZDXJ.mjs.map → app-graph-serializer-PKVLWV6V.mjs.map} +0 -0
  217. /package/dist/lib/node-esm/{settings-YGKHGFPH.mjs.map → settings-WKUWY3P6.mjs.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { pipe } from 'effect';
5
+ import { Effect, pipe } from 'effect';
6
6
  import React, { useCallback, useRef, useState } from 'react';
7
7
 
8
8
  import {
@@ -14,23 +14,25 @@ import {
14
14
  useIntentDispatcher,
15
15
  usePluginManager,
16
16
  } from '@dxos/app-framework';
17
- import { Query, Type, type Obj } from '@dxos/echo';
17
+ import { Obj, Query, Type } from '@dxos/echo';
18
18
  import { invariant } from '@dxos/invariant';
19
19
  import { useClient } from '@dxos/react-client';
20
- import { getSpace, isLiveObject, isSpace, type Space, useQuery, useSpaces } from '@dxos/react-client/echo';
20
+ import { type Space, getSpace, isLiveObject, isSpace, useQuery, useSpaces } from '@dxos/react-client/echo';
21
21
  import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
22
22
  import { cardDialogContent, cardDialogHeader } from '@dxos/react-ui-stack';
23
23
  import { DataType } from '@dxos/schema';
24
24
  import { isNonNullable } from '@dxos/util';
25
25
 
26
- import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
27
26
  import { SpaceCapabilities } from '../../capabilities';
28
27
  import { SPACE_PLUGIN } from '../../meta';
29
28
  import { SpaceAction } from '../../types';
30
29
 
30
+ import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
31
+
31
32
  export const CREATE_OBJECT_DIALOG = `${SPACE_PLUGIN}/CreateObjectDialog`;
32
33
 
33
34
  export type CreateObjectDialogProps = Pick<CreateObjectPanelProps, 'target' | 'typename' | 'name'> & {
35
+ onCreateObject?: (object: Obj.Any) => void;
34
36
  shouldNavigate?: (object: Obj.Any) => boolean;
35
37
  };
36
38
 
@@ -38,6 +40,7 @@ export const CreateObjectDialog = ({
38
40
  target: initialTarget,
39
41
  typename: initialTypename,
40
42
  name,
43
+ onCreateObject,
41
44
  shouldNavigate: _shouldNavigate,
42
45
  }: CreateObjectDialogProps) => {
43
46
  const closeRef = useRef<HTMLButtonElement | null>(null);
@@ -45,7 +48,7 @@ export const CreateObjectDialog = ({
45
48
  const { t } = useTranslation(SPACE_PLUGIN);
46
49
  const client = useClient();
47
50
  const spaces = useSpaces();
48
- const { dispatchPromise: dispatch } = useIntentDispatcher();
51
+ const { dispatch } = useIntentDispatcher();
49
52
  const forms = useCapabilities(SpaceCapabilities.ObjectForm);
50
53
  const [target, setTarget] = useState<Space | DataType.Collection | undefined>(initialTarget);
51
54
  const [typename, setTypename] = useState<string | undefined>(initialTypename);
@@ -60,31 +63,33 @@ export const CreateObjectDialog = ({
60
63
  );
61
64
 
62
65
  const handleCreateObject = useCallback<NonNullable<CreateObjectPanelProps['onCreateObject']>>(
63
- async ({ form, data = {} }) => {
64
- if (!target) {
65
- // TODO(wittjosiah): UI feedback.
66
- return;
67
- }
66
+ ({ form, data = {} }) =>
67
+ Effect.gen(function* () {
68
+ if (!target) {
69
+ // TODO(wittjosiah): UI feedback.
70
+ return;
71
+ }
72
+
73
+ // NOTE: Must close before navigating or attention won't follow object.
74
+ closeRef.current?.click();
68
75
 
69
- // NOTE: Must close before navigating or attention won't follow object.
70
- closeRef.current?.click();
76
+ const space = isSpace(target) ? target : getSpace(target);
77
+ invariant(space, 'Missing space');
78
+ const { object } = yield* dispatch(form.getIntent(data, { space }));
79
+ if (isLiveObject(object) && !Obj.instanceOf(DataType.StoredSchema, object)) {
80
+ // TODO(wittjosiah): Selection in navtree isn't working as expected when hidden typenames evals to true.
81
+ const hidden = form.hidden || hiddenTypenames.includes(Type.getTypename(form.objectSchema));
82
+ const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object, hidden });
83
+ const shouldNavigate = _shouldNavigate ?? (() => true);
84
+ if (shouldNavigate(object)) {
85
+ yield* dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
86
+ } else {
87
+ yield* dispatch(addObjectIntent);
88
+ }
71
89
 
72
- const space = isSpace(target) ? target : getSpace(target);
73
- invariant(space, 'Missing space');
74
- const result = await dispatch(form.getIntent(data, { space }));
75
- const object = result.data?.object;
76
- if (isLiveObject(object)) {
77
- // TODO(wittjosiah): Selection in navtree isn't working as expected when hidden typenames evals to true.
78
- const hidden = form.hidden || hiddenTypenames.includes(Type.getTypename(form.objectSchema));
79
- const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object, hidden });
80
- const shouldNavigate = _shouldNavigate ?? (() => true);
81
- if (shouldNavigate(object)) {
82
- await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
83
- } else {
84
- await dispatch(addObjectIntent);
90
+ onCreateObject?.(object);
85
91
  }
86
- }
87
- },
92
+ }).pipe(Effect.runPromise),
88
93
  [dispatch, target, resolve, hiddenTypenames, _shouldNavigate],
89
94
  );
90
95
 
@@ -5,14 +5,14 @@
5
5
  import React, { useCallback } from 'react';
6
6
 
7
7
  import { Type } from '@dxos/echo';
8
- import { getTypeAnnotation, type TypeAnnotation } from '@dxos/echo-schema';
9
- import { type SpaceId, type Space } from '@dxos/react-client/echo';
8
+ import { type TypeAnnotation, getTypeAnnotation } from '@dxos/echo-schema';
9
+ import { type Space, type SpaceId } from '@dxos/react-client/echo';
10
10
  import { Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
11
  import { Form } from '@dxos/react-ui-form';
12
12
  import { SearchList } from '@dxos/react-ui-searchlist';
13
13
  import { cardDialogOverflow, cardDialogPaddedOverflow, cardDialogSearchListRoot } from '@dxos/react-ui-stack';
14
14
  import { type DataType } from '@dxos/schema';
15
- import { isNonNullable, type MaybePromise } from '@dxos/util';
15
+ import { type MaybePromise, isNonNullable } from '@dxos/util';
16
16
 
17
17
  import { useInputSurfaceLookup } from '../../hooks';
18
18
  import { SPACE_PLUGIN } from '../../meta';
@@ -5,7 +5,7 @@
5
5
  import { Effect, type Schema } from 'effect';
6
6
  import React, { useCallback, useRef } from 'react';
7
7
 
8
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
9
  import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
10
10
  import { Form } from '@dxos/react-ui-form';
11
11
  import { cardDialogContent, cardDialogHeader } from '@dxos/react-ui-stack';
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { Trigger } from '@dxos/async';
9
9
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
10
10
  import { useClient } from '@dxos/react-client';
@@ -4,15 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
 
9
9
  import { withClientProvider } from '@dxos/react-client/testing';
10
10
  import { translations as shellTranslations } from '@dxos/shell/react';
11
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
12
12
 
13
- import { MembersContainer } from './MembersContainer';
14
13
  import { translations } from '../translations';
15
14
 
15
+ import { MembersContainer } from './MembersContainer';
16
+
16
17
  const meta: Meta = {
17
18
  title: 'plugins/plugin-space/MembersContainer',
18
19
  component: MembersContainer,
@@ -2,19 +2,17 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Check, X } from '@phosphor-icons/react';
6
5
  import React, { type Dispatch, type SetStateAction, useCallback, useMemo, useState } from 'react';
7
6
  import { QR } from 'react-qr-rounded';
8
7
 
9
8
  import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
10
9
  import { log } from '@dxos/log';
11
10
  import { useConfig } from '@dxos/react-client';
12
- import { fullyQualifiedId, useSpaceInvitations, type Space } from '@dxos/react-client/echo';
11
+ import { type Space, fullyQualifiedId, useSpaceInvitations } from '@dxos/react-client/echo';
13
12
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
14
13
  import { Button, Clipboard, Icon, Input, useId, useTranslation } from '@dxos/react-ui';
15
- import { ControlPage, ControlSection, ControlFrame, ControlFrameItem, ControlItemInput } from '@dxos/react-ui-form';
14
+ import { ControlFrame, ControlFrameItem, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
16
15
  import { StackItem } from '@dxos/react-ui-stack';
17
- import { getSize, mx } from '@dxos/react-ui-theme';
18
16
  import { DataType } from '@dxos/schema';
19
17
  import {
20
18
  type ActionMenuItem,
@@ -280,5 +278,9 @@ const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string;
280
278
  };
281
279
 
282
280
  const InvitationComplete = ({ statusValue }: { statusValue: number }) => {
283
- return statusValue > 0 ? <Check className={mx('m-1.5', getSize(6))} /> : <X className={mx('m-1.5', getSize(6))} />;
281
+ return statusValue > 0 ? (
282
+ <Icon icon='ph--check--regular' size={6} classNames='m-1.5' />
283
+ ) : (
284
+ <Icon icon='ph--x--regular' size={6} classNames='m-1.5' />
285
+ );
284
286
  };
@@ -2,13 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Planet } from '@phosphor-icons/react';
6
5
  import React from 'react';
7
6
 
8
7
  import { getSpace } from '@dxos/client/echo';
9
8
  import { type Obj } from '@dxos/echo';
10
9
  import { useClient } from '@dxos/react-client';
11
- import { DropdownMenu, toLocalizedString, useTranslation } from '@dxos/react-ui';
10
+ import { DropdownMenu, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
12
11
 
13
12
  import { SPACE_PLUGIN } from '../meta';
14
13
  import { getSpaceDisplayName } from '../util';
@@ -25,7 +24,7 @@ export const MenuFooter = ({ object }: { object: Obj.Any }) => {
25
24
  <dl className='pis-2 mbe-2 text-xs grid grid-cols-[max-content_1fr] gap-2'>
26
25
  <dt className='uppercase text-[.75em] tracking-wide font-medium mbs-px self-start'>{t('location label')}</dt>
27
26
  <dd className='line-clamp-3'>
28
- <Planet className='inline-block mie-1' />
27
+ <Icon icon='ph--planet--regular' classNames='inline-block mie-1' />
29
28
  {toLocalizedString(spaceName, t)}
30
29
  </dd>
31
30
  </dl>
@@ -0,0 +1,77 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback } from 'react';
6
+
7
+ import { type JsonPath, setValue } from '@dxos/echo-schema';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { useClient } from '@dxos/react-client';
10
+ import { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';
11
+ import { Callout, useTranslation } from '@dxos/react-ui';
12
+ import { useSelected } from '@dxos/react-ui-attention';
13
+ import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
14
+ import { type DataType } from '@dxos/schema';
15
+ import { isNonNullable } from '@dxos/util';
16
+
17
+ import { SPACE_PLUGIN } from '../meta';
18
+
19
+ type RowDetailsPanelProps = { objectId: string; view: DataType.View };
20
+
21
+ const ObjectDetailsPanel = ({ objectId, view }: RowDetailsPanelProps) => {
22
+ const { t } = useTranslation(SPACE_PLUGIN);
23
+ const client = useClient();
24
+ const space = getSpace(view);
25
+ const schema = useSchema(client, space, view.query?.typename);
26
+
27
+ const queriedObjects = useQuery(space, schema ? Filter.type(schema) : Filter.nothing());
28
+ const selectedRows = useSelected(objectId, 'multi');
29
+ const selectedObjects = selectedRows.map((id) => queriedObjects.find((obj) => obj.id === id)).filter(isNonNullable);
30
+
31
+ const handleRefQueryLookup = useRefQueryLookupHandler({ space });
32
+
33
+ const handleSave = useCallback(
34
+ (values: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
35
+ const id = values.id;
36
+ invariant(typeof id === 'string');
37
+ const object = queriedObjects.find((obj) => obj.id === id);
38
+ invariant(object);
39
+
40
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
41
+ for (const path of changedPaths) {
42
+ const value = values[path];
43
+ setValue(object, path, value);
44
+ }
45
+ },
46
+ [queriedObjects],
47
+ );
48
+
49
+ if (selectedObjects.length === 0) {
50
+ return (
51
+ <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>
52
+ <Callout.Root classNames='is-full'>
53
+ <Callout.Title>{t('row details no selection label')}</Callout.Title>
54
+ </Callout.Root>
55
+ </div>
56
+ );
57
+ }
58
+
59
+ return (
60
+ <div role='none' className='bs-full is-full flex flex-col p-2 gap-1 overflow-y-auto'>
61
+ {schema &&
62
+ selectedObjects.map((object) => (
63
+ <div key={object.id} className='border border-separator rounded'>
64
+ <Form
65
+ autoSave
66
+ schema={schema}
67
+ values={object}
68
+ onSave={handleSave}
69
+ onQueryRefOptions={handleRefQueryLookup}
70
+ />
71
+ </div>
72
+ ))}
73
+ </div>
74
+ );
75
+ };
76
+
77
+ export default ObjectDetailsPanel;
@@ -9,9 +9,10 @@ import { ForeignKey } from '@dxos/echo-schema';
9
9
  import { IconButton, useTranslation } from '@dxos/react-ui';
10
10
  import { Form } from '@dxos/react-ui-form';
11
11
 
12
- import { ForeignKeys } from './ForeignKeys';
13
12
  import { SPACE_PLUGIN } from '../../meta';
14
13
 
14
+ import { ForeignKeys } from './ForeignKeys';
15
+
15
16
  const initialValues = {
16
17
  source: '',
17
18
  id: '',
@@ -2,13 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { ArrowsCounterClockwise, CheckCircle, Warning } from '@phosphor-icons/react';
6
5
  import React, { useEffect, useState } from 'react';
7
6
 
8
7
  import { debounce } from '@dxos/async';
9
8
  import { type EchoDatabase } from '@dxos/react-client/echo';
10
- import { Tooltip, useTranslation } from '@dxos/react-ui';
11
- import { getSize, mx, staticPlaceholderText, warningText } from '@dxos/react-ui-theme';
9
+ import { Icon, Tooltip, useTranslation } from '@dxos/react-ui';
10
+ import { mx, staticPlaceholderText, warningText } from '@dxos/react-ui-theme';
12
11
 
13
12
  import { SPACE_PLUGIN } from '../meta';
14
13
 
@@ -54,14 +53,14 @@ export const PersistenceStatus = ({ db }: { db: EchoDatabase }) => {
54
53
  case Status.ERROR:
55
54
  return (
56
55
  <div className='flex items-center'>
57
- <Warning className={mx(getSize(4), 'me-1')} />
56
+ <Icon icon='ph--warning--regular' size={4} classNames='me-1' />
58
57
  <span className={mx('text-sm', warningText)}>{t('persistence error label')}</span>
59
58
  </div>
60
59
  );
61
60
  case Status.PENDING:
62
61
  return (
63
62
  <div className='flex items-center'>
64
- <ArrowsCounterClockwise className={mx(getSize(4), 'me-1')} />
63
+ <Icon icon='ph--arrows-counter-clockwise--regular' size={4} classNames='me-1' />
65
64
  <span className={mx('text-sm', staticPlaceholderText)}>{t('persistence pending label')}</span>
66
65
  </div>
67
66
  );
@@ -74,7 +73,7 @@ export const PersistenceStatus = ({ db }: { db: EchoDatabase }) => {
74
73
  content={t('persisted locally message')}
75
74
  className='flex items-center'
76
75
  >
77
- <CheckCircle className={mx(getSize(4), 'me-1')} />
76
+ <Icon icon='ph--check-circle--regular' size={4} classNames='me-1' />
78
77
  {displayMessage && (
79
78
  <span className={mx('text-sm', staticPlaceholderText)}>{t('persisted locally label')}</span>
80
79
  )}
@@ -4,7 +4,8 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { Obj } from '@dxos/echo';
8
9
  import { type Live } from '@dxos/live-object';
9
10
  import { log } from '@dxos/log';
10
11
  import { Button, Input, useTranslation } from '@dxos/react-ui';
@@ -13,24 +14,17 @@ import { SPACE_PLUGIN } from '../meta';
13
14
 
14
15
  export const POPOVER_RENAME_OBJECT = `${SPACE_PLUGIN}/PopoverRenameObject`;
15
16
 
16
- export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
17
+ export const PopoverRenameObject = ({ object }: { object: Live<any> }) => {
17
18
  const { t } = useTranslation(SPACE_PLUGIN);
18
19
  const doneButton = useRef<HTMLButtonElement>(null);
19
- // TODO(wittjosiah): Use schema here.
20
- const object = obj as any;
21
- // TODO(burdon): Field should not be hardcoded field.
22
- const [name, setName] = useState(object.name || object.title || '');
20
+ const [name, setName] = useState(Obj.getLabel(object));
23
21
  const { dispatchPromise: dispatch } = useIntentDispatcher();
24
22
 
25
23
  const handleDone = useCallback(() => {
26
24
  try {
27
- object.name = name;
28
- } catch {
29
- try {
30
- object.title = name;
31
- } catch (err) {
32
- log.error('Failed to rename object', { err });
33
- }
25
+ name && Obj.setLabel(object, name);
26
+ } catch (err) {
27
+ log.error('Failed to rename object', { err });
34
28
  }
35
29
  void dispatch(
36
30
  createIntent(LayoutAction.UpdatePopover, {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { type Space } from '@dxos/react-client/echo';
9
9
  import { Button, Input, Popover, useTranslation } from '@dxos/react-ui';
10
10
 
@@ -0,0 +1,43 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback } from 'react';
6
+
7
+ import { Obj } from '@dxos/echo';
8
+ import { type JsonPath, setValue } from '@dxos/echo-schema';
9
+ import { invariant } from '@dxos/invariant';
10
+ import { getSpace } from '@dxos/react-client/echo';
11
+ import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
12
+
13
+ export const RecordMain = ({ record }: { record: Obj.Any }) => {
14
+ const space = getSpace(record);
15
+ const schema = Obj.getSchema(record);
16
+ invariant(schema, 'Record has no schema.');
17
+
18
+ const handleRefQueryLookup = useRefQueryLookupHandler({ space });
19
+
20
+ const handleSave = useCallback(
21
+ (values: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
22
+ const id = values.id;
23
+ invariant(typeof id === 'string');
24
+
25
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
26
+ for (const path of changedPaths) {
27
+ const value = values[path];
28
+ setValue(record, path, value);
29
+ }
30
+ },
31
+ [record],
32
+ );
33
+
34
+ return (
35
+ <div role='none' className='container-max-width flex flex-col p-2 gap-1 overflow-y-auto'>
36
+ <div key={record.id} className='border border-separator rounded'>
37
+ <Form autoSave schema={schema} values={record} onSave={handleSave} onQueryRefOptions={handleRefQueryLookup} />
38
+ </div>
39
+ </div>
40
+ );
41
+ };
42
+
43
+ export default RecordMain;
@@ -2,12 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState, useEffect } from 'react';
5
+ import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { type Type } from '@dxos/echo';
8
8
  import { type Space } from '@dxos/react-client/echo';
9
9
  import { useTranslation } from '@dxos/react-ui';
10
- import { controlItemClasses, ControlPage, ControlSection } from '@dxos/react-ui-form';
10
+ import { ControlPage, ControlSection, controlItemClasses } from '@dxos/react-ui-form';
11
11
  import { StackItem } from '@dxos/react-ui-stack';
12
12
 
13
13
  import { SPACE_PLUGIN } from '../meta';
@@ -7,8 +7,8 @@ import React from 'react';
7
7
  import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { useClient } from '@dxos/react-client';
9
9
  import { useSpaces } from '@dxos/react-client/echo';
10
- import { Input, toLocalizedString, useTranslation, List, ListItem, IconButton } from '@dxos/react-ui';
11
- import { controlItemClasses, ControlPage, ControlSection, DeprecatedFormInput } from '@dxos/react-ui-form';
10
+ import { IconButton, Input, List, ListItem, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
+ import { ControlPage, ControlSection, DeprecatedFormInput, controlItemClasses } from '@dxos/react-ui-form';
12
12
 
13
13
  import { SPACE_PLUGIN } from '../meta';
14
14
  import { SpaceAction, type SpaceSettingsProps } from '../types';
@@ -11,9 +11,10 @@ import { IdentityDid, PublicKey } from '@dxos/keys';
11
11
  import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
12
12
  import { withLayout, withTheme } from '@dxos/storybook-utils';
13
13
 
14
- import { FullPresence, type MemberPresenceProps, SmallPresence, type Member } from './SpacePresence';
15
14
  import { translations } from '../translations';
16
15
 
16
+ import { FullPresence, type Member, type MemberPresenceProps, SmallPresence } from './SpacePresence';
17
+
17
18
  const nViewers = (n: number, currentlyAttended = true): Member[] =>
18
19
  Array.from({ length: n }, () => ({
19
20
  role: HaloSpaceMember.Role.ADMIN,
@@ -9,22 +9,22 @@ import { useAppGraph, useCapability } from '@dxos/app-framework';
9
9
  import { generateName } from '@dxos/display-name';
10
10
  import { type Type } 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, fullyQualifiedId, 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
30
  import { SpaceCapabilities } from '../capabilities';
@@ -10,9 +10,10 @@ 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';
14
13
  import { translations } from '../../translations';
15
14
 
15
+ import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
16
+
16
17
  const Story = (args: Partial<SpaceSettingsContainerProps>) => {
17
18
  const { space } = useClientProvider();
18
19
  return (
@@ -2,22 +2,22 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { pipe, Schema } from 'effect';
5
+ import { Schema, pipe } from 'effect';
6
6
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
7
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { LayoutAction, chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
9
  import { log } from '@dxos/log';
10
10
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
11
  import { useClient } from '@dxos/react-client';
12
- import { SpaceState, type Space } from '@dxos/react-client/echo';
12
+ import { type Space, SpaceState } from '@dxos/react-client/echo';
13
13
  import { Button, Input, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
14
  import {
15
- Form,
16
- type InputComponent,
17
15
  ControlItem,
18
16
  ControlItemInput,
19
- ControlSection,
20
17
  ControlPage,
18
+ ControlSection,
19
+ Form,
20
+ type InputComponent,
21
21
  } from '@dxos/react-ui-form';
22
22
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
23
23
  import { StackItem } from '@dxos/react-ui-stack';
@@ -8,9 +8,10 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
 
9
9
  import { withTheme } from '@dxos/storybook-utils';
10
10
 
11
- import { SyncStatusIndicator } from './SyncStatus';
12
11
  import { translations } from '../../translations';
13
12
 
13
+ import { SyncStatusIndicator } from './SyncStatus';
14
+
14
15
  const meta: Meta = {
15
16
  title: 'plugins/plugin-space/SyncStatusIndicator',
16
17
  component: SyncStatusIndicator,
@@ -6,12 +6,13 @@ import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { StatusBar } from '@dxos/plugin-status-bar';
8
8
  import { useClient } from '@dxos/react-client';
9
- import { getSyncSummary, type SpaceSyncStateMap, useSyncState } from '@dxos/react-client/echo';
9
+ import { type SpaceSyncStateMap, getSyncSummary, useSyncState } from '@dxos/react-client/echo';
10
10
  import { Icon, useTranslation } from '@dxos/react-ui';
11
11
 
12
+ import { SPACE_PLUGIN } from '../../meta';
13
+
12
14
  import { createClientSaveTracker } from './save-tracker';
13
15
  import { getIcon, getStatus } from './status';
14
- import { SPACE_PLUGIN } from '../../meta';
15
16
 
16
17
  const SYNC_STALLED_TIMEOUT = 5_000;
17
18
 
@@ -29,7 +30,7 @@ export const SyncStatus = () => {
29
30
  return <SyncStatusIndicator state={state} saved={saved} />;
30
31
  };
31
32
 
32
- export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: Boolean }) => {
33
+ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: boolean }) => {
33
34
  const { t } = useTranslation(SPACE_PLUGIN);
34
35
  const summary = getSyncSummary(state);
35
36
  const offline = Object.values(state).length === 0;
@@ -10,10 +10,10 @@ export const getStatus = ({
10
10
  needsToUpload,
11
11
  needsToDownload,
12
12
  }: {
13
- offline: Boolean;
14
- saved: Boolean;
15
- needsToUpload: Boolean;
16
- needsToDownload: Boolean;
13
+ offline: boolean;
14
+ saved: boolean;
15
+ needsToUpload: boolean;
16
+ needsToDownload: boolean;
17
17
  }): Status => {
18
18
  if (!saved) {
19
19
  return 'saving locally';