@dxos/plugin-deck 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb
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-DTVCULQ4.mjs → app-graph-builder-X7LCO5KE.mjs} +13 -12
- package/dist/lib/browser/app-graph-builder-X7LCO5KE.mjs.map +7 -0
- package/dist/lib/browser/{check-app-scheme-JSRXXIYF.mjs → check-app-scheme-PGISDJX7.mjs} +8 -8
- package/dist/lib/browser/check-app-scheme-PGISDJX7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ATFPDN6J.mjs → chunk-DONG2FYU.mjs} +12 -9
- package/dist/lib/browser/chunk-DONG2FYU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EREEXCHO.mjs → chunk-JGC4ZLG3.mjs} +102 -81
- package/dist/lib/browser/chunk-JGC4ZLG3.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UNG4CLLP.mjs → chunk-YT3AJVUU.mjs} +8 -8
- package/dist/lib/browser/chunk-YT3AJVUU.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +36 -34
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-CDYBLZJ4.mjs → operation-resolver-XJFR3PNQ.mjs} +86 -84
- package/dist/lib/browser/operation-resolver-XJFR3PNQ.mjs.map +7 -0
- package/dist/lib/browser/{react-root-LYNEKGHM.mjs → react-root-AJFHKHRL.mjs} +6 -6
- package/dist/lib/browser/react-root-AJFHKHRL.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-RPKD7XUR.mjs → react-surface-KBRBGEXY.mjs} +11 -10
- package/dist/lib/browser/react-surface-KBRBGEXY.mjs.map +7 -0
- package/dist/lib/browser/{settings-OMHVGZ6V.mjs → settings-ES42FGLG.mjs} +5 -4
- package/dist/lib/browser/settings-ES42FGLG.mjs.map +7 -0
- package/dist/lib/browser/{state-OC3BSB6E.mjs → state-YMI6IDEL.mjs} +7 -6
- package/dist/lib/browser/state-YMI6IDEL.mjs.map +7 -0
- package/dist/lib/browser/{toolkit-R53LD3EA.mjs → toolkit-VRD54KY3.mjs} +8 -7
- package/dist/lib/browser/toolkit-VRD54KY3.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/browser/{url-handler-53TE6JZO.mjs → url-handler-37UPOB3U.mjs} +11 -10
- package/dist/lib/browser/url-handler-37UPOB3U.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-473BNZDJ.mjs → app-graph-builder-US54I64T.mjs} +13 -12
- package/dist/lib/node-esm/app-graph-builder-US54I64T.mjs.map +7 -0
- package/dist/lib/node-esm/{check-app-scheme-IVYRHKRH.mjs → check-app-scheme-CK6EVG5D.mjs} +8 -8
- package/dist/lib/node-esm/check-app-scheme-CK6EVG5D.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-V6VEXRD4.mjs → chunk-7NPS347C.mjs} +102 -81
- package/dist/lib/node-esm/chunk-7NPS347C.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-XAKTY3EB.mjs → chunk-CVYHPJIN.mjs} +12 -9
- package/dist/lib/node-esm/chunk-CVYHPJIN.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SKEVPQ7E.mjs → chunk-ZMJPCZ3V.mjs} +8 -8
- package/dist/lib/node-esm/chunk-ZMJPCZ3V.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +36 -34
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{operation-resolver-WUOE33ID.mjs → operation-resolver-ZQGNATPX.mjs} +86 -84
- package/dist/lib/node-esm/operation-resolver-ZQGNATPX.mjs.map +7 -0
- package/dist/lib/node-esm/{react-root-L7H43AS3.mjs → react-root-2S77ABBS.mjs} +6 -6
- package/dist/lib/node-esm/react-root-2S77ABBS.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-77DKVMDV.mjs → react-surface-FIHMAFXH.mjs} +11 -10
- package/dist/lib/node-esm/react-surface-FIHMAFXH.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-2HB6FKIK.mjs → settings-E3TH3FAW.mjs} +5 -4
- package/dist/lib/node-esm/settings-E3TH3FAW.mjs.map +7 -0
- package/dist/lib/node-esm/{state-JRQ45ACJ.mjs → state-WQEFBQMD.mjs} +7 -6
- package/dist/lib/node-esm/state-WQEFBQMD.mjs.map +7 -0
- package/dist/lib/node-esm/{toolkit-JLPZNNKB.mjs → toolkit-ME546G5T.mjs} +8 -7
- package/dist/lib/node-esm/toolkit-ME546G5T.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/lib/node-esm/{url-handler-QGF2R24T.mjs → url-handler-2KYHXINK.mjs} +11 -10
- package/dist/lib/node-esm/url-handler-2KYHXINK.mjs.map +7 -0
- package/dist/types/src/DeckPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/settings.d.ts +3 -2
- package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/index.d.ts +2 -0
- package/dist/types/src/capabilities/state/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/state.d.ts +2 -0
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit/index.d.ts +1 -1
- package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts +3 -2
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -1
- package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +1 -0
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Toast.d.ts +3 -3
- package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.stories.d.ts +1 -0
- package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts +2 -0
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/src/types/events.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +2 -0
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -42
- package/src/DeckPlugin.ts +12 -11
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +11 -10
- package/src/capabilities/check-app-scheme/check-app-scheme.ts +12 -8
- package/src/capabilities/operation-resolver/operation-resolver.ts +95 -80
- package/src/capabilities/react-root/react-root.tsx +2 -2
- package/src/capabilities/react-surface/react-surface.tsx +8 -7
- package/src/capabilities/settings/settings.ts +3 -2
- package/src/capabilities/state/state.ts +5 -4
- package/src/capabilities/toolkit/toolkit.ts +6 -5
- package/src/capabilities/url-handler/url-handler.ts +8 -7
- package/src/components/DeckLayout/ActiveNode.tsx +3 -2
- package/src/components/DeckLayout/Banner.tsx +4 -4
- package/src/components/DeckLayout/ContentEmpty.tsx +2 -2
- package/src/components/DeckLayout/DeckLayout.stories.tsx +5 -4
- package/src/components/DeckLayout/DeckMain.tsx +7 -7
- package/src/components/DeckLayout/Dialog.tsx +9 -3
- package/src/components/DeckLayout/Popover.tsx +21 -5
- package/src/components/DeckLayout/StatusBar.tsx +3 -3
- package/src/components/DeckLayout/Toast.tsx +3 -3
- package/src/components/DeckSettings/DeckSettings.tsx +21 -21
- package/src/components/Plank/Plank.stories.tsx +4 -3
- package/src/components/Plank/Plank.tsx +5 -4
- package/src/components/Plank/PlankControls.tsx +1 -1
- package/src/components/Plank/PlankHeading.tsx +7 -6
- package/src/components/Sidebar/ComplementarySidebar.tsx +19 -15
- package/src/components/Sidebar/Sidebar.tsx +2 -2
- package/src/components/Sidebar/SidebarButton.tsx +9 -9
- package/src/hooks/useCompanions.ts +1 -1
- package/src/hooks/useDeckCompanions.ts +1 -1
- package/src/hooks/useDeckState.ts +3 -3
- package/src/hooks/useHoistStatusbar.ts +1 -1
- package/src/translations.ts +1 -0
- package/src/types/capabilities.ts +2 -2
- package/src/types/events.ts +4 -3
- package/src/types/schema.ts +7 -3
- package/dist/lib/browser/app-graph-builder-DTVCULQ4.mjs.map +0 -7
- package/dist/lib/browser/check-app-scheme-JSRXXIYF.mjs.map +0 -7
- package/dist/lib/browser/chunk-ATFPDN6J.mjs.map +0 -7
- package/dist/lib/browser/chunk-EREEXCHO.mjs.map +0 -7
- package/dist/lib/browser/chunk-UNG4CLLP.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-CDYBLZJ4.mjs.map +0 -7
- package/dist/lib/browser/react-root-LYNEKGHM.mjs.map +0 -7
- package/dist/lib/browser/react-surface-RPKD7XUR.mjs.map +0 -7
- package/dist/lib/browser/settings-OMHVGZ6V.mjs.map +0 -7
- package/dist/lib/browser/state-OC3BSB6E.mjs.map +0 -7
- package/dist/lib/browser/toolkit-R53LD3EA.mjs.map +0 -7
- package/dist/lib/browser/url-handler-53TE6JZO.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-473BNZDJ.mjs.map +0 -7
- package/dist/lib/node-esm/check-app-scheme-IVYRHKRH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SKEVPQ7E.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-V6VEXRD4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XAKTY3EB.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-WUOE33ID.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-L7H43AS3.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-77DKVMDV.mjs.map +0 -7
- package/dist/lib/node-esm/settings-2HB6FKIK.mjs.map +0 -7
- package/dist/lib/node-esm/state-JRQ45ACJ.mjs.map +0 -7
- package/dist/lib/node-esm/toolkit-JLPZNNKB.mjs.map +0 -7
- package/dist/lib/node-esm/url-handler-QGF2R24T.mjs.map +0 -7
|
@@ -6,7 +6,8 @@ import * as Effect from 'effect/Effect';
|
|
|
6
6
|
import * as Function from 'effect/Function';
|
|
7
7
|
import * as Option from 'effect/Option';
|
|
8
8
|
|
|
9
|
-
import { Capability,
|
|
9
|
+
import { Capabilities, Capability, UndoOperation } from '@dxos/app-framework';
|
|
10
|
+
import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
|
|
10
11
|
import { Obj } from '@dxos/echo';
|
|
11
12
|
import { invariant } from '@dxos/invariant';
|
|
12
13
|
import { log } from '@dxos/log';
|
|
@@ -52,17 +53,20 @@ const updateActiveDeck = (current: DeckStateProps, deckUpdates: Partial<DeckStat
|
|
|
52
53
|
|
|
53
54
|
export default Capability.makeModule(
|
|
54
55
|
Effect.fnUntraced(function* () {
|
|
55
|
-
return Capability.contributes(
|
|
56
|
+
return Capability.contributes(Capabilities.OperationResolver, [
|
|
56
57
|
//
|
|
57
58
|
// UpdateSidebar
|
|
58
59
|
//
|
|
59
60
|
OperationResolver.make({
|
|
60
|
-
operation:
|
|
61
|
+
operation: LayoutOperation.UpdateSidebar,
|
|
61
62
|
handler: Effect.fnUntraced(function* (input) {
|
|
62
|
-
const state = yield*
|
|
63
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
63
64
|
const next = input.state ?? state.sidebarState;
|
|
64
65
|
if (next !== state.sidebarState) {
|
|
65
|
-
yield*
|
|
66
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => ({
|
|
67
|
+
...state,
|
|
68
|
+
sidebarState: next,
|
|
69
|
+
}));
|
|
66
70
|
}
|
|
67
71
|
}),
|
|
68
72
|
}),
|
|
@@ -71,18 +75,18 @@ export default Capability.makeModule(
|
|
|
71
75
|
// UpdateComplementary
|
|
72
76
|
//
|
|
73
77
|
OperationResolver.make({
|
|
74
|
-
operation:
|
|
78
|
+
operation: LayoutOperation.UpdateComplementary,
|
|
75
79
|
handler: Effect.fnUntraced(function* (input) {
|
|
76
|
-
const state = yield*
|
|
80
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
77
81
|
const panelChanged = state.complementarySidebarPanel !== input.subject;
|
|
78
82
|
const next = input.subject ? 'expanded' : (input.state ?? state.complementarySidebarState);
|
|
79
83
|
const stateChanged = next !== state.complementarySidebarState;
|
|
80
84
|
|
|
81
85
|
if (panelChanged || stateChanged) {
|
|
82
|
-
yield*
|
|
83
|
-
...
|
|
84
|
-
complementarySidebarPanel: panelChanged ? input.subject :
|
|
85
|
-
complementarySidebarState: stateChanged ? next :
|
|
86
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => ({
|
|
87
|
+
...state,
|
|
88
|
+
complementarySidebarPanel: panelChanged ? input.subject : state.complementarySidebarPanel,
|
|
89
|
+
complementarySidebarState: stateChanged ? next : state.complementarySidebarState,
|
|
86
90
|
}));
|
|
87
91
|
}
|
|
88
92
|
}),
|
|
@@ -92,10 +96,10 @@ export default Capability.makeModule(
|
|
|
92
96
|
// UpdateDialog
|
|
93
97
|
//
|
|
94
98
|
OperationResolver.make({
|
|
95
|
-
operation:
|
|
99
|
+
operation: LayoutOperation.UpdateDialog,
|
|
96
100
|
handler: Effect.fnUntraced(function* (input) {
|
|
97
|
-
yield*
|
|
98
|
-
...
|
|
101
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.EphemeralState, (state) => ({
|
|
102
|
+
...state,
|
|
99
103
|
dialogOpen: input.state ?? Boolean(input.subject),
|
|
100
104
|
dialogType: input.type ?? 'default',
|
|
101
105
|
dialogBlockAlign: input.blockAlign ?? 'center',
|
|
@@ -110,13 +114,14 @@ export default Capability.makeModule(
|
|
|
110
114
|
// UpdatePopover
|
|
111
115
|
//
|
|
112
116
|
OperationResolver.make({
|
|
113
|
-
operation:
|
|
117
|
+
operation: LayoutOperation.UpdatePopover,
|
|
114
118
|
handler: Effect.fnUntraced(function* (input) {
|
|
115
|
-
yield*
|
|
116
|
-
...
|
|
119
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.EphemeralState, (state) => ({
|
|
120
|
+
...state,
|
|
117
121
|
popoverOpen: input.state ?? Boolean(input.subject),
|
|
118
122
|
popoverKind: input.kind ?? 'base',
|
|
119
123
|
popoverTitle: input.kind === 'card' ? input.title : undefined,
|
|
124
|
+
popoverContentRef: input.subjectRef,
|
|
120
125
|
popoverContent:
|
|
121
126
|
typeof input.subject === 'string'
|
|
122
127
|
? { component: input.subject, props: input.props }
|
|
@@ -124,8 +129,8 @@ export default Capability.makeModule(
|
|
|
124
129
|
? { subject: input.subject }
|
|
125
130
|
: null,
|
|
126
131
|
popoverSide: input.side,
|
|
127
|
-
popoverAnchor: input.variant === 'virtual' ? input.anchor :
|
|
128
|
-
popoverAnchorId: input.variant !== 'virtual' ? input.anchorId :
|
|
132
|
+
popoverAnchor: input.variant === 'virtual' ? input.anchor : state.popoverAnchor,
|
|
133
|
+
popoverAnchorId: input.variant !== 'virtual' ? input.anchorId : state.popoverAnchorId,
|
|
129
134
|
}));
|
|
130
135
|
}),
|
|
131
136
|
}),
|
|
@@ -134,11 +139,11 @@ export default Capability.makeModule(
|
|
|
134
139
|
// AddToast
|
|
135
140
|
//
|
|
136
141
|
OperationResolver.make({
|
|
137
|
-
operation:
|
|
142
|
+
operation: LayoutOperation.AddToast,
|
|
138
143
|
handler: Effect.fnUntraced(function* (input) {
|
|
139
|
-
yield*
|
|
140
|
-
...
|
|
141
|
-
toasts: [...
|
|
144
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.EphemeralState, (state) => ({
|
|
145
|
+
...state,
|
|
146
|
+
toasts: [...state.toasts, input as LayoutOperation.Toast],
|
|
142
147
|
}));
|
|
143
148
|
}),
|
|
144
149
|
}),
|
|
@@ -147,18 +152,18 @@ export default Capability.makeModule(
|
|
|
147
152
|
// ShowUndo
|
|
148
153
|
//
|
|
149
154
|
OperationResolver.make({
|
|
150
|
-
operation:
|
|
155
|
+
operation: UndoOperation.ShowUndo,
|
|
151
156
|
handler: Effect.fnUntraced(function* (input) {
|
|
152
|
-
const historyTracker = yield* Capability.get(
|
|
157
|
+
const historyTracker = yield* Capability.get(Capabilities.HistoryTracker);
|
|
153
158
|
|
|
154
159
|
const newUndoId = `show-undo-${Date.now()}`;
|
|
155
160
|
// TODO(wittjosiah): Support undoing further back than the last action.
|
|
156
|
-
yield*
|
|
157
|
-
const filteredToasts =
|
|
158
|
-
?
|
|
159
|
-
:
|
|
161
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.EphemeralState, (state) => {
|
|
162
|
+
const filteredToasts = state.currentUndoId
|
|
163
|
+
? state.toasts.filter((toast) => toast.id !== state.currentUndoId)
|
|
164
|
+
: state.toasts;
|
|
160
165
|
|
|
161
|
-
const toast:
|
|
166
|
+
const toast: LayoutOperation.Toast = {
|
|
162
167
|
id: newUndoId,
|
|
163
168
|
title: input.message ?? ['undo available label', { ns: meta.id }],
|
|
164
169
|
duration: 10_000,
|
|
@@ -169,7 +174,7 @@ export default Capability.makeModule(
|
|
|
169
174
|
};
|
|
170
175
|
|
|
171
176
|
return {
|
|
172
|
-
...
|
|
177
|
+
...state,
|
|
173
178
|
currentUndoId: newUndoId,
|
|
174
179
|
toasts: [...filteredToasts, toast],
|
|
175
180
|
};
|
|
@@ -181,7 +186,7 @@ export default Capability.makeModule(
|
|
|
181
186
|
// SetLayoutMode
|
|
182
187
|
//
|
|
183
188
|
OperationResolver.make({
|
|
184
|
-
operation:
|
|
189
|
+
operation: LayoutOperation.SetLayoutMode,
|
|
185
190
|
filter: (input) => {
|
|
186
191
|
if ('mode' in input) {
|
|
187
192
|
return isLayoutMode(input.mode);
|
|
@@ -189,7 +194,7 @@ export default Capability.makeModule(
|
|
|
189
194
|
return true;
|
|
190
195
|
},
|
|
191
196
|
handler: Effect.fnUntraced(function* (input) {
|
|
192
|
-
const state = yield*
|
|
197
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
193
198
|
const deck = yield* DeckCapabilities.getDeck();
|
|
194
199
|
|
|
195
200
|
const computeModeUpdate = (mode: LayoutMode, subject?: string): Partial<DeckState> => {
|
|
@@ -228,18 +233,22 @@ export default Capability.makeModule(
|
|
|
228
233
|
'subject' in input ? input.subject : undefined,
|
|
229
234
|
);
|
|
230
235
|
|
|
231
|
-
yield*
|
|
236
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => {
|
|
232
237
|
const newPreviousMode =
|
|
233
|
-
currentMode !== input.mode
|
|
238
|
+
currentMode !== input.mode
|
|
239
|
+
? { ...state.previousMode, [state.activeDeck]: currentMode }
|
|
240
|
+
: state.previousMode;
|
|
234
241
|
return {
|
|
235
|
-
...updateActiveDeck(
|
|
242
|
+
...updateActiveDeck(state, deckUpdates),
|
|
236
243
|
previousMode: newPreviousMode,
|
|
237
244
|
};
|
|
238
245
|
});
|
|
239
246
|
} else if ('revert' in input) {
|
|
240
247
|
const last = state.previousMode[state.activeDeck];
|
|
241
248
|
const deckUpdates = computeModeUpdate(last ?? 'solo');
|
|
242
|
-
yield*
|
|
249
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
250
|
+
updateActiveDeck(state, deckUpdates),
|
|
251
|
+
);
|
|
243
252
|
} else {
|
|
244
253
|
log.warn('Invalid layout mode', input);
|
|
245
254
|
}
|
|
@@ -250,21 +259,23 @@ export default Capability.makeModule(
|
|
|
250
259
|
// SwitchWorkspace
|
|
251
260
|
//
|
|
252
261
|
OperationResolver.make({
|
|
253
|
-
operation:
|
|
262
|
+
operation: LayoutOperation.SwitchWorkspace,
|
|
254
263
|
handler: Effect.fnUntraced(function* (input) {
|
|
255
|
-
const { graph } = yield* Capability.get(
|
|
264
|
+
const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
|
|
256
265
|
|
|
257
266
|
{
|
|
258
|
-
const state = yield*
|
|
267
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
259
268
|
// TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.
|
|
260
269
|
// Ideally this should be worked into the data model in a generic way.
|
|
261
270
|
const shouldUpdatePrevious = !state.activeDeck.startsWith('!');
|
|
262
271
|
|
|
263
|
-
yield*
|
|
264
|
-
const newDecks =
|
|
272
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => {
|
|
273
|
+
const newDecks = state.decks[input.subject]
|
|
274
|
+
? state.decks
|
|
275
|
+
: { ...state.decks, [input.subject]: { ...defaultDeck } };
|
|
265
276
|
return {
|
|
266
|
-
...
|
|
267
|
-
previousDeck: shouldUpdatePrevious ?
|
|
277
|
+
...state,
|
|
278
|
+
previousDeck: shouldUpdatePrevious ? state.activeDeck : state.previousDeck,
|
|
268
279
|
activeDeck: input.subject,
|
|
269
280
|
decks: newDecks,
|
|
270
281
|
};
|
|
@@ -272,19 +283,19 @@ export default Capability.makeModule(
|
|
|
272
283
|
}
|
|
273
284
|
|
|
274
285
|
{
|
|
275
|
-
const state = yield*
|
|
286
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
276
287
|
const deck = state.decks[input.subject];
|
|
277
288
|
invariant(deck, `Deck not found: ${input.subject}`);
|
|
278
289
|
|
|
279
290
|
const first = deck.solo ? deck.solo : deck.active[0];
|
|
280
291
|
if (first) {
|
|
281
|
-
yield* Operation.schedule(
|
|
292
|
+
yield* Operation.schedule(LayoutOperation.ScrollIntoView, { subject: first });
|
|
282
293
|
} else {
|
|
283
294
|
const [item] = Graph.getConnections(graph, input.subject).filter(
|
|
284
295
|
(node) => !Node.isActionLike(node) && !node.properties.disposition,
|
|
285
296
|
);
|
|
286
297
|
if (item) {
|
|
287
|
-
yield* Operation.schedule(
|
|
298
|
+
yield* Operation.schedule(LayoutOperation.Open, { subject: [item.id] });
|
|
288
299
|
}
|
|
289
300
|
}
|
|
290
301
|
}
|
|
@@ -295,10 +306,10 @@ export default Capability.makeModule(
|
|
|
295
306
|
// RevertWorkspace
|
|
296
307
|
//
|
|
297
308
|
OperationResolver.make({
|
|
298
|
-
operation:
|
|
309
|
+
operation: LayoutOperation.RevertWorkspace,
|
|
299
310
|
handler: Effect.fnUntraced(function* () {
|
|
300
|
-
const state = yield*
|
|
301
|
-
yield* Operation.invoke(
|
|
311
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
312
|
+
yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: state.previousDeck });
|
|
302
313
|
}),
|
|
303
314
|
}),
|
|
304
315
|
|
|
@@ -306,16 +317,16 @@ export default Capability.makeModule(
|
|
|
306
317
|
// Open
|
|
307
318
|
//
|
|
308
319
|
OperationResolver.make({
|
|
309
|
-
operation:
|
|
320
|
+
operation: LayoutOperation.Open,
|
|
310
321
|
handler: Effect.fnUntraced(function* (input) {
|
|
311
|
-
const { graph } = yield* Capability.get(
|
|
322
|
+
const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
|
|
312
323
|
const attention = yield* Capability.get(AttentionCapabilities.Attention);
|
|
313
|
-
const settings = yield*
|
|
324
|
+
const settings = yield* Capabilities.getAtomValue(DeckCapabilities.Settings);
|
|
314
325
|
|
|
315
326
|
{
|
|
316
|
-
const state = yield*
|
|
327
|
+
const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
317
328
|
if (input.workspace && state.activeDeck !== input.workspace) {
|
|
318
|
-
yield* Operation.invoke(
|
|
329
|
+
yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: input.workspace });
|
|
319
330
|
}
|
|
320
331
|
}
|
|
321
332
|
|
|
@@ -337,7 +348,9 @@ export default Capability.makeModule(
|
|
|
337
348
|
);
|
|
338
349
|
|
|
339
350
|
const { deckUpdates, toAttend: _toAttend } = computeActiveUpdates({ next, deck, attention });
|
|
340
|
-
yield*
|
|
351
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
352
|
+
updateActiveDeck(state, deckUpdates),
|
|
353
|
+
);
|
|
341
354
|
}
|
|
342
355
|
|
|
343
356
|
{
|
|
@@ -346,13 +359,13 @@ export default Capability.makeModule(
|
|
|
346
359
|
const newlyOpen = ids.filter((i: string) => !previouslyOpenIds.has(i));
|
|
347
360
|
|
|
348
361
|
if (input.scrollIntoView !== false && (newlyOpen[0] ?? input.subject[0])) {
|
|
349
|
-
yield* Operation.schedule(
|
|
362
|
+
yield* Operation.schedule(LayoutOperation.ScrollIntoView, {
|
|
350
363
|
subject: newlyOpen[0] ?? input.subject[0],
|
|
351
364
|
});
|
|
352
365
|
}
|
|
353
366
|
|
|
354
367
|
if (newlyOpen[0] ?? input.subject[0]) {
|
|
355
|
-
yield* Operation.schedule(
|
|
368
|
+
yield* Operation.schedule(LayoutOperation.Expose, { subject: newlyOpen[0] ?? input.subject[0] });
|
|
356
369
|
}
|
|
357
370
|
|
|
358
371
|
// Send analytics events for newly opened items.
|
|
@@ -379,10 +392,10 @@ export default Capability.makeModule(
|
|
|
379
392
|
OperationResolver.make({
|
|
380
393
|
operation: DeckOperation.UpdatePlankSize,
|
|
381
394
|
handler: Effect.fnUntraced(function* (input) {
|
|
382
|
-
yield*
|
|
383
|
-
updateActiveDeck(
|
|
395
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
396
|
+
updateActiveDeck(state, {
|
|
384
397
|
plankSizing: {
|
|
385
|
-
...
|
|
398
|
+
...state.decks[state.activeDeck]?.plankSizing,
|
|
386
399
|
[input.id]: input.size,
|
|
387
400
|
},
|
|
388
401
|
}),
|
|
@@ -396,10 +409,10 @@ export default Capability.makeModule(
|
|
|
396
409
|
OperationResolver.make({
|
|
397
410
|
operation: DeckOperation.Adjust,
|
|
398
411
|
handler: Effect.fnUntraced(function* (input) {
|
|
399
|
-
const _state = yield*
|
|
412
|
+
const _state = yield* Capabilities.getAtomValue(DeckCapabilities.State);
|
|
400
413
|
const deck = yield* DeckCapabilities.getDeck();
|
|
401
414
|
const attention = yield* Capability.get(AttentionCapabilities.Attention);
|
|
402
|
-
const { graph } = yield* Capability.get(
|
|
415
|
+
const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
|
|
403
416
|
|
|
404
417
|
// Collect layout operations to run after state updates.
|
|
405
418
|
let soloOperation:
|
|
@@ -410,7 +423,9 @@ export default Capability.makeModule(
|
|
|
410
423
|
if (input.type === 'increment-end' || input.type === 'increment-start') {
|
|
411
424
|
const next = incrementPlank(deck.active, input);
|
|
412
425
|
const { deckUpdates } = computeActiveUpdates({ next, deck, attention });
|
|
413
|
-
yield*
|
|
426
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
427
|
+
updateActiveDeck(state, deckUpdates),
|
|
428
|
+
);
|
|
414
429
|
}
|
|
415
430
|
|
|
416
431
|
if (input.type.startsWith('solo')) {
|
|
@@ -431,13 +446,13 @@ export default Capability.makeModule(
|
|
|
431
446
|
|
|
432
447
|
// Run collected solo operations.
|
|
433
448
|
if (soloOperation?.type === 'solo') {
|
|
434
|
-
yield* Operation.invoke(
|
|
449
|
+
yield* Operation.invoke(LayoutOperation.SetLayoutMode, {
|
|
435
450
|
subject: soloOperation.entryId,
|
|
436
451
|
mode: soloOperation.mode,
|
|
437
452
|
});
|
|
438
453
|
} else if (soloOperation?.type === 'unsolo') {
|
|
439
|
-
yield* Operation.invoke(
|
|
440
|
-
yield* Operation.invoke(
|
|
454
|
+
yield* Operation.invoke(LayoutOperation.SetLayoutMode, { mode: 'deck' });
|
|
455
|
+
yield* Operation.invoke(LayoutOperation.Open, { subject: [soloOperation.entryId] });
|
|
441
456
|
}
|
|
442
457
|
|
|
443
458
|
if (input.type === 'companion') {
|
|
@@ -471,14 +486,14 @@ export default Capability.makeModule(
|
|
|
471
486
|
const deck = yield* DeckCapabilities.getDeck();
|
|
472
487
|
if (input.companion === null) {
|
|
473
488
|
const { [input.primary]: _, ...nextActiveCompanions } = deck.activeCompanions ?? {};
|
|
474
|
-
yield*
|
|
475
|
-
updateActiveDeck(
|
|
489
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
490
|
+
updateActiveDeck(state, { activeCompanions: nextActiveCompanions }),
|
|
476
491
|
);
|
|
477
492
|
} else {
|
|
478
493
|
const companion = input.companion;
|
|
479
494
|
invariant(companion !== input.primary);
|
|
480
|
-
yield*
|
|
481
|
-
updateActiveDeck(
|
|
495
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>
|
|
496
|
+
updateActiveDeck(state, {
|
|
482
497
|
activeCompanions: {
|
|
483
498
|
...deck.activeCompanions,
|
|
484
499
|
[input.primary]: companion,
|
|
@@ -493,7 +508,7 @@ export default Capability.makeModule(
|
|
|
493
508
|
// Close
|
|
494
509
|
//
|
|
495
510
|
OperationResolver.make({
|
|
496
|
-
operation:
|
|
511
|
+
operation: LayoutOperation.Close,
|
|
497
512
|
handler: Effect.fnUntraced(function* (input) {
|
|
498
513
|
const deck = yield* DeckCapabilities.getDeck();
|
|
499
514
|
const attention = yield* Capability.get(AttentionCapabilities.Attention);
|
|
@@ -501,7 +516,7 @@ export default Capability.makeModule(
|
|
|
501
516
|
const active = deck.solo ? [deck.solo] : deck.active;
|
|
502
517
|
const next = input.subject.reduce((acc, id) => closeEntry(acc, id), active);
|
|
503
518
|
const { deckUpdates, toAttend } = computeActiveUpdates({ next, deck, attention });
|
|
504
|
-
yield*
|
|
519
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => updateActiveDeck(state, deckUpdates));
|
|
505
520
|
|
|
506
521
|
// Clear companions for closed entries.
|
|
507
522
|
for (const id of input.subject) {
|
|
@@ -511,7 +526,7 @@ export default Capability.makeModule(
|
|
|
511
526
|
}
|
|
512
527
|
|
|
513
528
|
if (toAttend) {
|
|
514
|
-
yield* Operation.schedule(
|
|
529
|
+
yield* Operation.schedule(LayoutOperation.ScrollIntoView, { subject: toAttend });
|
|
515
530
|
}
|
|
516
531
|
}),
|
|
517
532
|
}),
|
|
@@ -520,7 +535,7 @@ export default Capability.makeModule(
|
|
|
520
535
|
// Set
|
|
521
536
|
//
|
|
522
537
|
OperationResolver.make({
|
|
523
|
-
operation:
|
|
538
|
+
operation: LayoutOperation.Set,
|
|
524
539
|
handler: Effect.fnUntraced(function* (input) {
|
|
525
540
|
const deck = yield* DeckCapabilities.getDeck();
|
|
526
541
|
const attention = yield* Capability.get(AttentionCapabilities.Attention);
|
|
@@ -530,10 +545,10 @@ export default Capability.makeModule(
|
|
|
530
545
|
deck,
|
|
531
546
|
attention,
|
|
532
547
|
});
|
|
533
|
-
yield*
|
|
548
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => updateActiveDeck(state, deckUpdates));
|
|
534
549
|
|
|
535
550
|
if (toAttend) {
|
|
536
|
-
yield* Operation.schedule(
|
|
551
|
+
yield* Operation.schedule(LayoutOperation.ScrollIntoView, { subject: toAttend });
|
|
537
552
|
}
|
|
538
553
|
}),
|
|
539
554
|
}),
|
|
@@ -542,10 +557,10 @@ export default Capability.makeModule(
|
|
|
542
557
|
// ScrollIntoView
|
|
543
558
|
//
|
|
544
559
|
OperationResolver.make({
|
|
545
|
-
operation:
|
|
560
|
+
operation: LayoutOperation.ScrollIntoView,
|
|
546
561
|
handler: Effect.fnUntraced(function* (input) {
|
|
547
|
-
yield*
|
|
548
|
-
...
|
|
562
|
+
yield* Capabilities.updateAtomValue(DeckCapabilities.EphemeralState, (state) => ({
|
|
563
|
+
...state,
|
|
549
564
|
scrollIntoView: input.subject,
|
|
550
565
|
}));
|
|
551
566
|
}),
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
import React, { useCallback } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
9
|
|
|
10
10
|
import { DeckLayout } from '../../components';
|
|
11
11
|
import { useDeckState } from '../../hooks';
|
|
@@ -13,7 +13,7 @@ import { meta } from '../../meta';
|
|
|
13
13
|
|
|
14
14
|
export default Capability.makeModule(() =>
|
|
15
15
|
Effect.succeed(
|
|
16
|
-
Capability.contributes(
|
|
16
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
17
17
|
id: meta.id,
|
|
18
18
|
root: () => {
|
|
19
19
|
const { state, updateEphemeral } = useDeckState();
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
import { useSettingsState } from '@dxos/app-framework/
|
|
8
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
|
+
import { Surface, useSettingsState } from '@dxos/app-framework/ui';
|
|
10
|
+
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
10
11
|
|
|
11
12
|
import { Banner, DeckSettings } from '../../components';
|
|
12
13
|
import { meta } from '../../meta';
|
|
@@ -14,18 +15,18 @@ import { type DeckSettingsProps } from '../../types';
|
|
|
14
15
|
|
|
15
16
|
export default Capability.makeModule(() =>
|
|
16
17
|
Effect.succeed(
|
|
17
|
-
Capability.contributes(
|
|
18
|
-
|
|
18
|
+
Capability.contributes(Capabilities.ReactSurface, [
|
|
19
|
+
Surface.create({
|
|
19
20
|
id: `${meta.id}/plugin-settings`,
|
|
20
21
|
role: 'article',
|
|
21
|
-
filter: (data): data is { subject:
|
|
22
|
-
|
|
22
|
+
filter: (data): data is { subject: AppCapabilities.Settings } =>
|
|
23
|
+
AppCapabilities.isSettings(data.subject) && data.subject.prefix === meta.id,
|
|
23
24
|
component: ({ data: { subject } }) => {
|
|
24
25
|
const { settings, updateSettings } = useSettingsState<DeckSettingsProps>(subject.atom);
|
|
25
26
|
return <DeckSettings settings={settings} onSettingsChange={updateSettings} />;
|
|
26
27
|
},
|
|
27
28
|
}),
|
|
28
|
-
|
|
29
|
+
Surface.create({
|
|
29
30
|
id: `${meta.id}/banner`,
|
|
30
31
|
role: 'banner',
|
|
31
32
|
component: ({ data }: { data: { variant?: 'topbar' | 'sidebar' } }) => {
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import { Capability
|
|
7
|
+
import { Capability } from '@dxos/app-framework';
|
|
8
|
+
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
8
9
|
import { createKvsStore } from '@dxos/effect';
|
|
9
10
|
|
|
10
11
|
import { meta } from '../../meta';
|
|
@@ -28,7 +29,7 @@ export default Capability.makeModule(() =>
|
|
|
28
29
|
|
|
29
30
|
return [
|
|
30
31
|
Capability.contributes(DeckCapabilities.Settings, settingsAtom),
|
|
31
|
-
Capability.contributes(
|
|
32
|
+
Capability.contributes(AppCapabilities.Settings, {
|
|
32
33
|
prefix: meta.id,
|
|
33
34
|
schema: DeckSettingsSchema,
|
|
34
35
|
atom: settingsAtom,
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { Atom } from '@effect-atom/atom-react';
|
|
6
6
|
import * as Effect from 'effect/Effect';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
|
+
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
9
10
|
import { createKvsStore } from '@dxos/effect';
|
|
10
11
|
import { invariant } from '@dxos/invariant';
|
|
11
12
|
|
|
@@ -49,7 +50,7 @@ const defaultDeckEphemeralState: DeckEphemeralStateProps = {
|
|
|
49
50
|
|
|
50
51
|
export default Capability.makeModule(
|
|
51
52
|
Effect.fnUntraced(function* () {
|
|
52
|
-
const registry = yield* Capability.get(
|
|
53
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
53
54
|
|
|
54
55
|
// Persisted state using KVS store.
|
|
55
56
|
const stateAtom = createKvsStore({
|
|
@@ -92,13 +93,13 @@ export default Capability.makeModule(
|
|
|
92
93
|
active: deck.solo ? [deck.solo] : deck.active,
|
|
93
94
|
inactive: deck.inactive,
|
|
94
95
|
scrollIntoView: ephemeral.scrollIntoView,
|
|
95
|
-
} satisfies
|
|
96
|
+
} satisfies AppCapabilities.Layout;
|
|
96
97
|
}).pipe(Atom.keepAlive);
|
|
97
98
|
|
|
98
99
|
return [
|
|
99
100
|
Capability.contributes(DeckCapabilities.State, stateAtom),
|
|
100
101
|
Capability.contributes(DeckCapabilities.EphemeralState, ephemeralAtom),
|
|
101
|
-
Capability.contributes(
|
|
102
|
+
Capability.contributes(AppCapabilities.Layout, layoutAtom),
|
|
102
103
|
];
|
|
103
104
|
}),
|
|
104
105
|
);
|
|
@@ -7,7 +7,8 @@ import * as Toolkit from '@effect/ai/Toolkit';
|
|
|
7
7
|
import * as Effect from 'effect/Effect';
|
|
8
8
|
import * as Schema from 'effect/Schema';
|
|
9
9
|
|
|
10
|
-
import { Capability, type CapabilityManager
|
|
10
|
+
import { Capabilities, Capability, type CapabilityManager } from '@dxos/app-framework';
|
|
11
|
+
import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
|
|
11
12
|
import { GenericToolkit } from '@dxos/assistant';
|
|
12
13
|
import { ArtifactId } from '@dxos/assistant';
|
|
13
14
|
import { type SpaceId } from '@dxos/keys';
|
|
@@ -35,7 +36,7 @@ export namespace DeckToolkit {
|
|
|
35
36
|
Toolkit$.toLayer({
|
|
36
37
|
'open-item': ({ id }) =>
|
|
37
38
|
Effect.gen(function* () {
|
|
38
|
-
const registry = capabilityManager.get(
|
|
39
|
+
const registry = capabilityManager.get(Capabilities.AtomRegistry);
|
|
39
40
|
const stateAtom = capabilityManager.get(DeckCapabilities.State);
|
|
40
41
|
const state = registry.get(stateAtom);
|
|
41
42
|
const dxn = ArtifactId.toDXN(id, state.activeDeck as SpaceId).asEchoDXN();
|
|
@@ -45,8 +46,8 @@ export namespace DeckToolkit {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
// TODO(wittjosiah): Get capabilities via layers.
|
|
48
|
-
const { invoke } = capabilityManager.get(
|
|
49
|
-
yield* invoke(
|
|
49
|
+
const { invoke } = capabilityManager.get(Capabilities.OperationInvoker);
|
|
50
|
+
yield* invoke(LayoutOperation.Open, { subject: [`${dxn.spaceId!}:${dxn.echoId}`] });
|
|
50
51
|
}).pipe(Effect.orDie),
|
|
51
52
|
});
|
|
52
53
|
}
|
|
@@ -56,7 +57,7 @@ export default Capability.makeModule(
|
|
|
56
57
|
const capabilityManager = yield* Capability.Service;
|
|
57
58
|
|
|
58
59
|
return Capability.contributes(
|
|
59
|
-
|
|
60
|
+
AppCapabilities.Toolkit,
|
|
60
61
|
GenericToolkit.make(DeckToolkit.Toolkit, DeckToolkit.createLayer(capabilityManager)),
|
|
61
62
|
);
|
|
62
63
|
}),
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
8
9
|
import { invariant } from '@dxos/invariant';
|
|
9
10
|
|
|
10
11
|
import { DeckCapabilities, type DeckStateProps, defaultDeck } from '../../types';
|
|
@@ -12,8 +13,8 @@ import { DeckCapabilities, type DeckStateProps, defaultDeck } from '../../types'
|
|
|
12
13
|
// TODO(wittjosiah): Cleanup the url handling. May justify introducing routing capabilities.
|
|
13
14
|
export default Capability.makeModule(
|
|
14
15
|
Effect.fnUntraced(function* () {
|
|
15
|
-
const { invokeSync } = yield* Capability.get(
|
|
16
|
-
const registry = yield* Capability.get(
|
|
16
|
+
const { invokeSync } = yield* Capability.get(Capabilities.OperationInvoker);
|
|
17
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
17
18
|
const stateAtom = yield* Capability.get(DeckCapabilities.State);
|
|
18
19
|
|
|
19
20
|
// Helper to get state.
|
|
@@ -49,14 +50,14 @@ export default Capability.makeModule(
|
|
|
49
50
|
|
|
50
51
|
const [_, nextDeck, nextSolo] = pathname.split('/');
|
|
51
52
|
if (nextDeck && nextDeck !== state.activeDeck) {
|
|
52
|
-
invokeSync(
|
|
53
|
+
invokeSync(LayoutOperation.SwitchWorkspace, { subject: nextDeck });
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
const deck = getDeck();
|
|
56
57
|
if (nextSolo && nextSolo !== deck.solo) {
|
|
57
|
-
invokeSync(
|
|
58
|
+
invokeSync(LayoutOperation.SetLayoutMode, { subject: nextSolo, mode: 'solo' });
|
|
58
59
|
} else if (!nextSolo && deck.solo) {
|
|
59
|
-
invokeSync(
|
|
60
|
+
invokeSync(LayoutOperation.SetLayoutMode, { mode: 'deck' });
|
|
60
61
|
}
|
|
61
62
|
};
|
|
62
63
|
|
|
@@ -85,7 +86,7 @@ export default Capability.makeModule(
|
|
|
85
86
|
}
|
|
86
87
|
});
|
|
87
88
|
|
|
88
|
-
return Capability.contributes(
|
|
89
|
+
return Capability.contributes(Capabilities.Null, null, () =>
|
|
89
90
|
Effect.sync(() => {
|
|
90
91
|
window.removeEventListener('popstate', handleNavigation);
|
|
91
92
|
unsubscribe();
|