@dxos/plugin-space 0.7.5-feature-compute.4d9d99a → 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 (174) hide show
  1. package/dist/lib/browser/{app-graph-builder-5D2QB43K.mjs → app-graph-builder-TTM2YZVS.mjs} +10 -8
  2. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-VNWPLPDF.mjs → app-graph-serializer-ZGM5NDXE.mjs} +5 -5
  4. package/dist/lib/browser/{chunk-6SWQRWOD.mjs → chunk-2NMUVDMZ.mjs} +293 -250
  5. package/dist/lib/browser/chunk-2NMUVDMZ.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-5TBRONF6.mjs → chunk-ENRYFGYE.mjs} +3 -3
  7. package/dist/lib/browser/{chunk-HCXWKGTE.mjs → chunk-H2AR4OLP.mjs} +4 -4
  8. package/dist/lib/browser/{chunk-HCXWKGTE.mjs.map → chunk-H2AR4OLP.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-SOXNANA6.mjs → chunk-PQXZCNAU.mjs} +3 -2
  10. package/dist/lib/browser/{chunk-SOXNANA6.mjs.map → chunk-PQXZCNAU.mjs.map} +3 -3
  11. package/dist/lib/browser/{chunk-UH5P4UL3.mjs → chunk-RLZQJD47.mjs} +3 -2
  12. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-ZBKFJNHH.mjs → chunk-S5IGZNXJ.mjs} +14 -9
  14. package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +7 -0
  15. package/dist/lib/browser/{identity-created-EC5FOCX2.mjs → identity-created-VICTPQX7.mjs} +3 -3
  16. package/dist/lib/browser/index.mjs +14 -13
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/intent-resolver-A5274MUR.mjs +537 -0
  19. package/dist/lib/browser/intent-resolver-A5274MUR.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-AZJFNTKK.mjs → react-root-N6QTWYCV.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-E2VSYVNZ.mjs → react-surface-STMNA7W7.mjs} +26 -33
  23. package/dist/lib/browser/react-surface-STMNA7W7.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-ASFF5BZL.mjs → settings-HN5UIYQO.mjs} +3 -3
  25. package/dist/lib/browser/{spaces-ready-4SFNS5JQ.mjs → spaces-ready-F57ITJDR.mjs} +31 -32
  26. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +7 -0
  27. package/dist/lib/browser/{state-MS4KYJWI.mjs → state-6DCY5YJP.mjs} +3 -3
  28. package/dist/lib/browser/types/index.mjs +2 -2
  29. package/dist/lib/node/{app-graph-builder-ZQ5S62YR.cjs → app-graph-builder-6N4TEVHH.cjs} +58 -56
  30. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +7 -0
  31. package/dist/lib/node/{app-graph-serializer-72S7P33H.cjs → app-graph-serializer-AWKVTYAB.cjs} +21 -21
  32. package/dist/lib/node/{chunk-M64YG2FY.cjs → chunk-2RCJT3P2.cjs} +294 -251
  33. package/dist/lib/node/chunk-2RCJT3P2.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-BQRNTKSQ.cjs → chunk-I2LRRRMV.cjs} +8 -8
  35. package/dist/lib/node/{chunk-Z34MTEU7.cjs → chunk-MMXP2NHE.cjs} +65 -60
  36. package/dist/lib/node/chunk-MMXP2NHE.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-DDZYVNVP.cjs → chunk-SPCSJ2CY.cjs} +8 -8
  38. package/dist/lib/node/{chunk-DDZYVNVP.cjs.map → chunk-SPCSJ2CY.cjs.map} +3 -3
  39. package/dist/lib/node/{chunk-56NGXG2A.cjs → chunk-UX3U4RU2.cjs} +9 -8
  40. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-AO4EW2RX.cjs → chunk-WZR6OAN3.cjs} +6 -5
  42. package/dist/lib/node/{chunk-AO4EW2RX.cjs.map → chunk-WZR6OAN3.cjs.map} +3 -3
  43. package/dist/lib/node/{identity-created-IMDS4A6A.cjs → identity-created-JNDKMFKI.cjs} +7 -7
  44. package/dist/lib/node/index.cjs +93 -92
  45. package/dist/lib/node/index.cjs.map +3 -3
  46. package/dist/lib/node/intent-resolver-NVTAESKB.cjs +536 -0
  47. package/dist/lib/node/intent-resolver-NVTAESKB.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-RB3OM3QG.cjs → react-root-YCHSAYQE.cjs} +12 -12
  50. package/dist/lib/node/{react-surface-TLKQEHHT.cjs → react-surface-ANSZ4FKK.cjs} +72 -76
  51. package/dist/lib/node/react-surface-ANSZ4FKK.cjs.map +7 -0
  52. package/dist/lib/node/{settings-QLCKAUHK.cjs → settings-RBBL22DJ.cjs} +8 -8
  53. package/dist/lib/node/{spaces-ready-RZTKEXOL.cjs → spaces-ready-WHU4J6E5.cjs} +39 -40
  54. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +7 -0
  55. package/dist/lib/node/{state-4UIOUKLJ.cjs → state-WPZC4JXB.cjs} +8 -8
  56. package/dist/lib/node/types/index.cjs +17 -17
  57. package/dist/lib/node/types/index.cjs.map +1 -1
  58. package/dist/lib/node-esm/{app-graph-builder-CD6IYPSS.mjs → app-graph-builder-MS6BI5EW.mjs} +10 -8
  59. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +7 -0
  60. package/dist/lib/node-esm/{app-graph-serializer-CFXS6ZE2.mjs → app-graph-serializer-AWAWDSCM.mjs} +5 -5
  61. package/dist/lib/node-esm/{chunk-CMKML5IN.mjs → chunk-4HICD7AU.mjs} +293 -250
  62. package/dist/lib/node-esm/chunk-4HICD7AU.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-FUMGYUD3.mjs → chunk-77RE7Y5J.mjs} +14 -9
  64. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-M4XTHK35.mjs → chunk-ESWV7ICX.mjs} +3 -3
  66. package/dist/lib/node-esm/{chunk-7FUVU45N.mjs → chunk-ICCM4YRJ.mjs} +3 -2
  67. package/dist/lib/node-esm/{chunk-7FUVU45N.mjs.map → chunk-ICCM4YRJ.mjs.map} +3 -3
  68. package/dist/lib/node-esm/{chunk-375RB3CZ.mjs → chunk-LGL4A5B5.mjs} +3 -2
  69. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-CLGCKZ2D.mjs → chunk-S6VAU6VJ.mjs} +4 -4
  71. package/dist/lib/node-esm/{chunk-CLGCKZ2D.mjs.map → chunk-S6VAU6VJ.mjs.map} +3 -3
  72. package/dist/lib/node-esm/{identity-created-SJYZZ7Q3.mjs → identity-created-3AUSSVEK.mjs} +3 -3
  73. package/dist/lib/node-esm/index.mjs +14 -13
  74. package/dist/lib/node-esm/index.mjs.map +3 -3
  75. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs +538 -0
  76. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs.map +7 -0
  77. package/dist/lib/node-esm/meta.json +1 -1
  78. package/dist/lib/node-esm/{react-root-WKJWCHXR.mjs → react-root-NBQQKAZD.mjs} +6 -6
  79. package/dist/lib/node-esm/{react-surface-RVEHOSAD.mjs → react-surface-G2H5T2D2.mjs} +26 -33
  80. package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs.map +7 -0
  81. package/dist/lib/node-esm/{settings-WLVEO4JM.mjs → settings-VBAUB37B.mjs} +3 -3
  82. package/dist/lib/node-esm/{spaces-ready-ITGYYT5A.mjs → spaces-ready-ABADUX2P.mjs} +31 -32
  83. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +7 -0
  84. package/dist/lib/node-esm/{state-BMISGQ2O.mjs → state-5GH2D5U4.mjs} +3 -3
  85. package/dist/lib/node-esm/types/index.mjs +2 -2
  86. package/dist/types/src/SpacePlugin.d.ts +5 -1
  87. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  89. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/capabilities.d.ts +6 -0
  91. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/index.d.ts +34 -33
  93. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -1
  95. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  98. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +4 -3
  99. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  100. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  101. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  102. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  103. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  104. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  105. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  106. package/dist/types/src/meta.d.ts +1 -0
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/types/types.d.ts +2 -2
  109. package/dist/types/src/util.d.ts.map +1 -1
  110. package/dist/types/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +38 -37
  112. package/src/SpacePlugin.tsx +11 -6
  113. package/src/capabilities/app-graph-builder.ts +4 -3
  114. package/src/capabilities/capabilities.ts +4 -1
  115. package/src/capabilities/intent-resolver.ts +410 -312
  116. package/src/capabilities/react-surface.tsx +22 -30
  117. package/src/capabilities/spaces-ready.ts +20 -21
  118. package/src/components/AwaitingObject.tsx +5 -5
  119. package/src/components/CreateDialog/CreateObjectDialog.tsx +15 -15
  120. package/src/components/CreateDialog/CreateObjectPanel.tsx +114 -115
  121. package/src/components/CreateDialog/CreateSpaceDialog.tsx +18 -9
  122. package/src/components/JoinDialog.tsx +27 -19
  123. package/src/components/SpacePluginSettings.tsx +3 -3
  124. package/src/components/SpacePresence.stories.tsx +2 -2
  125. package/src/components/SpacePresence.tsx +2 -3
  126. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +16 -1
  127. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +3 -4
  128. package/src/components/SyncStatus/InlineSyncStatus.tsx +2 -2
  129. package/src/components/SyncStatus/SyncStatus.tsx +2 -1
  130. package/src/meta.ts +1 -0
  131. package/src/types/types.ts +2 -2
  132. package/src/util.tsx +8 -4
  133. package/dist/lib/browser/app-graph-builder-5D2QB43K.mjs.map +0 -7
  134. package/dist/lib/browser/chunk-6SWQRWOD.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-UH5P4UL3.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-ZBKFJNHH.mjs.map +0 -7
  137. package/dist/lib/browser/intent-resolver-VBL572N7.mjs +0 -459
  138. package/dist/lib/browser/intent-resolver-VBL572N7.mjs.map +0 -7
  139. package/dist/lib/browser/react-surface-E2VSYVNZ.mjs.map +0 -7
  140. package/dist/lib/browser/spaces-ready-4SFNS5JQ.mjs.map +0 -7
  141. package/dist/lib/node/app-graph-builder-ZQ5S62YR.cjs.map +0 -7
  142. package/dist/lib/node/chunk-56NGXG2A.cjs.map +0 -7
  143. package/dist/lib/node/chunk-M64YG2FY.cjs.map +0 -7
  144. package/dist/lib/node/chunk-Z34MTEU7.cjs.map +0 -7
  145. package/dist/lib/node/intent-resolver-S4HZABYI.cjs +0 -458
  146. package/dist/lib/node/intent-resolver-S4HZABYI.cjs.map +0 -7
  147. package/dist/lib/node/react-surface-TLKQEHHT.cjs.map +0 -7
  148. package/dist/lib/node/spaces-ready-RZTKEXOL.cjs.map +0 -7
  149. package/dist/lib/node-esm/app-graph-builder-CD6IYPSS.mjs.map +0 -7
  150. package/dist/lib/node-esm/chunk-375RB3CZ.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-CMKML5IN.mjs.map +0 -7
  152. package/dist/lib/node-esm/chunk-FUMGYUD3.mjs.map +0 -7
  153. package/dist/lib/node-esm/intent-resolver-OIQH7HN7.mjs +0 -460
  154. package/dist/lib/node-esm/intent-resolver-OIQH7HN7.mjs.map +0 -7
  155. package/dist/lib/node-esm/react-surface-RVEHOSAD.mjs.map +0 -7
  156. package/dist/lib/node-esm/spaces-ready-ITGYYT5A.mjs.map +0 -7
  157. /package/dist/lib/browser/{app-graph-serializer-VNWPLPDF.mjs.map → app-graph-serializer-ZGM5NDXE.mjs.map} +0 -0
  158. /package/dist/lib/browser/{chunk-5TBRONF6.mjs.map → chunk-ENRYFGYE.mjs.map} +0 -0
  159. /package/dist/lib/browser/{identity-created-EC5FOCX2.mjs.map → identity-created-VICTPQX7.mjs.map} +0 -0
  160. /package/dist/lib/browser/{react-root-AZJFNTKK.mjs.map → react-root-N6QTWYCV.mjs.map} +0 -0
  161. /package/dist/lib/browser/{settings-ASFF5BZL.mjs.map → settings-HN5UIYQO.mjs.map} +0 -0
  162. /package/dist/lib/browser/{state-MS4KYJWI.mjs.map → state-6DCY5YJP.mjs.map} +0 -0
  163. /package/dist/lib/node/{app-graph-serializer-72S7P33H.cjs.map → app-graph-serializer-AWKVTYAB.cjs.map} +0 -0
  164. /package/dist/lib/node/{chunk-BQRNTKSQ.cjs.map → chunk-I2LRRRMV.cjs.map} +0 -0
  165. /package/dist/lib/node/{identity-created-IMDS4A6A.cjs.map → identity-created-JNDKMFKI.cjs.map} +0 -0
  166. /package/dist/lib/node/{react-root-RB3OM3QG.cjs.map → react-root-YCHSAYQE.cjs.map} +0 -0
  167. /package/dist/lib/node/{settings-QLCKAUHK.cjs.map → settings-RBBL22DJ.cjs.map} +0 -0
  168. /package/dist/lib/node/{state-4UIOUKLJ.cjs.map → state-WPZC4JXB.cjs.map} +0 -0
  169. /package/dist/lib/node-esm/{app-graph-serializer-CFXS6ZE2.mjs.map → app-graph-serializer-AWAWDSCM.mjs.map} +0 -0
  170. /package/dist/lib/node-esm/{chunk-M4XTHK35.mjs.map → chunk-ESWV7ICX.mjs.map} +0 -0
  171. /package/dist/lib/node-esm/{identity-created-SJYZZ7Q3.mjs.map → identity-created-3AUSSVEK.mjs.map} +0 -0
  172. /package/dist/lib/node-esm/{react-root-WKJWCHXR.mjs.map → react-root-NBQQKAZD.mjs.map} +0 -0
  173. /package/dist/lib/node-esm/{settings-WLVEO4JM.mjs.map → settings-VBAUB37B.mjs.map} +0 -0
  174. /package/dist/lib/node-esm/{state-BMISGQ2O.mjs.map → state-5GH2D5U4.mjs.map} +0 -0
