@dxos/plugin-space 0.7.5-labs.a279d8c → 0.7.5-labs.ea4b4c2

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-PDJ4MLA4.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-4QQST3T2.mjs → react-root-N6QTWYCV.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-JTNUNOJG.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-VCPICVIE.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-TCHYZQY3.cjs → react-root-YCHSAYQE.cjs} +12 -12
  50. package/dist/lib/node/{react-surface-TFPR6QAQ.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-I75ZN2YH.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-BEX2XFJK.mjs → react-root-NBQQKAZD.mjs} +6 -6
  79. package/dist/lib/node-esm/{react-surface-TRLHCJZ3.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 +113 -114
  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-PDJ4MLA4.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-Y6AZTVRL.mjs +0 -459
  138. package/dist/lib/browser/intent-resolver-Y6AZTVRL.mjs.map +0 -7
  139. package/dist/lib/browser/react-surface-JTNUNOJG.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-VCPICVIE.cjs.map +0 -7
  144. package/dist/lib/node/chunk-Z34MTEU7.cjs.map +0 -7
  145. package/dist/lib/node/intent-resolver-MUGCKZPN.cjs +0 -458
  146. package/dist/lib/node/intent-resolver-MUGCKZPN.cjs.map +0 -7
  147. package/dist/lib/node/react-surface-TFPR6QAQ.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-FUMGYUD3.mjs.map +0 -7
  152. package/dist/lib/node-esm/chunk-I75ZN2YH.mjs.map +0 -7
  153. package/dist/lib/node-esm/intent-resolver-6PNQKHDL.mjs +0 -460
  154. package/dist/lib/node-esm/intent-resolver-6PNQKHDL.mjs.map +0 -7
  155. package/dist/lib/node-esm/react-surface-TRLHCJZ3.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-4QQST3T2.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-TCHYZQY3.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-BEX2XFJK.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
@@ -7,16 +7,14 @@ import {
7
7
  contributes,
8
8
  createIntent,
9
9
  createResolver,
10
- firstIdInPart,
11
10
  LayoutAction,
12
- NavigationAction,
13
- openIds,
14
11
  type PluginsContext,
15
12
  } from '@dxos/app-framework';
16
13
  import { type Expando, getTypename, type HasId } from '@dxos/echo-schema';
17
14
  import { invariant } from '@dxos/invariant';
18
15
  import { create, makeRef, type ReactiveObject } from '@dxos/live-object';
19
16
  import { Migrations } from '@dxos/migrations';
17
+ import { AttentionCapabilities } from '@dxos/plugin-attention';
20
18
  import { ClientCapabilities } from '@dxos/plugin-client';
21
19
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
22
20
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
@@ -44,377 +42,477 @@ const SPACE_MAX_OBJECTS = 500;
44
42
  type IntentResolverOptions = {
45
43
  createInvitationUrl: (invitationCode: string) => string;
46
44
  context: PluginsContext;
45
+ observability?: boolean;
47
46
  };
48
47
 
49
- export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
48
+ export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
50
49
  const resolve = (typename: string) =>
51
50
  context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
52
51
 
53
52
  return contributes(Capabilities.IntentResolver, [
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);
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);
72
78
 
73
- if (Migrations.versionProperty) {
74
- space.properties[Migrations.versionProperty] = Migrations.targetVersion;
75
- }
79
+ if (Migrations.versionProperty) {
80
+ space.properties[Migrations.versionProperty] = Migrations.targetVersion;
81
+ }
76
82
 
77
- return {
78
- data: {
79
- space,
80
- id: space.id,
81
- activeParts: { main: [space.id] },
82
- },
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 }) => ({
83
107
  intents: [
84
- createIntent(ObservabilityAction.SendEvent, {
85
- name: 'space.create',
86
- properties: {
87
- spaceId: space.id,
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>,
88
116
  },
89
117
  }),
90
118
  ],
91
- };
119
+ }),
92
120
  }),
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');
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);
111
127
  const target = current?.startsWith(space.id) ? current : undefined;
112
128
 
113
129
  return {
114
130
  intents: [
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,
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>,
130
142
  },
131
143
  }),
144
+ ...(observability
145
+ ? [
146
+ createIntent(ObservabilityAction.SendEvent, {
147
+ name: 'space.share',
148
+ properties: {
149
+ space: space.id,
150
+ },
151
+ }),
152
+ ]
153
+ : []),
132
154
  ],
133
155
  };
134
156
  },
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
- };
149
157
  }),
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
- };
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
+ },
162
177
  }),
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
- };
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
+ },
174
197
  }),
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
- };
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
+ },
190
214
  }),
191
- createResolver(SpaceAction.Open, async ({ space }) => {
192
- await space.open();
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
+ },
193
235
  }),
