@dxos/plugin-space 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446
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.
- package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs +315 -0
- package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-VRU57AEZ.mjs → app-graph-serializer-DSF2U3A5.mjs} +10 -10
- package/dist/lib/browser/app-graph-serializer-DSF2U3A5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UBSVH2NQ.mjs → chunk-5BDV575R.mjs} +10 -21
- package/dist/lib/browser/chunk-5BDV575R.mjs.map +7 -0
- package/dist/lib/browser/chunk-AYW4IDRT.mjs +275 -0
- package/dist/lib/browser/chunk-AYW4IDRT.mjs.map +7 -0
- package/dist/lib/browser/{chunk-43UQWMD3.mjs → chunk-JZXWPMLA.mjs} +740 -390
- package/dist/lib/browser/chunk-JZXWPMLA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-IQFFOAWD.mjs → chunk-LO5UL6RU.mjs} +173 -78
- package/dist/lib/browser/chunk-LO5UL6RU.mjs.map +7 -0
- package/dist/lib/browser/{identity-created-ANRJHNMQ.mjs → identity-created-JR7BNXFH.mjs} +5 -5
- package/dist/lib/browser/identity-created-JR7BNXFH.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +47 -30
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-KRINV5QI.mjs → intent-resolver-RKYILWWQ.mjs} +106 -98
- package/dist/lib/browser/intent-resolver-RKYILWWQ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-J3SP2HVW.mjs → react-root-6H7NX2M2.mjs} +4 -5
- package/dist/lib/{node-esm/react-root-S2LW4FS7.mjs.map → browser/react-root-6H7NX2M2.mjs.map} +1 -1
- package/dist/lib/browser/{react-surface-J7T2IMH4.mjs → react-surface-7AGLOVMK.mjs} +53 -120
- package/dist/lib/browser/react-surface-7AGLOVMK.mjs.map +7 -0
- package/dist/lib/browser/schema-FHTA26SW.mjs +24 -0
- package/dist/lib/browser/schema-FHTA26SW.mjs.map +7 -0
- package/dist/lib/browser/{schema-tools-MYC4LTQD.mjs → schema-tools-YAXPRIXP.mjs} +22 -22
- package/dist/lib/browser/schema-tools-YAXPRIXP.mjs.map +7 -0
- package/dist/lib/browser/{settings-G24447B7.mjs → settings-PJPTJUPE.mjs} +4 -4
- package/dist/lib/browser/settings-PJPTJUPE.mjs.map +7 -0
- package/dist/lib/browser/{spaces-ready-5I3RKYTT.mjs → spaces-ready-BSSP7HHG.mjs} +17 -18
- package/dist/lib/browser/spaces-ready-BSSP7HHG.mjs.map +7 -0
- package/dist/lib/browser/{state-SI4B5GHC.mjs → state-X7VLCC6E.mjs} +4 -2
- package/dist/lib/browser/state-X7VLCC6E.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +1 -7
- package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs +318 -0
- package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs.map +7 -0
- package/dist/lib/node/{app-graph-serializer-VLBCR3IX.cjs → app-graph-serializer-JELGJUAY.cjs} +22 -22
- package/dist/lib/node/app-graph-serializer-JELGJUAY.cjs.map +7 -0
- package/dist/lib/node/{chunk-MXBE2VET.cjs → chunk-3GKCNADA.cjs} +751 -412
- package/dist/lib/node/chunk-3GKCNADA.cjs.map +7 -0
- package/dist/lib/node/{chunk-5YHUQJVB.cjs → chunk-PU2EYH4E.cjs} +14 -25
- package/dist/lib/node/chunk-PU2EYH4E.cjs.map +7 -0
- package/dist/lib/node/{chunk-SCATWJKX.cjs → chunk-TUZWEPGX.cjs} +198 -100
- package/dist/lib/node/chunk-TUZWEPGX.cjs.map +7 -0
- package/dist/lib/node/chunk-WDEIFDTX.cjs +300 -0
- package/dist/lib/node/chunk-WDEIFDTX.cjs.map +7 -0
- package/dist/lib/node/{identity-created-NIPYGVG3.cjs → identity-created-XU4HFV2T.cjs} +7 -7
- package/dist/lib/node/identity-created-XU4HFV2T.cjs.map +7 -0
- package/dist/lib/node/index.cjs +97 -79
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-MJVRY6YE.cjs → intent-resolver-VJ7YV74L.cjs} +151 -144
- package/dist/lib/node/intent-resolver-VJ7YV74L.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-M4BZ6VXB.cjs → react-root-TEL5RW3N.cjs} +8 -9
- package/dist/lib/node/{react-root-M4BZ6VXB.cjs.map → react-root-TEL5RW3N.cjs.map} +1 -1
- package/dist/lib/node/{react-surface-RYKSYYKM.cjs → react-surface-2H3S5TY5.cjs} +75 -142
- package/dist/lib/node/react-surface-2H3S5TY5.cjs.map +7 -0
- package/dist/lib/node/{schema-defs-2HJLXSNK.cjs → schema-PPJ5BZ3A.cjs} +11 -13
- package/dist/lib/node/schema-PPJ5BZ3A.cjs.map +7 -0
- package/dist/lib/node/{schema-tools-OE3MFYYH.cjs → schema-tools-BLIMOZYY.cjs} +24 -24
- package/dist/lib/node/schema-tools-BLIMOZYY.cjs.map +7 -0
- package/dist/lib/node/{settings-AFWO4AWK.cjs → settings-WVFP2UEP.cjs} +7 -7
- package/dist/lib/node/settings-WVFP2UEP.cjs.map +7 -0
- package/dist/lib/node/{spaces-ready-BMPXSFHF.cjs → spaces-ready-7DNZSUOG.cjs} +24 -25
- package/dist/lib/node/spaces-ready-7DNZSUOG.cjs.map +7 -0
- package/dist/lib/node/{state-L2ZSDKLS.cjs → state-5KX6WBJH.cjs} +7 -5
- package/dist/lib/node/state-5KX6WBJH.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +12 -18
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs +316 -0
- package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-GEUYYXKD.mjs → app-graph-serializer-FXONFKOE.mjs} +10 -10
- package/dist/lib/node-esm/app-graph-serializer-FXONFKOE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5NIBYPVF.mjs → chunk-3ZOUV4DF.mjs} +10 -21
- package/dist/lib/node-esm/chunk-3ZOUV4DF.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FI3WV22Y.mjs → chunk-BEWBZ4Q4.mjs} +740 -390
- package/dist/lib/node-esm/chunk-BEWBZ4Q4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FC4UHDPL.mjs +276 -0
- package/dist/lib/node-esm/chunk-FC4UHDPL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-S2W6HS4A.mjs → chunk-ZGLK25WQ.mjs} +173 -78
- package/dist/lib/node-esm/chunk-ZGLK25WQ.mjs.map +7 -0
- package/dist/lib/node-esm/{identity-created-O5X2FFWU.mjs → identity-created-WJKAS2PV.mjs} +5 -5
- package/dist/lib/node-esm/identity-created-WJKAS2PV.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +47 -30
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-JT6EB47M.mjs → intent-resolver-ZFNSA4CM.mjs} +106 -98
- package/dist/lib/node-esm/intent-resolver-ZFNSA4CM.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-S2LW4FS7.mjs → react-root-PRBJMWLQ.mjs} +4 -5
- package/dist/lib/node-esm/{react-surface-ZNNMO7QQ.mjs → react-surface-RCZG2PNF.mjs} +53 -120
- package/dist/lib/node-esm/react-surface-RCZG2PNF.mjs.map +7 -0
- package/dist/lib/node-esm/schema-OUZKVYM5.mjs +25 -0
- package/dist/lib/node-esm/schema-OUZKVYM5.mjs.map +7 -0
- package/dist/lib/node-esm/{schema-tools-YTJLA3NQ.mjs → schema-tools-IU7EX5A5.mjs} +22 -22
- package/dist/lib/node-esm/schema-tools-IU7EX5A5.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-MJVSCOI4.mjs → settings-FJZPC2TV.mjs} +4 -4
- package/dist/lib/node-esm/settings-FJZPC2TV.mjs.map +7 -0
- package/dist/lib/node-esm/{spaces-ready-XKG57SL5.mjs → spaces-ready-7X5PGB2V.mjs} +17 -18
- package/dist/lib/node-esm/spaces-ready-7X5PGB2V.mjs.map +7 -0
- package/dist/lib/node-esm/{state-QUDYGEU6.mjs → state-Z6E2YTNC.mjs} +4 -2
- package/dist/lib/node-esm/state-Z6E2YTNC.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +1 -7
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +179 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/identity-created.d.ts +2 -2
- package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +184 -9
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +3 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/schema-tools.d.ts +2 -2
- package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -1
- package/dist/types/src/capabilities/schema.d.ts +4 -0
- package/dist/types/src/capabilities/schema.d.ts.map +1 -0
- package/dist/types/src/capabilities/spaces-ready.d.ts +2 -2
- package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
- package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -2
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
- package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/MenuFooter.d.ts +2 -2
- package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
- package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.d.ts +2 -2
- package/dist/types/src/components/ObjectSettingsContainer/AdvancedObjectSettings.d.ts.map +1 -0
- package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.d.ts +2 -2
- package/dist/types/src/components/ObjectSettingsContainer/BaseObjectSettings.d.ts.map +1 -0
- package/dist/types/src/components/ObjectSettingsContainer/ForeignKeys.d.ts.map +1 -0
- package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.d.ts +2 -2
- package/dist/types/src/components/ObjectSettingsContainer/ObjectSettingsContainer.d.ts.map +1 -0
- package/dist/types/src/components/ObjectSettingsContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
- package/dist/types/src/components/PopoverAddSpace.d.ts +4 -0
- package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -0
- package/dist/types/src/components/PopoverRenameObject.d.ts +2 -2
- package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
- package/dist/types/src/components/ShareSpaceButton.d.ts +9 -0
- package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -0
- package/dist/types/src/components/ShareSpaceButton.stories.d.ts +10 -0
- package/dist/types/src/components/ShareSpaceButton.stories.d.ts.map +1 -0
- package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts +7 -0
- package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts.map +1 -0
- package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts +7 -0
- package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts.map +1 -0
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +2 -0
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/index.d.ts +1 -0
- package/dist/types/src/components/SpaceSettings/index.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/Space.d.ts +13 -0
- package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -0
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +8 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +9 -0
- package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -0
- package/dist/types/src/components/SyncStatus/save-tracker.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/status.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/sync-state.d.ts +18 -0
- package/dist/types/src/components/SyncStatus/sync-state.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +3 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -2
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/usePath.d.ts +2 -3
- package/dist/types/src/hooks/usePath.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +242 -17
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/collection.d.ts +8 -9
- package/dist/types/src/types/collection.d.ts.map +1 -1
- package/dist/types/src/types/thread.d.ts +110 -205
- package/dist/types/src/types/thread.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +146 -157
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +20 -36
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +44 -51
- package/src/SpacePlugin.tsx +20 -11
- package/src/capabilities/app-graph-builder.ts +230 -377
- package/src/capabilities/app-graph-serializer.ts +8 -8
- package/src/capabilities/identity-created.ts +5 -5
- package/src/capabilities/index.ts +2 -2
- package/src/capabilities/intent-resolver.ts +110 -94
- package/src/capabilities/react-surface.tsx +50 -111
- package/src/capabilities/schema-tool.test.ts +3 -2
- package/src/capabilities/schema-tools.ts +25 -25
- package/src/capabilities/schema.ts +27 -0
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/spaces-ready.ts +14 -16
- package/src/capabilities/state.ts +5 -3
- package/src/components/AwaitingObject.tsx +1 -1
- package/src/components/CollectionMain.tsx +5 -2
- package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +4 -4
- package/src/components/CreateDialog/CreateObjectDialog.tsx +4 -4
- package/src/components/CreateDialog/CreateObjectPanel.tsx +25 -3
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +3 -6
- package/src/components/MembersContainer.stories.tsx +5 -1
- package/src/components/MembersContainer.tsx +54 -80
- package/src/components/MenuFooter.tsx +2 -2
- package/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.tsx +2 -2
- package/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.tsx +2 -2
- package/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.tsx +4 -4
- package/src/components/PersistenceStatus.tsx +14 -11
- package/src/components/PopoverAddSpace.tsx +46 -0
- package/src/components/PopoverRenameObject.tsx +8 -14
- package/src/components/PopoverRenameSpace.tsx +0 -8
- package/src/components/ShareSpaceButton.stories.tsx +27 -0
- package/src/components/ShareSpaceButton.tsx +32 -0
- package/src/components/SpacePluginSettings.tsx +2 -27
- package/src/components/SpacePresence.stories.tsx +1 -1
- package/src/components/SpacePresence.tsx +65 -60
- package/src/components/SpaceSettings/{SpaceSettingsContainer.stories.tsx → SpacePropertiesForm.stories.tsx} +6 -6
- package/src/components/SpaceSettings/SpacePropertiesForm.tsx +136 -0
- package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +39 -159
- package/src/components/SpaceSettings/index.ts +1 -0
- package/src/components/SyncStatus/InlineSyncStatus.tsx +24 -15
- package/src/components/SyncStatus/Space.tsx +133 -0
- package/src/components/SyncStatus/SyncStatus.tsx +69 -6
- package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +89 -0
- package/src/components/SyncStatus/sync-state.ts +101 -0
- package/src/components/index.ts +3 -2
- package/src/hooks/index.ts +0 -2
- package/src/hooks/usePath.ts +6 -9
- package/src/index.ts +0 -1
- package/src/translations.ts +7 -19
- package/src/types/collection.ts +4 -6
- package/src/types/thread.ts +8 -14
- package/src/types/types.ts +101 -115
- package/src/util.tsx +172 -75
- package/dist/lib/browser/app-graph-builder-7X3SIPCD.mjs +0 -328
- package/dist/lib/browser/app-graph-builder-7X3SIPCD.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-VRU57AEZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-43UQWMD3.mjs.map +0 -7
- package/dist/lib/browser/chunk-AR5R2F6B.mjs +0 -88
- package/dist/lib/browser/chunk-AR5R2F6B.mjs.map +0 -7
- package/dist/lib/browser/chunk-CY35NLWL.mjs +0 -296
- package/dist/lib/browser/chunk-CY35NLWL.mjs.map +0 -7
- package/dist/lib/browser/chunk-IQFFOAWD.mjs.map +0 -7
- package/dist/lib/browser/chunk-UBSVH2NQ.mjs.map +0 -7
- package/dist/lib/browser/identity-created-ANRJHNMQ.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-KRINV5QI.mjs.map +0 -7
- package/dist/lib/browser/react-surface-J7T2IMH4.mjs.map +0 -7
- package/dist/lib/browser/schema-defs-OCBY7APN.mjs +0 -26
- package/dist/lib/browser/schema-defs-OCBY7APN.mjs.map +0 -7
- package/dist/lib/browser/schema-tools-MYC4LTQD.mjs.map +0 -7
- package/dist/lib/browser/settings-G24447B7.mjs.map +0 -7
- package/dist/lib/browser/spaces-ready-5I3RKYTT.mjs.map +0 -7
- package/dist/lib/browser/state-SI4B5GHC.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-C2ISDMSL.cjs +0 -328
- package/dist/lib/node/app-graph-builder-C2ISDMSL.cjs.map +0 -7
- package/dist/lib/node/app-graph-serializer-VLBCR3IX.cjs.map +0 -7
- package/dist/lib/node/chunk-5YHUQJVB.cjs.map +0 -7
- package/dist/lib/node/chunk-DQN4ZQDW.cjs +0 -119
- package/dist/lib/node/chunk-DQN4ZQDW.cjs.map +0 -7
- package/dist/lib/node/chunk-K6ZO4WDJ.cjs +0 -324
- package/dist/lib/node/chunk-K6ZO4WDJ.cjs.map +0 -7
- package/dist/lib/node/chunk-MXBE2VET.cjs.map +0 -7
- package/dist/lib/node/chunk-SCATWJKX.cjs.map +0 -7
- package/dist/lib/node/identity-created-NIPYGVG3.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-MJVRY6YE.cjs.map +0 -7
- package/dist/lib/node/react-surface-RYKSYYKM.cjs.map +0 -7
- package/dist/lib/node/schema-defs-2HJLXSNK.cjs.map +0 -7
- package/dist/lib/node/schema-tools-OE3MFYYH.cjs.map +0 -7
- package/dist/lib/node/settings-AFWO4AWK.cjs.map +0 -7
- package/dist/lib/node/spaces-ready-BMPXSFHF.cjs.map +0 -7
- package/dist/lib/node/state-L2ZSDKLS.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-WVCQZ324.mjs +0 -329
- package/dist/lib/node-esm/app-graph-builder-WVCQZ324.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-GEUYYXKD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5NIBYPVF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CLRCW6PU.mjs +0 -297
- package/dist/lib/node-esm/chunk-CLRCW6PU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FI3WV22Y.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HNKAG5CX.mjs +0 -90
- package/dist/lib/node-esm/chunk-HNKAG5CX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-S2W6HS4A.mjs.map +0 -7
- package/dist/lib/node-esm/identity-created-O5X2FFWU.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-JT6EB47M.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-ZNNMO7QQ.mjs.map +0 -7
- package/dist/lib/node-esm/schema-defs-B74N3GQ5.mjs +0 -27
- package/dist/lib/node-esm/schema-defs-B74N3GQ5.mjs.map +0 -7
- package/dist/lib/node-esm/schema-tools-YTJLA3NQ.mjs.map +0 -7
- package/dist/lib/node-esm/settings-MJVSCOI4.mjs.map +0 -7
- package/dist/lib/node-esm/spaces-ready-XKG57SL5.mjs.map +0 -7
- package/dist/lib/node-esm/state-QUDYGEU6.mjs.map +0 -7
- package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
- package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
- package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
- package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
- package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
- package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
- package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
- package/dist/types/src/components/SchemaContainer.d.ts +0 -13
- package/dist/types/src/components/SchemaContainer.d.ts.map +0 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +0 -7
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +0 -1
- package/dist/types/src/hooks/useActiveSpace.d.ts +0 -4
- package/dist/types/src/hooks/useActiveSpace.d.ts.map +0 -1
- package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +0 -14
- package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +0 -1
- package/src/capabilities/schema-defs.ts +0 -30
- package/src/components/SchemaContainer.tsx +0 -59
- package/src/hooks/useActiveSpace.ts +0 -20
- package/src/hooks/useInputSurfaceLookup.tsx +0 -31
- /package/dist/lib/{browser/react-root-J3SP2HVW.mjs.map → node-esm/react-root-PRBJMWLQ.mjs.map} +0 -0
- /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.d.ts +0 -0
- /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/index.d.ts +0 -0
- /package/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.tsx +0 -0
- /package/src/components/{ObjectSettings → ObjectSettingsContainer}/index.ts +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { type HTMLAttributes, useEffect, useState } from 'react';
|
|
6
|
+
|
|
7
|
+
import { useClient } from '@dxos/react-client';
|
|
8
|
+
import { type SpaceId, useSpace } from '@dxos/react-client/echo';
|
|
9
|
+
import { Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
10
|
+
import { type ThemedClassName } from '@dxos/react-ui';
|
|
11
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
12
|
+
|
|
13
|
+
import { type Progress, type PeerSyncState } from './sync-state';
|
|
14
|
+
import { SPACE_PLUGIN } from '../../meta';
|
|
15
|
+
import { getSpaceDisplayName } from '../../util';
|
|
16
|
+
|
|
17
|
+
export const SYNC_STALLED_TIMEOUT = 5_000;
|
|
18
|
+
|
|
19
|
+
// TODO(wittjosiah): Define sematic color tokens.
|
|
20
|
+
const styles = {
|
|
21
|
+
barBg: 'bg-neutral-50 dark:bg-green-900 text-black',
|
|
22
|
+
barFg: 'bg-neutral-100 bg-green-500',
|
|
23
|
+
barHover: 'dark:hover:bg-green-500',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const useActive = (count: number) => {
|
|
27
|
+
const [current, setCurrent] = useState(count);
|
|
28
|
+
const [active, setActive] = useState(false);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
let t: NodeJS.Timeout | undefined;
|
|
31
|
+
if (count !== current) {
|
|
32
|
+
setActive(true);
|
|
33
|
+
setCurrent(count);
|
|
34
|
+
t && clearTimeout(t);
|
|
35
|
+
t = setTimeout(() => {
|
|
36
|
+
setActive(false);
|
|
37
|
+
}, SYNC_STALLED_TIMEOUT);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return () => {
|
|
41
|
+
setActive(false);
|
|
42
|
+
clearTimeout(t);
|
|
43
|
+
};
|
|
44
|
+
}, [count, current]);
|
|
45
|
+
return active;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export type SpaceRowContainerProps = Omit<SpaceRowProps, 'spaceName'>;
|
|
49
|
+
|
|
50
|
+
export const SpaceRowContainer = ({ spaceId, state }: SpaceRowContainerProps) => {
|
|
51
|
+
const { t } = useTranslation(SPACE_PLUGIN);
|
|
52
|
+
const client = useClient();
|
|
53
|
+
const space = useSpace(spaceId);
|
|
54
|
+
if (!space) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const spaceName = toLocalizedString(getSpaceDisplayName(space, { personal: space === client.spaces.default }), t);
|
|
59
|
+
|
|
60
|
+
return <SpaceRow spaceId={spaceId} spaceName={spaceName} state={state} />;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export type SpaceRowProps = {
|
|
64
|
+
spaceId: SpaceId;
|
|
65
|
+
spaceName: string;
|
|
66
|
+
state: PeerSyncState;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const SpaceRow = ({
|
|
70
|
+
spaceId,
|
|
71
|
+
spaceName,
|
|
72
|
+
state: { localDocumentCount, remoteDocumentCount, missingOnLocal, missingOnRemote },
|
|
73
|
+
}: SpaceRowProps) => {
|
|
74
|
+
const downActive = useActive(localDocumentCount);
|
|
75
|
+
const upActive = useActive(remoteDocumentCount);
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<div
|
|
79
|
+
className='flex items-center mx-0.5 gap-0.5 cursor-pointer'
|
|
80
|
+
title={spaceId}
|
|
81
|
+
onClick={() => {
|
|
82
|
+
void navigator.clipboard.writeText(spaceId);
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
<span className='is-1/2 truncate'>{spaceName}</span>
|
|
86
|
+
<Icon
|
|
87
|
+
icon='ph--arrow-fat-line-left--regular'
|
|
88
|
+
size={3}
|
|
89
|
+
classNames={mx(downActive && 'animate-[pulse_1s_infinite]')}
|
|
90
|
+
/>
|
|
91
|
+
<Candle
|
|
92
|
+
up={{ count: remoteDocumentCount, total: remoteDocumentCount + missingOnRemote }}
|
|
93
|
+
down={{ count: localDocumentCount, total: localDocumentCount + missingOnLocal }}
|
|
94
|
+
title={spaceId}
|
|
95
|
+
/>
|
|
96
|
+
<Icon
|
|
97
|
+
icon='ph--arrow-fat-line-right--regular'
|
|
98
|
+
size={3}
|
|
99
|
+
classNames={mx(upActive && 'animate-[pulse_1s_step-start_infinite]')}
|
|
100
|
+
/>
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
type CandleProps = ThemedClassName<Pick<HTMLAttributes<HTMLDivElement>, 'title'>> & { up: Progress; down: Progress };
|
|
106
|
+
|
|
107
|
+
const Candle = ({ classNames, up, down }: CandleProps) => {
|
|
108
|
+
return (
|
|
109
|
+
<div className={mx('grid grid-cols-[1fr_2rem_1fr] w-full h-3', classNames)}>
|
|
110
|
+
<Bar classNames='justify-end' {...up} />
|
|
111
|
+
<div className='relative'>
|
|
112
|
+
<div className={mx('absolute inset-0 flex items-center justify-center text-xs', styles.barBg)}>{up.total}</div>
|
|
113
|
+
</div>
|
|
114
|
+
<Bar {...down} />
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const Bar = ({ classNames, count, total }: ThemedClassName<Progress>) => {
|
|
120
|
+
let p = (count / total) * 100;
|
|
121
|
+
if (count < total) {
|
|
122
|
+
p = Math.min(p, 95);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return (
|
|
126
|
+
<div className={mx('relative flex w-full', styles.barBg, classNames)}>
|
|
127
|
+
<div className={mx('shrink-0', styles.barFg)} style={{ width: `${p}%` }}></div>
|
|
128
|
+
{count !== total && (
|
|
129
|
+
<div className='absolute top-0 bottom-0 flex items-center mx-0.5 text-black text-xs'>{count}</div>
|
|
130
|
+
)}
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
};
|
|
@@ -2,19 +2,22 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { useEffect, useState } from 'react';
|
|
5
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { StatusBar } from '@dxos/plugin-status-bar';
|
|
8
8
|
import { useClient } from '@dxos/react-client';
|
|
9
|
-
import {
|
|
10
|
-
import { Icon, useTranslation } from '@dxos/react-ui';
|
|
9
|
+
import { type SpaceId } from '@dxos/react-client/echo';
|
|
10
|
+
import { Icon, Input, Popover, useTranslation } from '@dxos/react-ui';
|
|
11
|
+
import { type ThemedClassName } from '@dxos/react-ui';
|
|
12
|
+
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
13
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
11
14
|
|
|
15
|
+
import { SpaceRowContainer, SYNC_STALLED_TIMEOUT } from './Space';
|
|
12
16
|
import { createClientSaveTracker } from './save-tracker';
|
|
13
17
|
import { getIcon, getStatus } from './status';
|
|
18
|
+
import { type PeerSyncState, type SpaceSyncStateMap, getSyncSummary, useSyncState } from './sync-state';
|
|
14
19
|
import { SPACE_PLUGIN } from '../../meta';
|
|
15
20
|
|
|
16
|
-
const SYNC_STALLED_TIMEOUT = 5_000;
|
|
17
|
-
|
|
18
21
|
export const SyncStatus = () => {
|
|
19
22
|
const client = useClient();
|
|
20
23
|
const state = useSyncState();
|
|
@@ -54,5 +57,65 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
|
|
|
54
57
|
const title = t(`${status} label`);
|
|
55
58
|
const icon = <Icon icon={getIcon(status)} size={4} classNames={classNames} />;
|
|
56
59
|
|
|
57
|
-
|
|
60
|
+
if (offline) {
|
|
61
|
+
return <StatusBar.Item title={title}>{icon}</StatusBar.Item>;
|
|
62
|
+
} else {
|
|
63
|
+
return (
|
|
64
|
+
<Popover.Root>
|
|
65
|
+
<Popover.Trigger asChild>
|
|
66
|
+
<StatusBar.Button title={title}>{icon}</StatusBar.Button>
|
|
67
|
+
</Popover.Trigger>
|
|
68
|
+
<Popover.Portal>
|
|
69
|
+
<Popover.Content>
|
|
70
|
+
<SyncStatusDetail state={state} summary={summary} debug={false} />
|
|
71
|
+
<Popover.Arrow />
|
|
72
|
+
</Popover.Content>
|
|
73
|
+
</Popover.Portal>
|
|
74
|
+
</Popover.Root>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export type SyncStatusDetailProps = ThemedClassName<{
|
|
80
|
+
state: SpaceSyncStateMap;
|
|
81
|
+
summary: PeerSyncState;
|
|
82
|
+
debug?: boolean;
|
|
83
|
+
}>;
|
|
84
|
+
|
|
85
|
+
// TODO(wittjosiah): This currently does not show `differentDocuments` at all.
|
|
86
|
+
export const SyncStatusDetail = ({ classNames, state, summary, debug }: SyncStatusDetailProps) => {
|
|
87
|
+
const [showAll, setShowAll] = useState(false);
|
|
88
|
+
const { t } = useTranslation(SPACE_PLUGIN);
|
|
89
|
+
const entries = Object.entries(state)
|
|
90
|
+
.filter(([_, value]) => showAll || value.missingOnLocal + value.missingOnRemote > 0)
|
|
91
|
+
.toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
92
|
+
|
|
93
|
+
const handleCheckedChange = useCallback((state: boolean) => setShowAll(state), [setShowAll]);
|
|
94
|
+
|
|
95
|
+
// TODO(burdon): Normalize to max document count?
|
|
96
|
+
return (
|
|
97
|
+
<div className={mx('flex flex-col gap-3 p-2 text-xs min-w-[400px]', classNames)}>
|
|
98
|
+
<div role='none' className='flex items-center'>
|
|
99
|
+
<h1 className='flex-1'>{t('sync status title')}</h1>
|
|
100
|
+
<div className='flex items-center gap-2'>
|
|
101
|
+
<Input.Root>
|
|
102
|
+
<Input.Label classNames='text-xs'>{t('show all label')}</Input.Label>
|
|
103
|
+
<Input.Checkbox checked={showAll} onCheckedChange={handleCheckedChange} />
|
|
104
|
+
</Input.Root>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
<div className='flex flex-col gap-2'>
|
|
108
|
+
{entries.length === 0 && (
|
|
109
|
+
<div role='none' className='flex justify-center'>
|
|
110
|
+
{/* TODO(wittjosiah): This text should be updated once status includes different documents. */}
|
|
111
|
+
{t('no sync status label')}
|
|
112
|
+
</div>
|
|
113
|
+
)}
|
|
114
|
+
{entries.map(([spaceId, state]) => (
|
|
115
|
+
<SpaceRowContainer key={spaceId} spaceId={spaceId as SpaceId} state={state} />
|
|
116
|
+
))}
|
|
117
|
+
</div>
|
|
118
|
+
{debug && <SyntaxHighlighter language='json'>{JSON.stringify(summary, null, 2)}</SyntaxHighlighter>}
|
|
119
|
+
</div>
|
|
120
|
+
);
|
|
58
121
|
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxos-theme';
|
|
6
|
+
|
|
7
|
+
import { type Meta, type StoryObj } from '@storybook/react';
|
|
8
|
+
import React, { useState } from 'react';
|
|
9
|
+
|
|
10
|
+
import { type Client } from '@dxos/client';
|
|
11
|
+
import { faker } from '@dxos/random';
|
|
12
|
+
import { useClient } from '@dxos/react-client';
|
|
13
|
+
import { withClientProvider } from '@dxos/react-client/testing';
|
|
14
|
+
import { useAsyncEffect } from '@dxos/react-ui';
|
|
15
|
+
import { withTheme, withLayout } from '@dxos/storybook-utils';
|
|
16
|
+
|
|
17
|
+
import { SyncStatusDetail } from './SyncStatus';
|
|
18
|
+
import { getSyncSummary, type SpaceSyncStateMap } from './sync-state';
|
|
19
|
+
import translations from '../../translations';
|
|
20
|
+
|
|
21
|
+
const random = ({ min, max }: { min: number; max: number }) => min + Math.floor(Math.random() * (max - min));
|
|
22
|
+
|
|
23
|
+
const createSpaceSyncStateMap = async (client: Client): Promise<SpaceSyncStateMap> => {
|
|
24
|
+
const spaces = await Promise.all(
|
|
25
|
+
Array.from({ length: 10 }).map(() => client.spaces.create({ name: faker.company.name() })),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
return spaces.reduce<SpaceSyncStateMap>((map, space, i) => {
|
|
29
|
+
if (i > 4) {
|
|
30
|
+
const total = random({ min: 10, max: 500 });
|
|
31
|
+
map[space.id] = {
|
|
32
|
+
localDocumentCount: total,
|
|
33
|
+
remoteDocumentCount: total,
|
|
34
|
+
missingOnLocal: 0,
|
|
35
|
+
missingOnRemote: 0,
|
|
36
|
+
differentDocuments: 0,
|
|
37
|
+
};
|
|
38
|
+
return map;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const total = random({ min: 10, max: 500 });
|
|
42
|
+
const haveLocal = random({ min: 0, max: total });
|
|
43
|
+
const haveRemote = random({ min: 0, max: total });
|
|
44
|
+
map[space.id] = {
|
|
45
|
+
localDocumentCount: haveLocal,
|
|
46
|
+
remoteDocumentCount: haveRemote,
|
|
47
|
+
missingOnLocal: total - haveLocal,
|
|
48
|
+
missingOnRemote: total - haveRemote,
|
|
49
|
+
differentDocuments: 0,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return map;
|
|
53
|
+
}, {});
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const meta: Meta<typeof SyncStatusDetail> = {
|
|
57
|
+
title: 'plugins/plugin-space/SyncStatusDetail',
|
|
58
|
+
component: SyncStatusDetail,
|
|
59
|
+
decorators: [withTheme, withLayout(), withClientProvider({ createIdentity: true })],
|
|
60
|
+
parameters: {
|
|
61
|
+
translations,
|
|
62
|
+
layout: 'centered',
|
|
63
|
+
},
|
|
64
|
+
args: {
|
|
65
|
+
classNames: 'm-2 border border-separator rounded-md',
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default meta;
|
|
70
|
+
|
|
71
|
+
type Story = StoryObj<typeof SyncStatusDetail>;
|
|
72
|
+
|
|
73
|
+
export const Default: Story = {
|
|
74
|
+
render: (args) => {
|
|
75
|
+
return <SyncStatusDetail {...args} state={{}} />;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const Sync: Story = {
|
|
80
|
+
render: (args) => {
|
|
81
|
+
const client = useClient();
|
|
82
|
+
const [state, setState] = useState<SpaceSyncStateMap>({});
|
|
83
|
+
useAsyncEffect(async () => {
|
|
84
|
+
setState(await createSpaceSyncStateMap(client));
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return <SyncStatusDetail {...args} state={state} summary={getSyncSummary(state)} />;
|
|
88
|
+
},
|
|
89
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type Space, type SpaceId, type SpaceSyncState } from '@dxos/client/echo';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
9
|
+
import { EdgeService } from '@dxos/protocols';
|
|
10
|
+
import { useClient } from '@dxos/react-client';
|
|
11
|
+
|
|
12
|
+
export type Progress = { count: number; total: number };
|
|
13
|
+
|
|
14
|
+
export type PeerSyncState = Omit<SpaceSyncState.PeerState, 'peerId'>;
|
|
15
|
+
|
|
16
|
+
export type SpaceSyncStateMap = Record<SpaceId, PeerSyncState>;
|
|
17
|
+
|
|
18
|
+
export const createEmptyEdgeSyncState = (): PeerSyncState => ({
|
|
19
|
+
missingOnLocal: 0,
|
|
20
|
+
missingOnRemote: 0,
|
|
21
|
+
localDocumentCount: 0,
|
|
22
|
+
remoteDocumentCount: 0,
|
|
23
|
+
differentDocuments: 0,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const getSyncSummary = (syncMap: SpaceSyncStateMap): PeerSyncState => {
|
|
27
|
+
return Object.entries(syncMap).reduce<PeerSyncState>((summary, [_spaceId, peerState]) => {
|
|
28
|
+
summary.missingOnLocal += peerState.missingOnLocal;
|
|
29
|
+
summary.missingOnRemote += peerState.missingOnRemote;
|
|
30
|
+
summary.localDocumentCount += peerState.localDocumentCount;
|
|
31
|
+
summary.remoteDocumentCount += peerState.remoteDocumentCount;
|
|
32
|
+
summary.differentDocuments += peerState.differentDocuments;
|
|
33
|
+
return summary;
|
|
34
|
+
}, createEmptyEdgeSyncState());
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const isEdgePeerId = (peerId: string, spaceId: SpaceId) =>
|
|
38
|
+
peerId.startsWith(`${EdgeService.AUTOMERGE_REPLICATOR}:${spaceId}`);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Hook Subscribes to sync state for each space.
|
|
42
|
+
*/
|
|
43
|
+
export const useSyncState = (): SpaceSyncStateMap => {
|
|
44
|
+
const client = useClient();
|
|
45
|
+
const [spaceState, setSpaceState] = useState<SpaceSyncStateMap>({});
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const ctx = new Context();
|
|
49
|
+
const createSubscriptions = (spaces: Space[]) => {
|
|
50
|
+
for (const space of spaces) {
|
|
51
|
+
if (spaceState[space.id]) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
ctx.onDispose(
|
|
56
|
+
space.crud.subscribeToSyncState(ctx, ({ peers = [] }) => {
|
|
57
|
+
const syncState = peers.find((state) => isEdgePeerId(state.peerId, space.id));
|
|
58
|
+
if (syncState) {
|
|
59
|
+
setSpaceState((spaceState) => ({ ...spaceState, [space.id]: syncState }));
|
|
60
|
+
}
|
|
61
|
+
}),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
createSubscriptions(client.spaces.get());
|
|
67
|
+
client.spaces.subscribe((spaces) => {
|
|
68
|
+
createSubscriptions(spaces);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return () => {
|
|
72
|
+
void ctx.dispose();
|
|
73
|
+
};
|
|
74
|
+
}, [client]);
|
|
75
|
+
|
|
76
|
+
return spaceState;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Hook Subscribes to sync state for a single space.
|
|
81
|
+
*/
|
|
82
|
+
// TODO(wittjosiah): Reconcile w/ useSyncState.
|
|
83
|
+
export const useSpaceSyncState = (space: Space): PeerSyncState | undefined => {
|
|
84
|
+
const [spaceState, setSpaceState] = useState<PeerSyncState>();
|
|
85
|
+
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
const ctx = new Context();
|
|
88
|
+
space.crud.subscribeToSyncState(ctx, ({ peers = [] }) => {
|
|
89
|
+
const syncState = peers.find((state) => isEdgePeerId(state.peerId, space.id));
|
|
90
|
+
if (syncState) {
|
|
91
|
+
setSpaceState(syncState);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return () => {
|
|
96
|
+
void ctx.dispose();
|
|
97
|
+
};
|
|
98
|
+
}, [space]);
|
|
99
|
+
|
|
100
|
+
return spaceState;
|
|
101
|
+
};
|
package/src/components/index.ts
CHANGED
|
@@ -9,11 +9,12 @@ export * from './CollectionSection';
|
|
|
9
9
|
export * from './JoinDialog';
|
|
10
10
|
export * from './MembersContainer';
|
|
11
11
|
export * from './MenuFooter';
|
|
12
|
-
export * from './
|
|
12
|
+
export * from './ObjectSettingsContainer';
|
|
13
13
|
export * from './PersistenceStatus';
|
|
14
|
+
export * from './PopoverAddSpace';
|
|
14
15
|
export * from './PopoverRenameObject';
|
|
15
16
|
export * from './PopoverRenameSpace';
|
|
16
|
-
export * from './
|
|
17
|
+
export * from './ShareSpaceButton';
|
|
17
18
|
export * from './SpacePresence';
|
|
18
19
|
export * from './SpacePluginSettings';
|
|
19
20
|
export * from './SpaceSettings';
|
package/src/hooks/index.ts
CHANGED
package/src/hooks/usePath.ts
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Option } from 'effect';
|
|
6
5
|
import { useEffect, useState } from 'react';
|
|
7
6
|
|
|
8
|
-
import { type
|
|
7
|
+
import { type Graph } from '@dxos/plugin-graph';
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* React hook to get a path from the graph.
|
|
@@ -16,17 +15,15 @@ import { type ReadableGraph } from '@dxos/plugin-graph';
|
|
|
16
15
|
* @returns Path if found, undefined otherwise.
|
|
17
16
|
*/
|
|
18
17
|
// TODO(wittjosiah): Factor out.
|
|
19
|
-
export const usePath = (graph:
|
|
20
|
-
const [pathState, setPathState] = useState<
|
|
21
|
-
id ? graph.getPath({ target: id }) : Option.none(),
|
|
22
|
-
);
|
|
18
|
+
export const usePath = (graph: Graph, id?: string, timeout?: number): string[] | undefined => {
|
|
19
|
+
const [pathState, setPathState] = useState<string[] | undefined>(id ? graph.getPath({ target: id }) : undefined);
|
|
23
20
|
|
|
24
21
|
useEffect(() => {
|
|
25
22
|
if (!id && pathState) {
|
|
26
|
-
setPathState(
|
|
23
|
+
setPathState(undefined);
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
if (
|
|
26
|
+
if (pathState?.at(-1) === id || !id) {
|
|
30
27
|
return;
|
|
31
28
|
}
|
|
32
29
|
|
|
@@ -35,7 +32,7 @@ export const usePath = (graph: ReadableGraph, id?: string, timeout?: number): Op
|
|
|
35
32
|
try {
|
|
36
33
|
const path = await graph.waitForPath({ target: id }, { timeout });
|
|
37
34
|
if (path) {
|
|
38
|
-
setPathState(
|
|
35
|
+
setPathState(path);
|
|
39
36
|
}
|
|
40
37
|
} catch {}
|
|
41
38
|
});
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ export { SpaceCapabilities, ThreadCapabilities } from './capabilities';
|
|
|
6
6
|
export { SpaceEvents, ThreadEvents } from './events';
|
|
7
7
|
|
|
8
8
|
export * from './components';
|
|
9
|
-
export * from './hooks';
|
|
10
9
|
export * from './meta';
|
|
11
10
|
export * from './SpacePlugin';
|
|
12
11
|
export * from './util';
|
package/src/translations.ts
CHANGED
|
@@ -15,6 +15,7 @@ export default [
|
|
|
15
15
|
[SPACE_PLUGIN]: {
|
|
16
16
|
'plugin name': 'Spaces',
|
|
17
17
|
'first run message': 'Nothing selected.',
|
|
18
|
+
'add space label': 'Create or join a space',
|
|
18
19
|
'create space label': 'Create space',
|
|
19
20
|
'join space label': 'Join space',
|
|
20
21
|
'empty space message': 'No documents',
|
|
@@ -33,7 +34,7 @@ export default [
|
|
|
33
34
|
'export data label': 'Export data',
|
|
34
35
|
'import data label': 'Import data',
|
|
35
36
|
'migrate space label': 'Migrate space',
|
|
36
|
-
'share space
|
|
37
|
+
'share space': 'Share space',
|
|
37
38
|
'save space to disk label': 'Save to disk',
|
|
38
39
|
'load space from disk label': 'Load from disk',
|
|
39
40
|
'confirm restore title': 'Overwrite files in this space?',
|
|
@@ -42,7 +43,7 @@ export default [
|
|
|
42
43
|
'object placeholder': 'Type a title here…',
|
|
43
44
|
'personal space label': 'Personal Space',
|
|
44
45
|
'spaces label': 'Spaces',
|
|
45
|
-
'show hidden spaces label': 'Show
|
|
46
|
+
'show hidden spaces label': 'Show closed spaces',
|
|
46
47
|
'save files to directory label': 'Save files to disk',
|
|
47
48
|
'select path label': 'Select path',
|
|
48
49
|
'rename collection label': 'Rename collection',
|
|
@@ -66,6 +67,7 @@ export default [
|
|
|
66
67
|
'The requested object has not been found yet. Ensure there are enough peers online in the space with an updated copy.',
|
|
67
68
|
'create object in space label': 'Add to space',
|
|
68
69
|
'create object in collection label': 'Add to collection',
|
|
70
|
+
'share space label': 'Share',
|
|
69
71
|
'space members label': 'Space members',
|
|
70
72
|
'active space members heading': 'Online ({{count}})',
|
|
71
73
|
'inactive space members heading': 'Offline ({{count}})',
|
|
@@ -94,7 +96,7 @@ export default [
|
|
|
94
96
|
'join success label': 'Successfully joined space',
|
|
95
97
|
'name label': 'Name',
|
|
96
98
|
'name placeholder': 'Name',
|
|
97
|
-
'object settings label': '
|
|
99
|
+
'object settings label': 'Settings',
|
|
98
100
|
'edge replication label': 'Enable EDGE Replication',
|
|
99
101
|
'saving locally label': 'Writing to disk',
|
|
100
102
|
'downloading label': 'Replicating from peers',
|
|
@@ -116,7 +118,6 @@ export default [
|
|
|
116
118
|
'advanced settings label': 'Advanced',
|
|
117
119
|
'foreign keys': 'Foreign Keys',
|
|
118
120
|
'add key': 'Add Key',
|
|
119
|
-
'open space settings label': 'Open',
|
|
120
121
|
|
|
121
122
|
'members panel label': 'Members',
|
|
122
123
|
'members verbose label': 'Manage space members',
|
|
@@ -125,29 +126,16 @@ export default [
|
|
|
125
126
|
'invitations label': 'Invitations',
|
|
126
127
|
'space invitation description': 'Manage invitations to the space.',
|
|
127
128
|
'qr code description': 'Share this QR code, or copy the URL and share it with the person you want to invite.',
|
|
128
|
-
'locked space description': 'This space is locked, unlock it to invite new members.',
|
|
129
|
-
'space locked label': 'Lock space',
|
|
130
|
-
'space locked description': 'Locking a space prevents new members from being invited to the space.',
|
|
131
129
|
|
|
132
130
|
'settings panel label': 'Space Settings',
|
|
133
|
-
'open
|
|
134
|
-
'space settings properties label': 'General
|
|
135
|
-
'space properties settings verbose label': 'Manage space properties',
|
|
136
|
-
'space properties settings description': 'You can configure how this space is displayed in the app here.',
|
|
137
|
-
'space settings schema label': 'Schema',
|
|
138
|
-
'schema verbose label': 'Manage schema',
|
|
139
|
-
'schema description': 'You can manage all of the schema stored within this space here.',
|
|
140
|
-
'no schemas found message': 'No schemas found',
|
|
131
|
+
'open space settings label': 'Space Settings',
|
|
132
|
+
'space settings properties label': 'General',
|
|
141
133
|
'display name input placeholder': 'Space name',
|
|
142
134
|
'display name description': 'Name of the space as it appears in the app.',
|
|
143
135
|
'icon description': 'Icon used to represent the space in the app.',
|
|
144
136
|
'hue description': 'Color used to represent the space in the app.',
|
|
145
137
|
'edge replication description':
|
|
146
138
|
"Only change this if you know what you're doing. Disabling this will prevent the space from replicating through Composer's EDGE services, and relies solely on peer-to-peer sync.",
|
|
147
|
-
'archive space description':
|
|
148
|
-
'Archiving a space will remove it from the sidebar and stop replicating updates, but will not delete the data. You can unarchive it by enabling archived spaces in the app settings.',
|
|
149
|
-
'archive space label': 'Archive',
|
|
150
|
-
'unarchive space label': 'Unarchive',
|
|
151
139
|
},
|
|
152
140
|
},
|
|
153
141
|
},
|
package/src/types/collection.ts
CHANGED
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { Expando, Ref, TypedObject } from '@dxos/echo-schema';
|
|
5
|
+
import { Expando, Ref, S, TypedObject } from '@dxos/echo-schema';
|
|
8
6
|
|
|
9
7
|
export class CollectionType extends TypedObject({ typename: 'dxos.org/type/Collection', version: '0.1.0' })({
|
|
10
|
-
name:
|
|
11
|
-
objects:
|
|
8
|
+
name: S.optional(S.String),
|
|
9
|
+
objects: S.mutable(S.Array(Ref(Expando))),
|
|
12
10
|
// Key is schema typename and value is reference to a view object of the associated schema.
|
|
13
11
|
// Having collection reference the views rather than vice versa ensures that the state converges to a single view per key (i.e. type).
|
|
14
12
|
// This also leaves open a future where this key could be changed to allow for multiple stack views per section.
|
|
15
13
|
// TODO(wittjosiah): Any way to make this more type safe?
|
|
16
14
|
// TODO(wittjosiah): Should the views be separate objects or just be schemas for view data in this record?
|
|
17
|
-
views:
|
|
15
|
+
views: S.mutable(S.Record({ key: S.String, value: Ref(Expando) })),
|
|
18
16
|
}) {}
|
package/src/types/thread.ts
CHANGED
|
@@ -2,29 +2,23 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { Expando, Ref, TypedObject } from '@dxos/echo-schema';
|
|
8
|
-
import { DataType } from '@dxos/schema';
|
|
5
|
+
import { Expando, Ref, S, TypedObject } from '@dxos/echo-schema';
|
|
6
|
+
import { MessageType } from '@dxos/schema';
|
|
9
7
|
|
|
10
8
|
// TODO(wittjosiah): These types were placed here rather than in @dxos/plugin-thread
|
|
11
9
|
// in order to avoid a circular dependency between threads and other objects that use threads.
|
|
12
10
|
|
|
13
|
-
export const ThreadStatus =
|
|
14
|
-
Schema.Literal('staged'),
|
|
15
|
-
Schema.Literal('active'),
|
|
16
|
-
Schema.Literal('resolved'),
|
|
17
|
-
);
|
|
11
|
+
export const ThreadStatus = S.Union(S.Literal('staged'), S.Literal('active'), S.Literal('resolved'));
|
|
18
12
|
|
|
19
13
|
export class ThreadType extends TypedObject({ typename: 'dxos.org/type/Thread', version: '0.1.0' })({
|
|
20
|
-
name:
|
|
14
|
+
name: S.optional(S.String),
|
|
21
15
|
/** AM cursor-range: 'from:to'. */
|
|
22
|
-
anchor:
|
|
23
|
-
status:
|
|
24
|
-
messages:
|
|
16
|
+
anchor: S.optional(S.String),
|
|
17
|
+
status: S.optional(ThreadStatus),
|
|
18
|
+
messages: S.mutable(S.Array(Ref(MessageType))),
|
|
25
19
|
}) {}
|
|
26
20
|
|
|
27
21
|
export class ChannelType extends TypedObject({ typename: 'dxos.org/type/Channel', version: '0.1.0' })({
|
|
28
|
-
name:
|
|
22
|
+
name: S.optional(S.String),
|
|
29
23
|
queue: Ref(Expando),
|
|
30
24
|
}) {}
|