@@ -2,9 +2,10 @@
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 { createIntent, 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';
@@ -20,15 +21,16 @@ const initialValues: FormValues = { edgeReplication: true };
20
21
  export const CreateSpaceDialog = () => {
21
22
  const closeRef = useRef<HTMLButtonElement | null>(null);
22
23
  const { t } = useTranslation(SPACE_PLUGIN);
23
- const { dispatchPromise: dispatch } = useIntentDispatcher();
24
+ const { dispatch } = useIntentDispatcher();
24
25
 
25
26
  const handleCreateSpace = useCallback(
26
27
  async (data: FormValues) => {
27
- const result = await dispatch(createIntent(SpaceAction.Create, data));
28
- const target = result.data?.space;
29
- if (target) {
30
- await dispatch(createIntent(SpaceAction.OpenCreateObject, { target }));
31
- }
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 }));
32
+ });
33
+ await Effect.runPromise(program);
32
34
  },
33
35
  [dispatch],
34
36
  );
@@ -36,7 +38,7 @@ export const CreateSpaceDialog = () => {
36
38
  return (
37
39
  // TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
38
40
  // Consider factoring it out to the tabs package.
39
- <Dialog.Content classNames='p-0 bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
41
+ <Dialog.Content classNames='p-0 bs-content min-bs-[16rem] max-bs-full md:max-is-[32rem] overflow-hidden'>
40
42
  <div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
41
43
  <Dialog.Title>{t('create space dialog title')}</Dialog.Title>
42
44
  <Dialog.Close asChild>
@@ -46,7 +48,14 @@ export const CreateSpaceDialog = () => {
46
48
  </Dialog.Close>
47
49
  </div>
48
50
  <div className='p-4'>
49
- <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
+ />
50
59
  </div>
51
60
  </Dialog.Content>
52
61
  );
@@ -4,12 +4,12 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';
8
- import { useGraph } from '@dxos/plugin-graph';
7
+ import { createIntent, LayoutAction, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { log } from '@dxos/log';
9
9
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
10
- import { useSpaces } from '@dxos/react-client/echo';
10
+ import { useClient } from '@dxos/react-client';
11
11
  import { type InvitationResult } from '@dxos/react-client/invitations';
12
- import { Dialog, useTranslation } from '@dxos/react-ui';
12
+ import { Dialog } from '@dxos/react-ui';
13
13
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
14
14
 
15
15
  import { SPACE_PLUGIN } from '../meta';
@@ -21,47 +21,55 @@ export type JoinDialogProps = JoinPanelProps & {
21
21
  };
22
22
 
23
23
  export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialogProps) => {
24
- const { t } = useTranslation(SPACE_PLUGIN);
25
24
  const { dispatchPromise: dispatch } = useIntentDispatcher();
26
- const spaces = useSpaces();
27
- const { graph } = useGraph();
25
+ const client = useClient();
26
+ const { graph } = useAppGraph();
28
27
 
29
28
  const handleDone = useCallback(
30
29
  async (result: InvitationResult | null) => {
31
30
  if (result?.spaceKey) {
32
31
  await Promise.all([
33
32
  dispatch(
34
- createIntent(LayoutAction.SetLayout, {
35
- element: 'toast',
33
+ createIntent(LayoutAction.AddToast, {
34
+ part: 'toast',
36
35
  subject: {
37
36
  id: `${SPACE_PLUGIN}/join-success`,
38
37
  duration: 5_000,
39
- title: t('join success label'),
40
- closeLabel: t('dismiss label'),
38
+ title: ['join success label', { ns: SPACE_PLUGIN }],
39
+ closeLabel: ['dismiss label', { ns: SPACE_PLUGIN }],
41
40
  },
42
41
  }),
43
42
  ),
44
43
  dispatch(
45
- createIntent(LayoutAction.SetLayout, {
46
- element: 'dialog',
47
- state: false,
44
+ createIntent(LayoutAction.UpdateDialog, {
45
+ part: 'dialog',
46
+ options: {
47
+ state: false,
48
+ },
48
49
  }),
49
50
  ),
50
51
  ]);
51
52
  }
52
53
 
53
- const space = spaces.find(({ key }) => result?.spaceKey?.equals(key));
54
+ const space = result?.spaceKey ? client.spaces.get(result.spaceKey) : undefined;
55
+ if (!space) {
56
+ log.warn('Space not found', result?.spaceKey);
57
+ return;
58
+ }
59
+
60
+ await dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: space.id }));
61
+
54
62
  // TODO(wittjosiah): If navigableCollections is false and there's no target,
55
63
  // should try to navigate to the first object of the space replicates.
56
64
  // Potentially this could also be done on the inviters side to ensure there's always a target.
57
65
  const target = result?.target || (navigableCollections ? space?.id : undefined);
58
66
  if (target) {
59
- // Wait for up to 1 second before navigating to the target node.
67
+ // Wait before navigating to the target node.
60
68
  // If the target has not yet replicated, this will trigger a loading toast.
61
69
  await graph.waitForPath({ target }).catch(() => {});
62
70
  await Promise.all([
63
- dispatch(createIntent(NavigationAction.Open, { activeParts: { main: [target] } })),
64
- dispatch(createIntent(NavigationAction.Expose, { id: target })),
71
+ dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [target] })),
72
+ dispatch(createIntent(LayoutAction.Expose, { part: 'navigation', subject: target })),
65
73
  ]);
66
74
  }
67
75
 
@@ -73,7 +81,7 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
73
81
  );
74
82
  }
75
83
  },
