@dxos/plugin-space 0.7.5-labs.e27f9b9 → 0.7.5-main.2567c87

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 (177) hide show
  1. package/dist/lib/browser/{app-graph-builder-TTM2YZVS.mjs → app-graph-builder-F6XSETHX.mjs} +8 -10
  2. package/dist/lib/browser/app-graph-builder-F6XSETHX.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs → app-graph-serializer-FYJE23GN.mjs} +5 -5
  4. package/dist/lib/browser/{chunk-S5IGZNXJ.mjs → chunk-IZ7QKQ2E.mjs} +9 -14
  5. package/dist/lib/browser/chunk-IZ7QKQ2E.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-PQXZCNAU.mjs → chunk-SOXNANA6.mjs} +2 -3
  7. package/dist/lib/browser/{chunk-PQXZCNAU.mjs.map → chunk-SOXNANA6.mjs.map} +3 -3
  8. package/dist/lib/browser/{chunk-H2AR4OLP.mjs → chunk-SSJ772GK.mjs} +5 -9
  9. package/dist/lib/browser/chunk-SSJ772GK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-ENRYFGYE.mjs → chunk-T36CIHPG.mjs} +3 -3
  11. package/dist/lib/browser/{chunk-RLZQJD47.mjs → chunk-UH5P4UL3.mjs} +2 -3
  12. package/dist/lib/browser/chunk-UH5P4UL3.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-YB3JWCPY.mjs → chunk-XXD33C4E.mjs} +250 -291
  14. package/dist/lib/browser/chunk-XXD33C4E.mjs.map +7 -0
  15. package/dist/lib/browser/{identity-created-VICTPQX7.mjs → identity-created-4Q4PFIC5.mjs} +3 -3
  16. package/dist/lib/browser/index.mjs +13 -14
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs +459 -0
  19. package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-YUF4IL5W.mjs → react-root-BDOPFJGJ.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-YIPKS26R.mjs → react-surface-EGOL2JBL.mjs} +33 -26
  23. package/dist/lib/browser/react-surface-EGOL2JBL.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-HN5UIYQO.mjs → settings-WF67QZSD.mjs} +3 -3
  25. package/dist/lib/browser/{spaces-ready-F57ITJDR.mjs → spaces-ready-WVU7US3C.mjs} +32 -31
  26. package/dist/lib/browser/spaces-ready-WVU7US3C.mjs.map +7 -0
  27. package/dist/lib/browser/{state-6DCY5YJP.mjs → state-MS4KYJWI.mjs} +3 -3
  28. package/dist/lib/browser/types/index.mjs +2 -4
  29. package/dist/lib/node/{app-graph-builder-6N4TEVHH.cjs → app-graph-builder-GKLVZ4PM.cjs} +56 -58
  30. package/dist/lib/node/app-graph-builder-GKLVZ4PM.cjs.map +7 -0
  31. package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs → app-graph-serializer-RMTU5YSC.cjs} +21 -21
  32. package/dist/lib/node/{chunk-UX3U4RU2.cjs → chunk-56NGXG2A.cjs} +8 -9
  33. package/dist/lib/node/chunk-56NGXG2A.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-MMXP2NHE.cjs → chunk-5D4RWKTV.cjs} +60 -65
  35. package/dist/lib/node/chunk-5D4RWKTV.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-HFBC3X66.cjs → chunk-AJRP7AD6.cjs} +251 -292
  37. package/dist/lib/node/chunk-AJRP7AD6.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-WZR6OAN3.cjs → chunk-AO4EW2RX.cjs} +5 -6
  39. package/dist/lib/node/{chunk-WZR6OAN3.cjs.map → chunk-AO4EW2RX.cjs.map} +3 -3
  40. package/dist/lib/node/{chunk-I2LRRRMV.cjs → chunk-UENH2YBM.cjs} +8 -8
  41. package/dist/lib/node/{chunk-SPCSJ2CY.cjs → chunk-YCBBGTFD.cjs} +9 -14
  42. package/dist/lib/node/chunk-YCBBGTFD.cjs.map +7 -0
  43. package/dist/lib/node/{identity-created-JNDKMFKI.cjs → identity-created-QQWX7WX3.cjs} +7 -7
  44. package/dist/lib/node/index.cjs +92 -93
  45. package/dist/lib/node/index.cjs.map +3 -3
  46. package/dist/lib/node/intent-resolver-3NI6AUAI.cjs +458 -0
  47. package/dist/lib/node/intent-resolver-3NI6AUAI.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-2WARZU2P.cjs → react-root-ZTR2J2I3.cjs} +12 -12
  50. package/dist/lib/node/{react-surface-QUY7D43M.cjs → react-surface-75KRPQYT.cjs} +76 -72
  51. package/dist/lib/node/react-surface-75KRPQYT.cjs.map +7 -0
  52. package/dist/lib/node/{settings-RBBL22DJ.cjs → settings-KOVSPA3S.cjs} +8 -8
  53. package/dist/lib/node/{spaces-ready-WHU4J6E5.cjs → spaces-ready-ILVGUHJH.cjs} +40 -39
  54. package/dist/lib/node/spaces-ready-ILVGUHJH.cjs.map +7 -0
  55. package/dist/lib/node/{state-WPZC4JXB.cjs → state-4UIOUKLJ.cjs} +8 -8
  56. package/dist/lib/node/types/index.cjs +16 -18
  57. package/dist/lib/node/types/index.cjs.map +2 -2
  58. package/dist/lib/node-esm/{app-graph-builder-MS6BI5EW.mjs → app-graph-builder-NEHQ5Z63.mjs} +8 -10
  59. package/dist/lib/node-esm/app-graph-builder-NEHQ5Z63.mjs.map +7 -0
  60. package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs → app-graph-serializer-UWWS5OVC.mjs} +5 -5
  61. package/dist/lib/node-esm/{chunk-LGL4A5B5.mjs → chunk-375RB3CZ.mjs} +2 -3
  62. package/dist/lib/node-esm/chunk-375RB3CZ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-77RE7Y5J.mjs → chunk-5QMAPAZD.mjs} +9 -14
  64. package/dist/lib/node-esm/chunk-5QMAPAZD.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs → chunk-7FUVU45N.mjs} +2 -3
  66. package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs.map → chunk-7FUVU45N.mjs.map} +3 -3
  67. package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs → chunk-E5DWIQ3N.mjs} +3 -3
  68. package/dist/lib/node-esm/{chunk-TIFAXTJ5.mjs → chunk-GVOPDPS2.mjs} +250 -291
  69. package/dist/lib/node-esm/chunk-GVOPDPS2.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-S6VAU6VJ.mjs → chunk-HTBGWQEU.mjs} +5 -9
  71. package/dist/lib/node-esm/chunk-HTBGWQEU.mjs.map +7 -0
  72. package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs → identity-created-HMNY2MPB.mjs} +3 -3
  73. package/dist/lib/node-esm/index.mjs +13 -14
  74. package/dist/lib/node-esm/index.mjs.map +3 -3
  75. package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs +460 -0
  76. package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs.map +7 -0
  77. package/dist/lib/node-esm/meta.json +1 -1
  78. package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs → react-root-OUPJA4RY.mjs} +6 -6
  79. package/dist/lib/node-esm/{react-surface-RH57RBYI.mjs → react-surface-7EVWCKIP.mjs} +33 -26
  80. package/dist/lib/node-esm/react-surface-7EVWCKIP.mjs.map +7 -0
  81. package/dist/lib/node-esm/{settings-VBAUB37B.mjs → settings-EDK6WI3V.mjs} +3 -3
  82. package/dist/lib/node-esm/{spaces-ready-ABADUX2P.mjs → spaces-ready-CH3W7OGN.mjs} +32 -31
  83. package/dist/lib/node-esm/spaces-ready-CH3W7OGN.mjs.map +7 -0
  84. package/dist/lib/node-esm/{state-5GH2D5U4.mjs → state-BMISGQ2O.mjs} +3 -3
  85. package/dist/lib/node-esm/types/index.mjs +2 -4
  86. package/dist/types/src/SpacePlugin.d.ts +1 -5
  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 +0 -6
  91. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/index.d.ts +33 -34
  93. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -2
  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 +3 -4
  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 +0 -1
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/types/types.d.ts +2 -5
  109. package/dist/types/src/types/types.d.ts.map +1 -1
  110. package/dist/types/src/util.d.ts.map +1 -1
  111. package/package.json +38 -39
  112. package/src/SpacePlugin.tsx +6 -11
  113. package/src/capabilities/app-graph-builder.ts +3 -4
  114. package/src/capabilities/capabilities.ts +1 -4
  115. package/src/capabilities/intent-resolver.ts +312 -410
  116. package/src/capabilities/react-surface.tsx +30 -22
  117. package/src/capabilities/spaces-ready.ts +21 -20
  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 -114
  121. package/src/components/CreateDialog/CreateSpaceDialog.tsx +8 -10
  122. package/src/components/JoinDialog.tsx +19 -27
  123. package/src/components/SpacePluginSettings.tsx +3 -3
  124. package/src/components/SpacePresence.stories.tsx +2 -2
  125. package/src/components/SpacePresence.tsx +3 -2
  126. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +1 -16
  127. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +4 -3
  128. package/src/components/SyncStatus/InlineSyncStatus.tsx +2 -2
  129. package/src/components/SyncStatus/SyncStatus.tsx +1 -2
  130. package/src/meta.ts +0 -1
  131. package/src/types/types.ts +3 -7
  132. package/src/util.tsx +4 -8
  133. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +0 -7
  134. package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-YB3JWCPY.mjs.map +0 -7
  138. package/dist/lib/browser/intent-resolver-SYYO26PR.mjs +0 -537
  139. package/dist/lib/browser/intent-resolver-SYYO26PR.mjs.map +0 -7
  140. package/dist/lib/browser/react-surface-YIPKS26R.mjs.map +0 -7
  141. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +0 -7
  142. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +0 -7
  143. package/dist/lib/node/chunk-HFBC3X66.cjs.map +0 -7
  144. package/dist/lib/node/chunk-MMXP2NHE.cjs.map +0 -7
  145. package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +0 -7
  146. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +0 -7
  147. package/dist/lib/node/intent-resolver-2MFJV5A7.cjs +0 -536
  148. package/dist/lib/node/intent-resolver-2MFJV5A7.cjs.map +0 -7
  149. package/dist/lib/node/react-surface-QUY7D43M.cjs.map +0 -7
  150. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +0 -7
  151. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +0 -7
  152. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +0 -7
  154. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-TIFAXTJ5.mjs.map +0 -7
  156. package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs +0 -538
  157. package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs.map +0 -7
  158. package/dist/lib/node-esm/react-surface-RH57RBYI.mjs.map +0 -7
  159. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +0 -7
  160. /package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs.map → app-graph-serializer-FYJE23GN.mjs.map} +0 -0
  161. /package/dist/lib/browser/{chunk-ENRYFGYE.mjs.map → chunk-T36CIHPG.mjs.map} +0 -0
  162. /package/dist/lib/browser/{identity-created-VICTPQX7.mjs.map → identity-created-4Q4PFIC5.mjs.map} +0 -0
  163. /package/dist/lib/browser/{react-root-YUF4IL5W.mjs.map → react-root-BDOPFJGJ.mjs.map} +0 -0
  164. /package/dist/lib/browser/{settings-HN5UIYQO.mjs.map → settings-WF67QZSD.mjs.map} +0 -0
  165. /package/dist/lib/browser/{state-6DCY5YJP.mjs.map → state-MS4KYJWI.mjs.map} +0 -0
  166. /package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs.map → app-graph-serializer-RMTU5YSC.cjs.map} +0 -0
  167. /package/dist/lib/node/{chunk-I2LRRRMV.cjs.map → chunk-UENH2YBM.cjs.map} +0 -0
  168. /package/dist/lib/node/{identity-created-JNDKMFKI.cjs.map → identity-created-QQWX7WX3.cjs.map} +0 -0
  169. /package/dist/lib/node/{react-root-2WARZU2P.cjs.map → react-root-ZTR2J2I3.cjs.map} +0 -0
  170. /package/dist/lib/node/{settings-RBBL22DJ.cjs.map → settings-KOVSPA3S.cjs.map} +0 -0
  171. /package/dist/lib/node/{state-WPZC4JXB.cjs.map → state-4UIOUKLJ.cjs.map} +0 -0
  172. /package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs.map → app-graph-serializer-UWWS5OVC.mjs.map} +0 -0
  173. /package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs.map → chunk-E5DWIQ3N.mjs.map} +0 -0
  174. /package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs.map → identity-created-HMNY2MPB.mjs.map} +0 -0
  175. /package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs.map → react-root-OUPJA4RY.mjs.map} +0 -0
  176. /package/dist/lib/node-esm/{settings-VBAUB37B.mjs.map → settings-EDK6WI3V.mjs.map} +0 -0
  177. /package/dist/lib/node-esm/{state-5GH2D5U4.mjs.map → state-BMISGQ2O.mjs.map} +0 -0
