-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNavigator.js
More file actions
66 lines (50 loc) · 1.67 KB
/
Navigator.js
File metadata and controls
66 lines (50 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { History } from '@navigationjs/core';
export default class Navigator {
constructor(name) {
this.name = name;
this.scenes = {};
this.history = new History(this.name);
}
addScenes = (...scenes) => {
scenes.forEach(it => (this.scenes[it.name] = it));
};
removeScenes = (...scenes) => {
scenes.forEach(it => delete this.scenes[it]);
};
go = async (name, duration) => {
const scene = this.scenes[name];
if (!scene) return Promise.reject();
const alreadyInHistory = this.history.current() === name;
if (alreadyInHistory) return Promise.resolve();
const promises = this.history.chain.map((sceneName, index) => {
const scene = this.scenes[sceneName];
const level = this.history.chain.length - index - 1;
return scene.dive(level + 1, duration);
});
promises.push(scene.show(duration));
await Promise.all(promises);
this.history.push(name);
};
current = () => this.history.current();
back = async duration => {
if (this.history.isEmpty()) return Promise.resolve();
const promises = [];
const name = this.current();
const scene = this.scenes[name];
if (!scene) return Promise.reject();
promises.push(scene.hide(duration));
this.history.chain.forEach((sceneName, index) => {
const scene = this.scenes[sceneName];
const level = this.history.chain.length - index - 1;
promises.push(scene.dive(level - 1, duration));
});
await Promise.all(promises);
this.history.pop();
};
reset = async () => {
await Promise.all(
Object.keys(this.scenes).map(key => this.scenes[key].hide(0))
);
this.history = new History(this.name);
};
}