76
- [dispatch, spaces],
84
+ [dispatch, client, graph],
77
85
  );
78
86
 
79
87
  return (
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Input, useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormInput } from '@dxos/react-ui-form';
8
+ import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
9
9
 
10
10
  import { SPACE_PLUGIN } from '../meta';
11
11
  import { type SpaceSettingsProps } from '../types';
@@ -14,10 +14,10 @@ export const SpacePluginSettings = ({ settings }: { settings: SpaceSettingsProps
14
14
  const { t } = useTranslation(SPACE_PLUGIN);
15
15
 
16
16
  return (
17
- <>
17
+ <DeprecatedFormContainer>
18
18
  <DeprecatedFormInput label={t('show hidden spaces label')}>
19
19
  <Input.Switch checked={settings.showHidden} onCheckedChange={(checked) => (settings.showHidden = !!checked)} />
20
20
  </DeprecatedFormInput>
21
- </>
21
+ </DeprecatedFormContainer>
22
22
  );
23
23
  };
@@ -7,7 +7,7 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React from 'react';
9
9
 
10
- import { PublicKey } from '@dxos/keys';
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
 
@@ -17,7 +17,7 @@ import translations from '../translations';
17
17
  const nViewers = (n: number, currentlyAttended = true): Member[] =>
18
18
  Array.from({ length: n }, () => ({
19
19
  role: HaloSpaceMember.Role.ADMIN,
20
- identity: { identityKey: PublicKey.random() },
20
+ identity: { did: IdentityDid.random(), identityKey: PublicKey.random() },
21
21
  presence: SpaceMember.PresenceState.ONLINE,
22
22
  lastSeen: Date.now(),
23
23
  currentlyAttended,
@@ -4,10 +4,9 @@
4
4
 
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
 
7
- import { useCapability } from '@dxos/app-framework';
7
+ import { useAppGraph, useCapability } from '@dxos/app-framework';
8
8
  import { generateName } from '@dxos/display-name';
9
9
  import { type Expando } from '@dxos/echo-schema';
10
- import { useGraph } from '@dxos/plugin-graph';
11
10
  import { PublicKey, useClient } from '@dxos/react-client';
12
11
  import { getSpace, useMembers, type SpaceMember, fullyQualifiedId } from '@dxos/react-client/echo';
13
12
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
@@ -210,7 +209,7 @@ export const SmallPresenceLive = ({ id, open, viewers }: SmallPresenceLiveProps)
210
209
  // TODO(wittjosiah): If the attended node is deep in the graph and the graph is not fully loaded
211
210
  // this will result in an empty path until the graph is connected.
212
211
  // TODO(wittjosiah): Consider using this indicator for all open nodes instead of just attended.
213
- const { graph } = useGraph();
212
+ const { graph } = useAppGraph();
214
213
  const attended = useAttended();
215
214
  const startOfAttention = attended.at(-1);
216
215
  const path = usePath(graph, startOfAttention);
@@ -2,14 +2,16 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState } from 'react';
5
+ import React, { useMemo, useState } from 'react';
6
6
 
7
+ import { Surface, useCapabilities } from '@dxos/app-framework';
7
8
  import { useClient } from '@dxos/react-client';
8
9
  import { Button, Clipboard, Dialog, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
9
10
  import { Tabs, type TabsRootProps, type TabsActivePart } from '@dxos/react-ui-tabs';
10
11
  import { SpacePanel, type SpacePanelProps } from '@dxos/shell/react';
11
12
 
12
13
  import { SpaceSettingsPanel, type SpaceSettingsPanelProps } from './SpaceSettingsPanel';
14
+ import { SpaceCapabilities } from '../../capabilities';
13
15
  import { SPACE_PLUGIN } from '../../meta';
14
16
  import { COMPOSER_SPACE_LOCK, getSpaceDisplayName } from '../../util';
15
17
 
@@ -36,6 +38,8 @@ export const SpaceSettingsDialog = ({
36
38
  const [selected, setSelected] = useState<SpaceSettingsTab>(initialTab);
37
39
  const locked = space.properties[COMPOSER_SPACE_LOCK];
38
40
  const name = getSpaceDisplayName(space, { personal: client.spaces.default === space, namesCache });
41
+ const panels = useCapabilities(SpaceCapabilities.SettingsPanel);
42
+ const data = useMemo(() => ({ subject: space }), [space]);
39
43
 
40
44
  return (
41
45
  // TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
@@ -84,6 +88,11 @@ export const SpaceSettingsDialog = ({
84
88
  <Tabs.Tab value='members' disabled={locked}>
85
89
  {t('members tab label')}
86
90
  </Tabs.Tab>
91
+ {panels.map((panel) => (
92
+ <Tabs.Tab key={panel.id} value={panel.id}>
93
+ {toLocalizedString(panel.label, t)}
94
+ </Tabs.Tab>
95
+ ))}
87
96
  </div>
88
97
  </Tabs.Tablist>
89
98
  </div>
@@ -98,6 +107,12 @@ export const SpaceSettingsDialog = ({
98
107
  <SpacePanel space={space} hideHeading target={target} createInvitationUrl={createInvitationUrl} />
99
108
  </Clipboard.Provider>
100
109
  </Tabs.Tabpanel>
110
+
111
+ {panels.map((panel) => (
112
+ <Tabs.Tabpanel key={panel.id} value={panel.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>
113
+ <Surface role={`space-settings--${panel.id}`} data={data} />
114
+ </Tabs.Tabpanel>
115
+ ))}
101
116
  </Tabs.Viewport>
102
117
  </Tabs.Root>
103
118
  </Dialog.Content>
@@ -9,8 +9,7 @@ import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import { type Space } from '@dxos/react-client/echo';
11
11
  import { type ThemedClassName, Input, useTranslation } from '@dxos/react-ui';
12
- import { DeprecatedFormInput } from '@dxos/react-ui-form';
13
- import { mx } from '@dxos/react-ui-theme';
12
+ import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
14
13
 
15
14
  import { SPACE_PLUGIN } from '../../meta';
16
15
 
@@ -41,7 +40,7 @@ export const SpaceSettingsPanel = ({ classNames, space }: SpaceSettingsPanelProp
41
40
  );
42
41
 
43
42
  return (
44
- <div role='form' className={mx('flex flex-col', classNames)}>
43
+ <DeprecatedFormContainer>
45
44
  <DeprecatedFormInput label={t('name label')}>
46
45
  <Input.TextInput
47
46
  placeholder={t('unnamed space label')}
@@ -56,6 +55,6 @@ export const SpaceSettingsPanel = ({ classNames, space }: SpaceSettingsPanelProp
56
55
  <Input.Switch checked={edgeReplication} onCheckedChange={toggleEdgeReplication} />
57
56
  </DeprecatedFormInput>
58
57
  )}
59
- </div>
58
+ </DeprecatedFormContainer>
60
59
  );
61
60
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useEffect, useState } from 'react';
6
6
 
7
- import { useGraph } from '@dxos/plugin-graph';
7
+ import { useAppGraph } from '@dxos/app-framework';
8
8
  import { QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
9
9
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
10
10
  import { useClient } from '@dxos/react-client';
@@ -38,7 +38,7 @@ export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean
38
38
  // TODO(wittjosiah): If the attended node is deep in the graph and the graph is not fully loaded
39
39
  // this will result in an empty path until the graph is connected.
40
40
  // TODO(wittjosiah): Consider using this indicator for all open nodes instead of just attended.
41
- const { graph } = useGraph();
41
+ const { graph } = useAppGraph();
42
42
  const attended = useAttended();
43
43
  const startOfAttention = attended.at(-1);
44
44
  const path = usePath(graph, startOfAttention);
@@ -66,8 +66,9 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
66
66
  <StatusBar.Button title={title}>{icon}</StatusBar.Button>
67
67
  </Popover.Trigger>
68
68
  <Popover.Portal>
69
- <Popover.Content sideOffset={16}>
69
+ <Popover.Content>
70
70
  <SyncStatusDetail state={state} summary={summary} debug={false} />
71
+ <Popover.Arrow />
71
72
  </Popover.Content>
72
73
  </Popover.Portal>
73
74
  </Popover.Root>
package/src/meta.ts CHANGED
@@ -9,4 +9,5 @@ export const SPACE_PLUGIN = 'dxos.org/plugin/space';
9
9
  export const meta = {
10
10
  id: SPACE_PLUGIN,
11
11
  name: 'Spaces',
12
+ icon: 'ph--planet--regular',
12
13
  } satisfies PluginMeta;
@@ -108,7 +108,7 @@ export namespace SpaceAction {
108
108
  input: SpaceForm,
109
109
  output: S.Struct({
110
110
  id: S.String,
111
- activeParts: ActiveParts,
111
+ subject: S.Array(S.String),
112
112
  space: SpaceSchema,
113
113
  }),
114
114
  }) {}
@@ -194,7 +194,7 @@ export namespace SpaceAction {
194
194
  }),
195
195
  output: S.Struct({
196
196
  id: S.String,
197
- activeParts: ActiveParts,
197
+ subject: S.Array(S.String),
198
198
  object: EchoObjectSchema,
199
199
  }),
200
200
  }) {}
package/src/util.tsx CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { createIntent, type PromiseIntentDispatcher, NavigationAction } from '@dxos/app-framework';
5
+ import { createIntent, type PromiseIntentDispatcher, LayoutAction } from '@dxos/app-framework';
6
6
  import { EXPANDO_TYPENAME, getObjectAnnotation, getTypename, type Expando } from '@dxos/echo-schema';
7
7
  import { invariant } from '@dxos/invariant';
8
8
  import { getSchema, isReactiveObject, makeRef } from '@dxos/live-object';
@@ -256,7 +256,7 @@ export const constructSpaceActions = ({
256
256
  properties: {
257
257
  label: ['create object in space label', { ns: SPACE_PLUGIN }],
258
258
  icon: 'ph--plus--regular',
259
- disposition: 'toolbar',
259
+ disposition: 'item',
260
260
  testId: 'spacePlugin.createObject',
261
261
  },
262
262
  },
@@ -273,6 +273,10 @@ export const constructSpaceActions = ({
273
273
  label: ['share space label', { ns: SPACE_PLUGIN }],
274
274
  icon: 'ph--users--regular',
275
275
  disabled: locked,
276
+ disposition: 'toolbar',
277
+ iconOnly: false,
278
+ variant: 'default',
279
+ testId: 'spacePlugin.shareSpace',
276
280
  keyBinding: {
277
281
  macos: 'meta+.',
278
282
  windows: 'alt+.',
@@ -486,10 +490,10 @@ export const constructObjectActions = ({
486
490
  : []),
487
491
  // TODO(wittjosiah): Factor out and apply to all nodes.
488
492
  {
489
- id: NavigationAction.Expose._tag,
493
+ id: getId(LayoutAction.Expose._tag),
490
494
  type: ACTION_TYPE,
491
495
  data: async () => {
492
- await dispatch(createIntent(NavigationAction.Expose, { id: fullyQualifiedId(object) }));
496
+ await dispatch(createIntent(LayoutAction.Expose, { part: 'navigation', subject: fullyQualifiedId(object) }));
493
497
  },
494
498
  properties: {
495
499
  label: ['expose object label', { ns: SPACE_PLUGIN }],
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport {\n Expando,\n Filter,\n FQ_ID_LENGTH,\n getSpace,\n isEchoObject,\n isSpace,\n OBJECT_ID_LENGTH,\n parseId,\n type ReactiveEchoObject,\n SPACE_ID_LENGTH,\n SpaceState,\n type Space,\n} from '@dxos/client/echo';\nimport { getTypename, isDeleted } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, toSignal, type Node } from '@dxos/plugin-graph';\nimport { nonNullable } from '@dxos/util';\n\nimport { SpaceCapabilities } from './capabilities';\nimport { SPACE_PLUGIN } from '../meta';\nimport { CollectionType, SpaceAction, type SpaceSettingsProps } from '../types';\nimport {\n constructObjectActions,\n constructSpaceActions,\n constructSpaceNode,\n createObjectNode,\n memoizeQuery,\n SHARED,\n SPACES,\n} from '../util';\n\nexport default (context: PluginsContext) => {\n const resolve = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n const spacesNode = {\n id: SPACES,\n type: SPACES,\n cacheable: ['label', 'role'],\n properties: {\n label: ['spaces label', { ns: SPACE_PLUGIN }],\n testId: 'spacePlugin.spaces',\n role: 'branch',\n disabled: true,\n childrenPersistenceClass: 'echo',\n onRearrangeChildren: async (nextOrder: Space[]) => {\n const { graph } = context.requestCapability(Capabilities.AppGraph);\n const client = context.requestCapability(ClientCapabilities.Client);\n\n // NOTE: This is needed to ensure order is updated by next animation frame.\n // TODO(wittjosiah): Is there a better way to do this?\n // If not, graph should be passed as an argument to the extension.\n graph._sortEdges(\n SPACES,\n 'outbound',\n nextOrder.map(({ id }) => id),\n );\n\n const {\n objects: [spacesOrder],\n } = await client.spaces.default.db.query(Filter.schema(Expando, { key: SHARED })).run();\n if (spacesOrder) {\n spacesOrder.order = nextOrder.map(({ id }) => id);\n } else {\n log.warn('spaces order object not found');\n }\n },\n },\n };\n\n return contributes(Capabilities.AppGraphBuilder, [\n // Primary actions.\n createExtension({\n id: `${SPACE_PLUGIN}/primary-actions`,\n disposition: 'hoist',\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SpaceAction.OpenCreateSpace._tag,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(SpaceAction.OpenCreateSpace));\n },\n properties: {\n label: ['create space label', { ns: SPACE_PLUGIN }],\n icon: 'ph--plus--regular',\n testId: 'spacePlugin.createSpace',\n disposition: 'item',\n },\n },\n {\n id: SpaceAction.Join._tag,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(SpaceAction.Join));\n },\n properties: {\n label: ['join space label', { ns: SPACE_PLUGIN }],\n icon: 'ph--sign-in--regular',\n testId: 'spacePlugin.joinSpace',\n disposition: 'item',\n },\n },\n ],\n }),\n\n // Create spaces group node.\n createExtension({\n id: `${SPACE_PLUGIN}/root`,\n disposition: 'hoist',\n filter: (node): node is Node<null> => node.id === 'root',\n connector: () => [spacesNode],\n resolver: ({ id }) => (id === SPACES ? spacesNode : undefined),\n }),\n\n // Create space nodes.\n createExtension({\n id: SPACES,\n filter: (node): node is Node<null> => node.id === SPACES,\n connector: () => {\n const client = context.requestCapability(ClientCapabilities.Client);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n\n const isReady = toSignal(\n (onChange) => client.spaces.isReady.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.isReady.get(),\n );\n\n if (!spaces || !isReady) {\n return;\n }\n\n const state = context.requestCapability(SpaceCapabilities.State);\n const settings = context\n .requestCapabilities(Capabilities.SettingsStore)[0]\n ?.getStore<SpaceSettingsProps>(SPACE_PLUGIN)?.value;\n\n // TODO(wittjosiah): During client reset, accessing default space throws.\n try {\n const [spacesOrder] = memoizeQuery(client.spaces.default, Filter.schema(Expando, { key: SHARED }));\n const order: string[] = spacesOrder?.order ?? [];\n const orderMap = new Map(order.map((id, index) => [id, index]));\n return [\n ...spaces\n .filter((space) => orderMap.has(space.id))\n .sort((a, b) => orderMap.get(a.id)! - orderMap.get(b.id)!),\n ...spaces.filter((space) => !orderMap.has(space.id)),\n ]\n .filter((space) => (settings?.showHidden ? true : space.state.get() !== SpaceState.SPACE_INACTIVE))\n .map((space) =>\n constructSpaceNode({\n space,\n navigable: state.navigableCollections,\n personal: space === client.spaces.default,\n namesCache: state.spaceNames,\n resolve,\n }),\n );\n } catch {}\n },\n resolver: ({ id }) => {\n if (id.length !== SPACE_ID_LENGTH) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n\n const isReady = toSignal(\n (onChange) => client.spaces.isReady.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.isReady.get(),\n );\n\n if (!spaces || !isReady) {\n return;\n }\n\n const space = spaces.find((space) => space.id === id);\n if (!space) {\n return;\n }\n\n if (space.state.get() === SpaceState.SPACE_INACTIVE) {\n return false;\n } else {\n const state = context.requestCapability(SpaceCapabilities.State);\n return constructSpaceNode({\n space,\n navigable: state.navigableCollections,\n personal: space === client.spaces.default,\n namesCache: state.spaceNames,\n resolve,\n });\n }\n },\n }),\n\n // Create space actions.\n createExtension({\n id: `${SPACE_PLUGIN}/actions`,\n filter: (node): node is Node<Space> => isSpace(node.data),\n actions: ({ node }) => {\n const space = node.data;\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const client = context.requestCapability(ClientCapabilities.Client);\n const state = context.requestCapability(SpaceCapabilities.State);\n return constructSpaceActions({\n space,\n dispatch,\n personal: space === client.spaces.default,\n migrating: state.sdkMigrationRunning[space.id],\n });\n },\n }),\n\n // Create nodes for objects in the root collection of a space.\n createExtension({\n id: `${SPACE_PLUGIN}/root-collection`,\n filter: (node): node is Node<Space> => isSpace(node.data),\n connector: ({ node }) => {\n const space = node.data;\n const spaceState = toSignal(\n (onChange) => space.state.subscribe(() => onChange()).unsubscribe,\n () => space.state.get(),\n space.id,\n );\n if (spaceState !== SpaceState.SPACE_READY) {\n return;\n }\n\n const collection = space.properties[CollectionType.typename]?.target as CollectionType | undefined;\n if (!collection) {\n return;\n }\n\n const state = context.requestCapability(SpaceCapabilities.State);\n\n return collection.objects\n .map((object) => object.target)\n .filter(nonNullable)\n .map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))\n .filter(nonNullable);\n },\n }),\n\n // Create nodes for objects in a collection or by its fully qualified id.\n createExtension({\n id: `${SPACE_PLUGIN}/objects`,\n filter: (node): node is Node<CollectionType> => node.data instanceof CollectionType,\n connector: ({ node }) => {\n const collection = node.data;\n const space = getSpace(collection);\n if (!space) {\n return;\n }\n\n const state = context.requestCapability(SpaceCapabilities.State);\n\n return collection.objects\n .map((object) => object.target)\n .filter(nonNullable)\n .map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))\n .filter(nonNullable);\n },\n resolver: ({ id }) => {\n if (id.length !== FQ_ID_LENGTH) {\n return;\n }\n\n const [spaceId, objectId] = id.split(':');\n if (spaceId.length !== SPACE_ID_LENGTH && objectId.length !== OBJECT_ID_LENGTH) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const space = client.spaces.get().find((space) => space.id === spaceId);\n if (!space) {\n return;\n }\n\n const spaceState = toSignal(\n (onChange) => space.state.subscribe(() => onChange()).unsubscribe,\n () => space.state.get(),\n space.id,\n );\n if (spaceState !== SpaceState.SPACE_READY) {\n return;\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object) {\n return;\n }\n\n if (isDeleted(object)) {\n return false;\n } else {\n const state = context.requestCapability(SpaceCapabilities.State);\n return createObjectNode({ object, space, resolve, navigable: state.navigableCollections });\n }\n },\n }),\n\n // Create collection actions and action groups.\n createExtension({\n id: `${SPACE_PLUGIN}/object-actions`,\n filter: (node): node is Node<ReactiveEchoObject<any>> => isEchoObject(node.data),\n actions: ({ node }) => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const state = context.requestCapability(SpaceCapabilities.State);\n return constructObjectActions({ node, dispatch, navigable: state.navigableCollections });\n },\n }),\n\n // Create nodes for object settings.\n createExtension({\n id: `${SPACE_PLUGIN}/settings-for-subject`,\n resolver: ({ id }) => {\n // TODO(Zan): Find util (or make one).\n if (!id.endsWith('~settings')) {\n return;\n }\n\n const type = 'orphan-settings-for-subject';\n const icon = 'ph--gear--regular';\n\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const client = context.requestCapability(ClientCapabilities.Client);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n const label = space\n ? space.properties.name || ['unnamed space label', { ns: SPACE_PLUGIN }]\n : ['unnamed object settings label', { ns: SPACE_PLUGIN }];\n\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolve(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object settings label', { ns: SPACE_PLUGIN }];\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n object,\n },\n };\n },\n }),\n ]);\n};\n"],
5
- "mappings": "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",
6
- "names": ["Capabilities", "contributes", "createIntent", "Expando", "Filter", "FQ_ID_LENGTH", "getSpace", "isEchoObject", "isSpace", "OBJECT_ID_LENGTH", "parseId", "SPACE_ID_LENGTH", "SpaceState", "getTypename", "isDeleted", "log", "ClientCapabilities", "createExtension", "toSignal", "nonNullable", "context", "resolve", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "spacesNode", "SPACES", "type", "cacheable", "properties", "label", "ns", "SPACE_PLUGIN", "testId", "role", "disabled", "childrenPersistenceClass", "onRearrangeChildren", "nextOrder", "graph", "requestCapability", "AppGraph", "client", "ClientCapabilities", "Client", "_sortEdges", "map", "objects", "spacesOrder", "spaces", "default", "db", "query", "Filter", "schema", "Expando", "key", "SHARED", "run", "order", "log", "warn", "contributes", "AppGraphBuilder", "createExtension", "disposition", "filter", "node", "actions", "SpaceAction", "OpenCreateSpace", "_tag", "data", "dispatchPromise", "dispatch", "IntentDispatcher", "createIntent", "icon", "Join", "connector", "resolver", "undefined", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "isReady", "state", "SpaceCapabilities", "State", "settings", "SettingsStore", "getStore", "value", "memoizeQuery", "orderMap", "Map", "index", "space", "has", "sort", "a", "b", "showHidden", "SpaceState", "SPACE_INACTIVE", "constructSpaceNode", "navigable", "navigableCollections", "personal", "namesCache", "spaceNames", "length", "SPACE_ID_LENGTH", "isSpace", "constructSpaceActions", "migrating", "sdkMigrationRunning", "spaceState", "SPACE_READY", "collection", "CollectionType", "target", "object", "nonNullable", "createObjectNode", "getSpace", "FQ_ID_LENGTH", "spaceId", "objectId", "split", "OBJECT_ID_LENGTH", "isDeleted", "isEchoObject", "constructObjectActions", "endsWith", "subjectId", "parseId", "name", "showResolvedThreads", "meta", "getTypename", "placeholder"]
7
- }