194
- createResolver(SpaceAction.Close, async ({ space }) => {
195
- await space.close();
236
+ createResolver({
237
+ intent: SpaceAction.Open,
238
+ resolve: async ({ space }) => {
239
+ await space.open();
240
+ },
196
241
  }),
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
- };
242
+ createResolver({
243
+ intent: SpaceAction.Close,
244
+ resolve: async ({ space }) => {
245
+ await space.close();
246
+ },
218
247
  }),
219
- createResolver(SpaceAction.OpenCreateObject, ({ target, navigable = true }) => {
220
- const state = context.requestCapability(SpaceCapabilities.State);
248
+ createResolver({
249
+ intent: SpaceAction.Migrate,
250
+ resolve: async ({ space, version }) => {
251
+ const state = context.requestCapability(SpaceCapabilities.MutableState);
221
252
 
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
- };
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
+ },
237
276
  }),
238
- createResolver(SpaceAction.AddObject, async ({ target, object }) => {
239
- const space = isSpace(target) ? target : getSpace(target);
240
- invariant(space, 'Space not found.');
277
+ createResolver({
278
+ intent: SpaceAction.OpenCreateObject,
279
+ resolve: ({ target, navigable = true }) => {
280
+ const state = context.requestCapability(SpaceCapabilities.State);
241
281
 
242
- if (space.db.coreDatabase.getAllObjectIds().length >= SPACE_MAX_OBJECTS) {
243
282
  return {
244
- error: new Error('Space limit reached.'),
245
283
  intents: [
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,
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>,
264
295
  },
265
296
  }),
266
297
  ],
267
298
  };
268
- }
269
-
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);
280
- }
281
- }
282
-
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
- };
299
+ },
300
300
  }),
301
- createResolver(SpaceAction.RemoveObjects, async ({ objects, target, deletionData }, undo) => {
302
- const location = context.requestCapability(Capabilities.Location);
303
-
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));
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.');
308
306
 
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)));
312
-
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;
327
-
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
- });
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
+ };
336
337
  }
337
338
 
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';
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
+ }
350
+ }
348
351
 
349
352
  return {
350
- undoable: {
351
- // TODO(ZaymonFC): Pluralize if more than one object.
352
- message: [undoMessageKey, { ns: SPACE_PLUGIN }],
353
- data: { deletionData },
353
+ data: {
354
+ id: fullyQualifiedId(object),
355
+ subject: [fullyQualifiedId(object)],
356
+ object: object as HasId,
354
357
  },
355
- intents:
356
- deletionData.wasActive.length > 0
357
- ? [createIntent(NavigationAction.Close, { activeParts: { main: deletionData.wasActive } })]
358
- : undefined,
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
+ ],
359
372
  };
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));
373
+ },
374
+ }),
375
+ createResolver({
376
+ intent: SpaceAction.RemoveObjects,
377
+ resolve: async ({ objects, target, deletionData }, undo) => {
378
+ const layout = context.requestCapability(Capabilities.Layout);
368
379
 
369
- // Restore nested objects to the space.
370
- deletionData.nestedObjectsList.flat().forEach((obj: Expando) => {
371
- space.db.add(obj);
372
- });
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);
384
+
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)));
373
388
 
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
- }
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;
403
+
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
+ }
413
+
414
+ deletionData.nestedObjectsList.flat().forEach((obj) => {
415
+ space.db.remove(obj);
378
416
  });
417
+ objects.forEach((obj) => space.db.remove(obj));
418
+
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';
379
424
 
380
425
  return {
426
+ undoable: {
427
+ // TODO(ZaymonFC): Pluralize if more than one object.
428
+ message: [undoMessageKey, { ns: SPACE_PLUGIN }],
429
+ data: { deletionData },
430
+ },
381
431
  intents:
382
432
  deletionData.wasActive.length > 0
383
433
  ? [
384
- createIntent(NavigationAction.Open, {
385
- activeParts: { main: deletionData.wasActive as string[] },
434
+ createIntent(LayoutAction.Close, {
435
+ part: 'main',
436
+ subject: deletionData.wasActive,
437
+ options: { state: false },
386
438
  }),
387
439
  ]
388
440
  : undefined,
389
441
  };
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
+ }
390
474
  }
391
- }
475
+ },
392
476
  }),
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.');
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.');
406
497
 
407
- const newObject = await cloneObject(object, resolve, space);
408
- return {
409
- intents: [createIntent(SpaceAction.AddObject, { object: newObject, target })],
410
- };
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
+ },
411
510
  }),
412
- createResolver(SpaceAction.WaitForObject, async ({ id }) => {
413
- const state = context.requestCapability(SpaceCapabilities.MutableState);
414
- state.awaiting = id;
511
+ createResolver({
512
+ intent: CollectionAction.Create,
513
+ resolve: async ({ name }) => ({
514
+ data: { object: create(CollectionType, { name, objects: [], views: {} }) },
515
+ }),
415
516
  }),
416
- createResolver(CollectionAction.Create, async ({ name }) => ({
417
- data: { object: create(CollectionType, { name, objects: [], views: {} }) },
418
- })),
419
517
  ]);
420
518
  };