@@ -7,14 +7,16 @@ import {
7
7
  contributes,
8
8
  createIntent,
9
9
  createResolver,
10
+ firstIdInPart,
10
11
  LayoutAction,
12
+ NavigationAction,
13
+ openIds,
11
14
  type PluginsContext,
12
15
  } from '@dxos/app-framework';
13
16
  import { type Expando, getTypename, type HasId } from '@dxos/echo-schema';
14
17
  import { invariant } from '@dxos/invariant';
15
18
  import { create, makeRef, type ReactiveObject } from '@dxos/live-object';
16
19
  import { Migrations } from '@dxos/migrations';
17
- import { AttentionCapabilities } from '@dxos/plugin-attention';
18
20
  import { ClientCapabilities } from '@dxos/plugin-client';
19
21
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
20
22
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
@@ -42,477 +44,377 @@ const SPACE_MAX_OBJECTS = 500;
42
44
  type IntentResolverOptions = {
43
45
  createInvitationUrl: (invitationCode: string) => string;
44
46
  context: PluginsContext;
45
- observability?: boolean;
46
47
  };
47
48
 
48
- export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
49
+ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
49
50
  const resolve = (typename: string) =>
50
51
  context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
51
52
 
52
53
  return contributes(Capabilities.IntentResolver, [
53
- createResolver({
54
- intent: SpaceAction.OpenCreateSpace,
55
- resolve: () => ({
56
- intents: [
57
- createIntent(LayoutAction.UpdateDialog, {
58
- part: 'dialog',
59
- subject: CREATE_SPACE_DIALOG,
60
- options: {
61
- blockAlign: 'start',
62
- },
63
- }),
64
- ],
65
- }),
66
- }),
67
- createResolver({
68
- intent: SpaceAction.Create,
69
- resolve: async ({ name, edgeReplication }) => {
70
- const client = context.requestCapability(ClientCapabilities.Client);
71
- const space = await client.spaces.create({ name });
72
- if (edgeReplication) {
73
- await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);
74
- }
75
- await space.waitUntilReady();
76
- const collection = create(CollectionType, { objects: [], views: {} });
77
- space.properties[CollectionType.typename] = makeRef(collection);
54
+ createResolver(SpaceAction.OpenCreateSpace, () => ({
55
+ intents: [
56
+ createIntent(LayoutAction.SetLayout, {
57
+ element: 'dialog',
58
+ component: CREATE_SPACE_DIALOG,
59
+ dialogBlockAlign: 'start',
60
+ }),
61
+ ],
62
+ })),
63
+ createResolver(SpaceAction.Create, async ({ name, edgeReplication }) => {
64
+ const client = context.requestCapability(ClientCapabilities.Client);
65
+ const space = await client.spaces.create({ name });
66
+ if (edgeReplication) {
67
+ await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);
68
+ }
69
+ await space.waitUntilReady();
70
+ const collection = create(CollectionType, { objects: [], views: {} });
71
+ space.properties[CollectionType.typename] = makeRef(collection);
78
72
 
79
- if (Migrations.versionProperty) {
80
- space.properties[Migrations.versionProperty] = Migrations.targetVersion;
81
- }
73
+ if (Migrations.versionProperty) {
74
+ space.properties[Migrations.versionProperty] = Migrations.targetVersion;
75
+ }
82
76
 
83
- return {
84
- data: {
85
- id: space.id,
86
- subject: [space.id],
87
- space,
88
- },
89
- intents: [
90
- ...(observability
91
- ? [
92
- createIntent(ObservabilityAction.SendEvent, {
93
- name: 'space.create',
94
- properties: {
95
- spaceId: space.id,
96
- },
97
- }),
98
- ]
99
- : []),
100
- ],
101
- };
102
- },
103
- }),
104
- createResolver({
105
- intent: SpaceAction.Join,
106
- resolve: ({ invitationCode }) => ({
77
+ return {
78
+ data: {
79
+ space,
80
+ id: space.id,
81
+ activeParts: { main: [space.id] },
82
+ },
107
83
  intents: [
108
- createIntent(LayoutAction.UpdateDialog, {
109
- part: 'dialog',
110
- subject: JOIN_DIALOG,
111
- options: {
112
- blockAlign: 'start',
113
- props: {
114
- initialInvitationCode: invitationCode,
115
- } satisfies Partial<JoinDialogProps>,
84
+ createIntent(ObservabilityAction.SendEvent, {
85
+ name: 'space.create',
86
+ properties: {
87
+ spaceId: space.id,
116
88
  },
117
89
  }),
118
90
  ],
119
- }),
91
+ };
120
92
  }),
121
- createResolver({
122
- intent: SpaceAction.Share,
123
- filter: (data): data is { space: Space } => !data.space.properties[COMPOSER_SPACE_LOCK],
124
- resolve: ({ space }) => {
125
- const attention = context.requestCapability(AttentionCapabilities.Attention);
126
- const current = attention.current.at(-1);
93
+ createResolver(SpaceAction.Join, ({ invitationCode }) => ({
94
+ intents: [
95
+ createIntent(LayoutAction.SetLayout, {
96
+ element: 'dialog',
97
+ component: JOIN_DIALOG,
98
+ dialogBlockAlign: 'start',
99
+ subject: {
100
+ initialInvitationCode: invitationCode,
101
+ } satisfies Partial<JoinDialogProps>,
102
+ }),
103
+ ],
104
+ })),
105
+ createResolver(
106
+ SpaceAction.Share,
107
+ ({ space }) => {
108
+ const location = context.requestCapability(Capabilities.Location);
109
+ const layout = context.requestCapability(Capabilities.Layout);
110
+ const current = firstIdInPart(location.active, layout.layoutMode === 'solo' ? 'solo' : 'main');
127
111
  const target = current?.startsWith(space.id) ? current : undefined;
128
112
 
129
113
  return {
130
114
  intents: [
131
- createIntent(LayoutAction.UpdateDialog, {
132
- part: 'dialog',
133
- subject: SPACE_SETTINGS_DIALOG,
134
- options: {
135
- blockAlign: 'start',
136
- props: {
137
- space,
138
- target,
139
- initialTab: 'members',
140
- createInvitationUrl,
141
- } satisfies Partial<SpaceSettingsDialogProps>,
115
+ createIntent(LayoutAction.SetLayout, {
116
+ element: 'dialog',
117
+ component: SPACE_SETTINGS_DIALOG,
118
+ dialogBlockAlign: 'start',
119
+ subject: {
120
+ space,
121
+ target,
122
+ initialTab: 'members',
123
+ createInvitationUrl,
124
+ } satisfies Partial<SpaceSettingsDialogProps>,
125
+ }),
126
+ createIntent(ObservabilityAction.SendEvent, {
127
+ name: 'space.share',
128
+ properties: {
129
+ space: space.id,
142
130
  },
143
131
  }),
144
- ...(observability
145
- ? [
146
- createIntent(ObservabilityAction.SendEvent, {
147
- name: 'space.share',
148
- properties: {
149
- space: space.id,
150
- },
151
- }),
152
- ]
153
- : []),
154
132
  ],
155
133
  };
156
134
  },
135
+ { filter: (data): data is { space: Space } => !data.space.properties[COMPOSER_SPACE_LOCK] },
136
+ ),
137
+ createResolver(SpaceAction.Lock, ({ space }) => {
138
+ space.properties[COMPOSER_SPACE_LOCK] = true;
139
+ return {
140
+ intents: [
141
+ createIntent(ObservabilityAction.SendEvent, {
142
+ name: 'space.lock',
143
+ properties: {
144
+ spaceId: space.id,
145
+ },
146
+ }),
147
+ ],
148
+ };
157
149
  }),
158
- createResolver({
159
- intent: SpaceAction.Lock,
160
- resolve: ({ space }) => {
161
- space.properties[COMPOSER_SPACE_LOCK] = true;
162
- return {
163
- intents: [
164
- ...(observability
165
- ? [
166
- createIntent(ObservabilityAction.SendEvent, {
167
- name: 'space.lock',
168
- properties: {
169
- spaceId: space.id,
170
- },
171
- }),
172
- ]
173
- : []),
174
- ],
175
- };
176
- },
150
+ createResolver(SpaceAction.Unlock, ({ space }) => {
151
+ space.properties[COMPOSER_SPACE_LOCK] = false;
152
+ return {
153
+ intents: [
154
+ createIntent(ObservabilityAction.SendEvent, {
155
+ name: 'space.unlock',
156
+ properties: {
157
+ spaceId: space.id,
158
+ },
159
+ }),
160
+ ],
161
+ };
177
162
  }),
178
- createResolver({
179
- intent: SpaceAction.Unlock,
180
- resolve: ({ space }) => {
181
- space.properties[COMPOSER_SPACE_LOCK] = false;
182
- return {
183
- intents: [
184
- ...(observability
185
- ? [
186
- createIntent(ObservabilityAction.SendEvent, {
187
- name: 'space.unlock',
188
- properties: {
189
- spaceId: space.id,
190
- },
191
- }),
192
- ]
193
- : []),
194
- ],
195
- };
196
- },
163
+ createResolver(SpaceAction.Rename, ({ caller, space }) => {
164
+ return {
165
+ intents: [
166
+ createIntent(LayoutAction.SetLayout, {
167
+ element: 'popover',
168
+ anchorId: `dxos.org/ui/${caller}/${space.id}`,
169
+ component: POPOVER_RENAME_SPACE,
170
+ subject: space,
171
+ }),
172
+ ],
173
+ };
197
174
  }),
198
- createResolver({
199
- intent: SpaceAction.Rename,
200
- resolve: ({ caller, space }) => {
201
- return {
202
- intents: [
203
- createIntent(LayoutAction.UpdatePopover, {
204
- part: 'popover',
205
- subject: POPOVER_RENAME_SPACE,
206
- options: {
207
- anchorId: `dxos.org/ui/${caller}/${space.id}`,
208
- props: space,
209
- },
210
- }),
211
- ],
212
- };
213
- },
175
+ createResolver(SpaceAction.OpenSettings, ({ space }) => {
176
+ return {
177
+ intents: [
178
+ createIntent(LayoutAction.SetLayout, {
179
+ element: 'dialog',
180
+ component: SPACE_SETTINGS_DIALOG,
181
+ dialogBlockAlign: 'start',
182
+ subject: {
183
+ space,
184
+ initialTab: 'settings',
185
+ createInvitationUrl,
186
+ } satisfies Partial<SpaceSettingsDialogProps>,
187
+ }),
188
+ ],
189
+ };
214
190
  }),
215
- createResolver({
216
- intent: SpaceAction.OpenSettings,
217
- resolve: ({ space }) => {
218
- return {
219
- intents: [
220
- createIntent(LayoutAction.UpdateDialog, {
221
- part: 'dialog',
222
- subject: SPACE_SETTINGS_DIALOG,
223
- options: {
224
- blockAlign: 'start',
225
- props: {
226
- space,
227
- initialTab: 'settings',
228
- createInvitationUrl,
229
- } satisfies Partial<SpaceSettingsDialogProps>,
230
- },
231
- }),
232
- ],
233
- };
234
- },
191
+ createResolver(SpaceAction.Open, async ({ space }) => {
192
+ await space.open();
235
193
  }),
236
- createResolver({
237
- intent: SpaceAction.Open,
238
- resolve: async ({ space }) => {
239
- await space.open();
240
- },
194
+ createResolver(SpaceAction.Close, async ({ space }) => {
195
+ await space.close();
241
196
  }),
242
- createResolver({
243
- intent: SpaceAction.Close,
244
- resolve: async ({ space }) => {
245
- await space.close();
246
- },
197
+ createResolver(SpaceAction.Migrate, async ({ space, version }) => {
198
+ const state = context.requestCapability(SpaceCapabilities.MutableState);
199
+
200
+ if (space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION) {
201
+ state.sdkMigrationRunning[space.id] = true;
202
+ await space.internal.migrate();
203
+ state.sdkMigrationRunning[space.id] = false;
204
+ }
205
+ const result = await Migrations.migrate(space, version);
206
+ return {
207
+ data: result,
208
+ intents: [
209
+ createIntent(ObservabilityAction.SendEvent, {
210
+ name: 'space.migrate',
211
+ properties: {
212
+ spaceId: space.id,
213
+ version,
214
+ },
215
+ }),
216
+ ],
217
+ };
247
218
  }),
248
- createResolver({
249
- intent: SpaceAction.Migrate,
250
- resolve: async ({ space, version }) => {
251
- const state = context.requestCapability(SpaceCapabilities.MutableState);
219
+ createResolver(SpaceAction.OpenCreateObject, ({ target, navigable = true }) => {
220
+ const state = context.requestCapability(SpaceCapabilities.State);
252
221
 
253
- if (space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION) {
254
- state.sdkMigrationRunning[space.id] = true;
255
- await space.internal.migrate();
256
- state.sdkMigrationRunning[space.id] = false;
257
- }
258
- const result = await Migrations.migrate(space, version);
259
- return {
260
- data: result,
261
- intents: [
262
- ...(observability
263
- ? [
264
- createIntent(ObservabilityAction.SendEvent, {
265
- name: 'space.migrate',
266
- properties: {
267
- spaceId: space.id,
268
- version,
269
- },
270
- }),
271
- ]
272
- : []),
273
- ],
274
- };
275
- },
222
+ return {
223
+ intents: [
224
+ createIntent(LayoutAction.SetLayout, {
225
+ element: 'dialog',
226
+ component: CREATE_OBJECT_DIALOG,
227
+ dialogBlockAlign: 'start',
228
+ subject: {
229
+ target,
230
+ shouldNavigate: navigable
231
+ ? (object: ReactiveObject<any>) => !(object instanceof CollectionType) || state.navigableCollections
232
+ : () => false,
233
+ } satisfies Partial<CreateObjectDialogProps>,
234
+ }),
235
+ ],
236
+ };
276
237
  }),
277
- createResolver({
278
- intent: SpaceAction.OpenCreateObject,
279
- resolve: ({ target, navigable = true }) => {
280
- const state = context.requestCapability(SpaceCapabilities.State);
238
+ createResolver(SpaceAction.AddObject, async ({ target, object }) => {
239
+ const space = isSpace(target) ? target : getSpace(target);
240
+ invariant(space, 'Space not found.');
281
241
 
242
+ if (space.db.coreDatabase.getAllObjectIds().length >= SPACE_MAX_OBJECTS) {
282
243
  return {
244
+ error: new Error('Space limit reached.'),
283
245
  intents: [
284
- createIntent(LayoutAction.UpdateDialog, {
285
- part: 'dialog',
286
- subject: CREATE_OBJECT_DIALOG,
287
- options: {
288
- blockAlign: 'start',
289
- props: {
290
- target,
291
- shouldNavigate: navigable
292
- ? (object: ReactiveObject<any>) => !(object instanceof CollectionType) || state.navigableCollections
293
- : () => false,
294
- } satisfies Partial<CreateObjectDialogProps>,
246
+ createIntent(LayoutAction.SetLayout, {
247
+ element: 'toast',
248
+ subject: {
249
+ id: `${SPACE_PLUGIN}/space-limit`,
250
+ title: ['space limit label', { ns: SPACE_PLUGIN }],
251
+ description: ['space limit description', { ns: SPACE_PLUGIN }],
252
+ duration: 5_000,
253
+ icon: 'ph--warning--regular',
254
+ actionLabel: ['remove deleted objects label', { ns: SPACE_PLUGIN }],
255
+ actionAlt: ['remove deleted objects alt', { ns: SPACE_PLUGIN }],
256
+ closeLabel: ['close label', { ns: 'os' }],
257
+ onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
258
+ },
259
+ }),
260
+ createIntent(ObservabilityAction.SendEvent, {
261
+ name: 'space.limit',
262
+ properties: {
263
+ spaceId: space.id,
295
264
  },
296
265
  }),
297
266
  ],
298
267
  };
299
- },
300
- }),
301
- createResolver({
302
- intent: SpaceAction.AddObject,
303
- resolve: async ({ target, object }) => {
304
- const space = isSpace(target) ? target : getSpace(target);
305
- invariant(space, 'Space not found.');
268
+ }
306
269
 
307
- if (space.db.coreDatabase.getAllObjectIds().length >= SPACE_MAX_OBJECTS) {
308
- return {
309
- error: new Error('Space limit reached.'),
310
- intents: [
311
- createIntent(LayoutAction.AddToast, {
312
- part: 'toast',
313
- subject: {
314
- id: `${SPACE_PLUGIN}/space-limit`,
315
- title: ['space limit label', { ns: SPACE_PLUGIN }],
316
- description: ['space limit description', { ns: SPACE_PLUGIN }],
317
- duration: 5_000,
318
- icon: 'ph--warning--regular',
319
- actionLabel: ['remove deleted objects label', { ns: SPACE_PLUGIN }],
320
- actionAlt: ['remove deleted objects alt', { ns: SPACE_PLUGIN }],
321
- closeLabel: ['close label', { ns: 'os' }],
322
- onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
323
- },
324
- }),
325
- ...(observability
326
- ? [
327
- createIntent(ObservabilityAction.SendEvent, {
328
- name: 'space.limit',
329
- properties: {
330
- spaceId: space.id,
331
- },
332
- }),
333
- ]
334
- : []),
335
- ],
336
- };
337
- }
338
-
339
- if (target instanceof CollectionType) {
340
- target.objects.push(makeRef(object as HasId));
341
- } else if (isSpace(target)) {
342
- const collection = space.properties[CollectionType.typename]?.target;
343
- if (collection instanceof CollectionType) {
344
- collection.objects.push(makeRef(object as HasId));
345
- } else {
346
- // TODO(wittjosiah): Can't add non-echo objects by including in a collection because of types.
347
- const collection = create(CollectionType, { objects: [makeRef(object as HasId)], views: {} });
348
- space.properties[CollectionType.typename] = makeRef(collection);
349
- }
270
+ if (target instanceof CollectionType) {
271
+ target.objects.push(makeRef(object as HasId));
272
+ } else if (isSpace(target)) {
273
+ const collection = space.properties[CollectionType.typename]?.target;
274
+ if (collection instanceof CollectionType) {
275
+ collection.objects.push(makeRef(object as HasId));
276
+ } else {
277
+ // TODO(wittjosiah): Can't add non-echo objects by including in a collection because of types.
278
+ const collection = create(CollectionType, { objects: [makeRef(object as HasId)], views: {} });
279
+ space.properties[CollectionType.typename] = makeRef(collection);
350
280
  }
281
+ }
351
282
 
352
- return {
353
- data: {
354
- id: fullyQualifiedId(object),
355
- subject: [fullyQualifiedId(object)],
356
- object: object as HasId,
357
- },
358
- intents: [
359
- ...(observability
360
- ? [
361
- createIntent(ObservabilityAction.SendEvent, {
362
- name: 'space.object.add',
363
- properties: {
364
- spaceId: space.id,
365
- objectId: object.id,
366
- typename: getTypename(object),
367
- },
368
- }),
369
- ]
370
- : []),
371
- ],
372
- };
373
- },
283
+ return {
284
+ data: {
285
+ id: fullyQualifiedId(object),
286
+ object: object as HasId,
287
+ activeParts: { main: [fullyQualifiedId(object)] },
288
+ },
289
+ intents: [
290
+ createIntent(ObservabilityAction.SendEvent, {
291
+ name: 'space.object.add',
292
+ properties: {
293
+ spaceId: space.id,
294
+ objectId: object.id,
295
+ typename: getTypename(object),
296
+ },
297
+ }),
298
+ ],
299
+ };
374
300
  }),
375
- createResolver({
376
- intent: SpaceAction.RemoveObjects,
377
- resolve: async ({ objects, target, deletionData }, undo) => {
378
- const layout = context.requestCapability(Capabilities.Layout);
301
+ createResolver(SpaceAction.RemoveObjects, async ({ objects, target, deletionData }, undo) => {
302
+ const location = context.requestCapability(Capabilities.Location);
379
303
 
380
- // All objects must be a member of the same space.
381
- const space = getSpace(objects[0]);
382
- invariant(space && objects.every((obj) => isEchoObject(obj) && getSpace(obj) === space));
383
- const openObjectIds = new Set<string>(layout.active);
304
+ // All objects must be a member of the same space.
305
+ const space = getSpace(objects[0]);
306
+ invariant(space && objects.every((obj) => isEchoObject(obj) && getSpace(obj) === space));
307
+ const openObjectIds = new Set<string>(openIds(location.active));
384
308
 
385
- if (!undo) {
386
- const parentCollection: CollectionType = target ?? space.properties[CollectionType.typename]?.target;
387
- const nestedObjectsList = await Promise.all(objects.map((obj) => getNestedObjects(obj, resolve)));
309
+ if (!undo) {
310
+ const parentCollection: CollectionType = target ?? space.properties[CollectionType.typename]?.target;
311
+ const nestedObjectsList = await Promise.all(objects.map((obj) => getNestedObjects(obj, resolve)));
388
312
 
389
- const deletionData = {
390
- objects,
391
- parentCollection,
392
- indices: objects.map((obj) =>
393
- parentCollection instanceof CollectionType
394
- ? parentCollection.objects.findIndex((object) => object.target === obj)
395
- : -1,
396
- ),
397
- nestedObjectsList,
398
- wasActive: objects
399
- .flatMap((obj, i) => [obj, ...nestedObjectsList[i]])
400
- .map((obj) => fullyQualifiedId(obj))
401
- .filter((id) => openObjectIds.has(id)),
402
- } satisfies SpaceAction.DeletionData;
313
+ const deletionData = {
314
+ objects,
315
+ parentCollection,
316
+ indices: objects.map((obj) =>
317
+ parentCollection instanceof CollectionType
318
+ ? parentCollection.objects.findIndex((object) => object.target === obj)
319
+ : -1,
320
+ ),
321
+ nestedObjectsList,
322
+ wasActive: objects
323
+ .flatMap((obj, i) => [obj, ...nestedObjectsList[i]])
324
+ .map((obj) => fullyQualifiedId(obj))
325
+ .filter((id) => openObjectIds.has(id)),
326
+ } satisfies SpaceAction.DeletionData;
403
327
 
404
- if (deletionData.parentCollection instanceof CollectionType) {
405
- [...deletionData.indices]
406
- .sort((a, b) => b - a)
407
- .forEach((index: number) => {
408
- if (index !== -1) {
409
- deletionData.parentCollection.objects.splice(index, 1);
410
- }
411
- });
412
- }
328
+ if (deletionData.parentCollection instanceof CollectionType) {
329
+ [...deletionData.indices]
330
+ .sort((a, b) => b - a)
331
+ .forEach((index: number) => {
332
+ if (index !== -1) {
333
+ deletionData.parentCollection.objects.splice(index, 1);
334
+ }
335
+ });
336
+ }
337
+
338
+ deletionData.nestedObjectsList.flat().forEach((obj) => {
339
+ space.db.remove(obj);
340
+ });
341
+ objects.forEach((obj) => space.db.remove(obj));
342
+
343
+ const undoMessageKey = objects.some((obj) => obj instanceof CollectionType)
344
+ ? 'collection deleted label'
345
+ : objects.length > 1
346
+ ? 'objects deleted label'
347
+ : 'object deleted label';
348
+
349
+ return {
350
+ undoable: {
351
+ // TODO(ZaymonFC): Pluralize if more than one object.
352
+ message: [undoMessageKey, { ns: SPACE_PLUGIN }],
353
+ data: { deletionData },
354
+ },
355
+ intents:
356
+ deletionData.wasActive.length > 0
357
+ ? [createIntent(NavigationAction.Close, { activeParts: { main: deletionData.wasActive } })]
358
+ : undefined,
359
+ };
360
+ } else {
361
+ if (
362
+ deletionData?.objects?.length &&
363
+ deletionData.objects.every(isEchoObject) &&
364
+ deletionData.parentCollection instanceof CollectionType
365
+ ) {
366
+ // Restore the object to the space.
367
+ const restoredObjects = deletionData.objects.map((obj: Expando) => space.db.add(obj));
413
368
 
414
- deletionData.nestedObjectsList.flat().forEach((obj) => {
415
- space.db.remove(obj);
369
+ // Restore nested objects to the space.
370
+ deletionData.nestedObjectsList.flat().forEach((obj: Expando) => {
371
+ space.db.add(obj);
416
372
  });
417
- objects.forEach((obj) => space.db.remove(obj));
418
373
 
419
- const undoMessageKey = objects.some((obj) => obj instanceof CollectionType)
420
- ? 'collection deleted label'
421
- : objects.length > 1
422
- ? 'objects deleted label'
423
- : 'object deleted label';
374
+ deletionData.indices.forEach((index: number, i: number) => {
375
+ if (index !== -1) {
376
+ deletionData.parentCollection.objects.splice(index, 0, makeRef(restoredObjects[i] as Expando));
377
+ }
378
+ });
424
379
 
425
380
  return {
426
- undoable: {
427
- // TODO(ZaymonFC): Pluralize if more than one object.
428
- message: [undoMessageKey, { ns: SPACE_PLUGIN }],
429
- data: { deletionData },
430
- },
431
381
  intents:
432
382
  deletionData.wasActive.length > 0
433
383
  ? [
434
- createIntent(LayoutAction.Close, {
435
- part: 'main',
436
- subject: deletionData.wasActive,
437
- options: { state: false },
384
+ createIntent(NavigationAction.Open, {
385
+ activeParts: { main: deletionData.wasActive as string[] },
438
386
  }),
439
387
  ]
440
388
  : undefined,
441
389
  };
442
- } else {
443
- if (
444
- deletionData?.objects?.length &&
445
- deletionData.objects.every(isEchoObject) &&
446
- deletionData.parentCollection instanceof CollectionType
447
- ) {
448
- // Restore the object to the space.
449
- const restoredObjects = deletionData.objects.map((obj: Expando) => space.db.add(obj));
450
-
451
- // Restore nested objects to the space.
452
- deletionData.nestedObjectsList.flat().forEach((obj: Expando) => {
453
- space.db.add(obj);
454
- });
455
-
456
- deletionData.indices.forEach((index: number, i: number) => {
457
- if (index !== -1) {
458
- deletionData.parentCollection.objects.splice(index, 0, makeRef(restoredObjects[i] as Expando));
459
- }
460
- });
461
-
462
- return {
463
- intents:
464
- deletionData.wasActive.length > 0
465
- ? [
466
- createIntent(LayoutAction.Open, {
467
- part: 'main',
468
- subject: deletionData.wasActive,
469
- }),
470
- ]
471
- : undefined,
472
- };
473
- }
474
390
  }
475
- },
391
+ }
476
392
  }),
477
- createResolver({
478
- intent: SpaceAction.RenameObject,
479
- resolve: async ({ object, caller }) => ({
480
- intents: [
481
- createIntent(LayoutAction.UpdatePopover, {
482
- part: 'popover',
483
- subject: POPOVER_RENAME_OBJECT,
484
- options: {
485
- anchorId: `dxos.org/ui/${caller}/${fullyQualifiedId(object)}`,
486
- props: object,
487
- },
488
- }),
489
- ],
490
- }),
491
- }),
492
- createResolver({
493
- intent: SpaceAction.DuplicateObject,
494
- resolve: async ({ object, target }) => {
495
- const space = isSpace(target) ? target : getSpace(target);
496
- invariant(space, 'Space not found.');
393
+ createResolver(SpaceAction.RenameObject, async ({ object, caller }) => ({
394
+ intents: [
395
+ createIntent(LayoutAction.SetLayout, {
396
+ element: 'popover',
397
+ anchorId: `dxos.org/ui/${caller}/${fullyQualifiedId(object)}`,
398
+ component: POPOVER_RENAME_OBJECT,
399
+ subject: object,
400
+ }),
401
+ ],
402
+ })),
403
+ createResolver(SpaceAction.DuplicateObject, async ({ object, target }) => {
404
+ const space = isSpace(target) ? target : getSpace(target);
405
+ invariant(space, 'Space not found.');
497
406
 
498
- const newObject = await cloneObject(object, resolve, space);
499
- return {
500
- intents: [createIntent(SpaceAction.AddObject, { object: newObject, target })],
501
- };
502
- },
503
- }),
504
- createResolver({
505
- intent: SpaceAction.WaitForObject,
506
- resolve: async ({ id }) => {
507
- const state = context.requestCapability(SpaceCapabilities.MutableState);
508
- state.awaiting = id;
509
- },
407
+ const newObject = await cloneObject(object, resolve, space);
408
+ return {
409
+ intents: [createIntent(SpaceAction.AddObject, { object: newObject, target })],
410
+ };
510
411
  }),
511
- createResolver({
512
- intent: CollectionAction.Create,
513
- resolve: async ({ name }) => ({
514
- data: { object: create(CollectionType, { name, objects: [], views: {} }) },
515
- }),
412
+ createResolver(SpaceAction.WaitForObject, async ({ id }) => {
413
+ const state = context.requestCapability(SpaceCapabilities.MutableState);
414
+ state.awaiting = id;
516
415
  }),
416
+ createResolver(CollectionAction.Create, async ({ name }) => ({
417
+ data: { object: create(CollectionType, { name, objects: [], views: {} }) },
418
+ })),
517
419
  ]);
518
420
  };