-
-
Notifications
You must be signed in to change notification settings - Fork 831
/
AbsorbersPlugin.ts
105 lines (83 loc) · 3.28 KB
/
AbsorbersPlugin.ts
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import type { IPlugin } from "../../Core/Interfaces/IPlugin";
import type { Container } from "../../Core/Container";
import { Absorbers } from "./Absorbers";
import { Utils } from "../../Utils";
import type { RecursivePartial } from "../../Types";
import { AbsorberClickMode } from "./Enums";
import type { IAbsorberOptions } from "./Options/Interfaces/IAbsorberOptions";
import type { IOptions } from "../../Options/Interfaces/IOptions";
import { Options } from "../../Options/Classes/Options";
import { Absorber } from "./Options/Classes/Absorber";
/**
* @category Absorbers Plugin
*/
class AbsorbersPlugin implements IPlugin {
readonly id;
constructor() {
this.id = "absorbers";
}
getPlugin(container: Container): Absorbers {
return new Absorbers(container);
}
needsPlugin(options?: RecursivePartial<IOptions & IAbsorberOptions>): boolean {
if (options === undefined) {
return false;
}
const absorbers = options.absorbers;
let loadAbsorbers = false;
if (absorbers instanceof Array) {
if (absorbers.length) {
loadAbsorbers = true;
}
} else if (absorbers !== undefined) {
loadAbsorbers = true;
} else if (
options.interactivity?.events?.onClick?.mode &&
Utils.isInArray(AbsorberClickMode.absorber, options.interactivity.events.onClick.mode)
) {
loadAbsorbers = true;
}
return loadAbsorbers;
}
loadOptions(options: Options, source?: RecursivePartial<IOptions & IAbsorberOptions>): void {
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
return;
}
const optionsCast = (options as unknown) as IAbsorberOptions;
if (source?.absorbers) {
if (source?.absorbers instanceof Array) {
optionsCast.absorbers = source?.absorbers.map((s) => {
const tmp = new Absorber();
tmp.load(s);
return tmp;
});
} else {
let absorberOptions = optionsCast.absorbers as Absorber;
if (absorberOptions?.load === undefined) {
optionsCast.absorbers = absorberOptions = new Absorber();
}
absorberOptions.load(source?.absorbers);
}
}
const interactivityAbsorbers = source?.interactivity?.modes?.absorbers;
if (interactivityAbsorbers) {
if (interactivityAbsorbers instanceof Array) {
optionsCast.interactivity.modes.absorbers = interactivityAbsorbers.map((s) => {
const tmp = new Absorber();
tmp.load(s);
return tmp;
});
} else {
let absorberOptions = optionsCast.interactivity.modes.absorbers as Absorber;
if (absorberOptions?.load === undefined) {
optionsCast.interactivity.modes.absorbers = absorberOptions = new Absorber();
}
absorberOptions.load(interactivityAbsorbers);
}
}
}
}
const plugin = new AbsorbersPlugin();
export type { IAbsorberOptions };
export { plugin as AbsorbersPlugin };
export * from "./Enums";