@netless/window-manager 0.4.28 → 0.4.30-canary.1
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/CHANGELOG.md +5 -0
- package/dist/App/AppContext.d.ts +1 -1
- package/dist/App/AppProxy.d.ts +1 -1
- package/dist/InternalEmitter.d.ts +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/index.cjs.js +12 -12
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.es.js +51 -20
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +12 -12
- package/dist/index.umd.js.map +1 -1
- package/docs/api.md +3 -1
- package/package.json +1 -1
- package/src/App/AppContext.ts +8 -4
- package/src/App/AppProxy.ts +7 -5
- package/src/AppManager.ts +20 -6
- package/src/InternalEmitter.ts +2 -1
- package/src/ReconnectRefresher.ts +18 -4
- package/src/constants.ts +1 -0
- package/src/index.ts +9 -3
package/docs/api.md
CHANGED
@@ -218,9 +218,11 @@ manager.addPage({ scene: { name: "page2" } }) // 传入 page 信息
|
|
218
218
|
<h3 id="removePage">removePage</h3>
|
219
219
|
|
220
220
|
> 移除一页
|
221
|
+
> 当只剩一页时, 最后一页不允许被删除
|
221
222
|
|
222
223
|
```ts
|
223
|
-
const success = await manager.removePage(
|
224
|
+
const success = await manager.removePage() // 默认删除当前页
|
225
|
+
const success = await manager.removePage(1) // 可以删除指定 index
|
224
226
|
```
|
225
227
|
|
226
228
|
<h3 id="refresh">refresh</h3>
|
package/package.json
CHANGED
package/src/App/AppContext.ts
CHANGED
@@ -231,13 +231,17 @@ export class AppContext<TAttributes = any, TMagixEventPayloads = any, TAppOption
|
|
231
231
|
}
|
232
232
|
};
|
233
233
|
|
234
|
-
public removePage = async (index
|
235
|
-
|
234
|
+
public removePage = async (index?: number): Promise<boolean> => {
|
235
|
+
const needRemoveIndex = index === undefined ? this.pageState.index : index;
|
236
|
+
if (this.pageState.length === 1) {
|
237
|
+
console.warn(`[WindowManager]: can not remove the last page`);
|
238
|
+
return false;
|
239
|
+
}
|
240
|
+
if (needRemoveIndex < 0 || needRemoveIndex >= this.pageState.length) {
|
236
241
|
console.warn(`[WindowManager]: page index ${index} out of range`);
|
237
242
|
return false;
|
238
243
|
}
|
239
|
-
this.appProxy.removeSceneByIndex(
|
240
|
-
return true;
|
244
|
+
return this.appProxy.removeSceneByIndex(needRemoveIndex);;
|
241
245
|
}
|
242
246
|
|
243
247
|
public get pageState(): PageState {
|
package/src/App/AppProxy.ts
CHANGED
@@ -27,7 +27,8 @@ import type { SceneState, View, SceneDefinition } from "white-web-sdk";
|
|
27
27
|
import type { AppManager } from "../AppManager";
|
28
28
|
import type { NetlessApp } from "../typings";
|
29
29
|
import type { ReadonlyTeleBox } from "@netless/telebox-insider";
|
30
|
-
import {
|
30
|
+
import type { PageRemoveService, PageState } from "../Page";
|
31
|
+
import { calculateNextIndex } from "../Page";
|
31
32
|
|
32
33
|
export type AppEmitter = Emittery<AppEmitterEvent>;
|
33
34
|
|
@@ -240,6 +241,11 @@ export class AppProxy implements PageRemoveService {
|
|
240
241
|
}
|
241
242
|
|
242
243
|
public async onReconnected() {
|
244
|
+
const isExist = Boolean(this.manager.attributes.apps[this.id]);
|
245
|
+
if (!isExist) {
|
246
|
+
await this.destroy(true, false, true);
|
247
|
+
return;
|
248
|
+
}
|
243
249
|
this.appEmitter.emit("reconnected", undefined);
|
244
250
|
const currentAppState = this.getAppInitState(this.id);
|
245
251
|
await this.destroy(true, false, true);
|
@@ -415,10 +421,6 @@ export class AppProxy implements PageRemoveService {
|
|
415
421
|
public async removeSceneByIndex(index: number) {
|
416
422
|
const scenePath = this._pageState.getFullPath(index);
|
417
423
|
if (scenePath) {
|
418
|
-
// 不能删除所有场景
|
419
|
-
if (this.pageState.length <= 1) {
|
420
|
-
return false;
|
421
|
-
}
|
422
424
|
const nextIndex = calculateNextIndex(index, this.pageState);
|
423
425
|
// 只修改 focus path 不修改 FullPath
|
424
426
|
this.setSceneIndexWithoutSync(nextIndex);
|
package/src/AppManager.ts
CHANGED
@@ -181,7 +181,10 @@ export class AppManager {
|
|
181
181
|
}
|
182
182
|
this.callbacksNode = this.displayer.createScenesCallback(ROOT_DIR, {
|
183
183
|
onAddScene: this.onSceneChange,
|
184
|
-
onRemoveScene:
|
184
|
+
onRemoveScene: async (node, name) => {
|
185
|
+
await this.onSceneChange(node);
|
186
|
+
emitter.emit("rootDirSceneRemoved", name);
|
187
|
+
},
|
185
188
|
});
|
186
189
|
if (this.callbacksNode) {
|
187
190
|
this.updateSceneState(this.callbacksNode);
|
@@ -196,13 +199,22 @@ export class AppManager {
|
|
196
199
|
const nextIndex = calculateNextIndex(index, this.windowManger.pageState);
|
197
200
|
this.setSceneIndexWithoutSync(nextIndex);
|
198
201
|
this.dispatchInternalEvent(Events.SetAppFocusIndex, { type: "main", index: nextIndex });
|
202
|
+
const scene = this.callbacksNode?.scenes[index];
|
199
203
|
setTimeout(() => {
|
200
|
-
const scene = this.callbacksNode?.scenes[index];
|
201
204
|
if (scene) {
|
202
205
|
removeScenes(this.room, `${ROOT_DIR}${scene}`, index)
|
203
206
|
}
|
204
207
|
}, 100);
|
205
|
-
return
|
208
|
+
return new Promise<boolean>((resolve, reject) => {
|
209
|
+
emitter.once("rootDirSceneRemoved").then(name => {
|
210
|
+
if (name === scene) {
|
211
|
+
resolve(true);
|
212
|
+
}
|
213
|
+
}).catch(e => {
|
214
|
+
console.log(`[WindowManager]: removePage error: ${e}`);
|
215
|
+
reject(false);
|
216
|
+
});
|
217
|
+
});
|
206
218
|
}
|
207
219
|
|
208
220
|
public setSceneIndexWithoutSync = (index: number) => {
|
@@ -215,12 +227,14 @@ export class AppManager {
|
|
215
227
|
private onSceneChange = (node: ScenesCallbacksNode) => {
|
216
228
|
this.mainViewScenesLength = node.scenes.length;
|
217
229
|
this.updateSceneState(node);
|
218
|
-
this.emitMainViewScenesChange(this.mainViewScenesLength);
|
230
|
+
return this.emitMainViewScenesChange(this.mainViewScenesLength);
|
219
231
|
};
|
220
232
|
|
221
233
|
private emitMainViewScenesChange = (length: number) => {
|
222
|
-
|
223
|
-
|
234
|
+
return Promise.all([
|
235
|
+
callbacks.emit("mainViewScenesLengthChange", length),
|
236
|
+
emitter.emit("changePageState"),
|
237
|
+
]);
|
224
238
|
};
|
225
239
|
|
226
240
|
private updateSceneState = (node: ScenesCallbacksNode) => {
|
package/src/InternalEmitter.ts
CHANGED
@@ -25,7 +25,8 @@ export type EmitterEvent = {
|
|
25
25
|
cursorMove: CursorMovePayload;
|
26
26
|
updateManagerRect: undefined;
|
27
27
|
focusedChange: { focused: string | undefined; prev: string | undefined };
|
28
|
-
rootDirRemoved: undefined;
|
28
|
+
rootDirRemoved: undefined; // 根目录整个被删除
|
29
|
+
rootDirSceneRemoved: string; // 根目录下的场景被删除
|
29
30
|
setReadonly: boolean;
|
30
31
|
changePageState: undefined;
|
31
32
|
writableChange: boolean;
|
@@ -3,6 +3,7 @@ import { log } from "./Utils/log";
|
|
3
3
|
import { RoomPhase } from "white-web-sdk";
|
4
4
|
import type { Room } from "white-web-sdk";
|
5
5
|
import type { EmitterType } from "./InternalEmitter";
|
6
|
+
import { EnsureReconnectEvent } from "./constants";
|
6
7
|
|
7
8
|
export type ReconnectRefresherContext = {
|
8
9
|
emitter: EmitterType;
|
@@ -20,8 +21,20 @@ export class ReconnectRefresher {
|
|
20
21
|
public setRoom(room: Room | undefined) {
|
21
22
|
this.room = room;
|
22
23
|
this.phase = room?.phase;
|
23
|
-
room
|
24
|
-
|
24
|
+
if (room) {
|
25
|
+
room.callbacks.off("onPhaseChanged", this.onPhaseChanged);
|
26
|
+
room.callbacks.on("onPhaseChanged", this.onPhaseChanged);
|
27
|
+
// 重连成功之后向服务发送一次消息, 确认当前的状态是最新的
|
28
|
+
room.addMagixEventListener(
|
29
|
+
EnsureReconnectEvent,
|
30
|
+
payload => {
|
31
|
+
if (payload.authorId === room.observerId) {
|
32
|
+
this.onReconnected();
|
33
|
+
}
|
34
|
+
},
|
35
|
+
{ fireSelfEventAfterCommit: true }
|
36
|
+
);
|
37
|
+
}
|
25
38
|
}
|
26
39
|
|
27
40
|
public setContext(ctx: ReconnectRefresherContext) {
|
@@ -33,7 +46,7 @@ export class ReconnectRefresher {
|
|
33
46
|
this.ctx.emitter.emit("startReconnect");
|
34
47
|
}
|
35
48
|
if (phase === RoomPhase.Connected && this.phase === RoomPhase.Reconnecting) {
|
36
|
-
this.
|
49
|
+
this.room?.dispatchMagixEvent(EnsureReconnectEvent, {});
|
37
50
|
}
|
38
51
|
this.phase = phase;
|
39
52
|
};
|
@@ -51,7 +64,7 @@ export class ReconnectRefresher {
|
|
51
64
|
}
|
52
65
|
});
|
53
66
|
this.ctx.emitter.emit("onReconnected");
|
54
|
-
}
|
67
|
+
};
|
55
68
|
|
56
69
|
private releaseDisposers() {
|
57
70
|
this.disposers.forEach(disposer => {
|
@@ -96,6 +109,7 @@ export class ReconnectRefresher {
|
|
96
109
|
|
97
110
|
public destroy() {
|
98
111
|
this.room?.callbacks.off("onPhaseChanged", this.onPhaseChanged);
|
112
|
+
this.room?.removeMagixEventListener(EnsureReconnectEvent, this.onReconnected);
|
99
113
|
this.releaseDisposers();
|
100
114
|
}
|
101
115
|
}
|
package/src/constants.ts
CHANGED
package/src/index.ts
CHANGED
@@ -537,17 +537,23 @@ export class WindowManager extends InvisiblePlugin<WindowMangerAttributes> imple
|
|
537
537
|
}
|
538
538
|
}
|
539
539
|
|
540
|
-
|
540
|
+
/**
|
541
|
+
* 删除一页
|
542
|
+
* 默认删除当前页, 可以删除指定 index 页
|
543
|
+
* 最低保留一页
|
544
|
+
*/
|
545
|
+
public async removePage(index?: number): Promise<boolean> {
|
541
546
|
if (this.appManager) {
|
547
|
+
const needRemoveIndex = index === undefined ? this.pageState.index : index;
|
542
548
|
if (this.pageState.length === 1) {
|
543
549
|
console.warn(`[WindowManager]: can not remove the last page`);
|
544
550
|
return false;
|
545
551
|
}
|
546
|
-
if (
|
552
|
+
if (needRemoveIndex < 0 || needRemoveIndex >= this.pageState.length) {
|
547
553
|
console.warn(`[WindowManager]: index ${index} out of range`);
|
548
554
|
return false;
|
549
555
|
}
|
550
|
-
return this.appManager.removeSceneByIndex(
|
556
|
+
return this.appManager.removeSceneByIndex(needRemoveIndex);;
|
551
557
|
} else {
|
552
558
|
return false;
|
553
559
|
}
|