blob: 9b3eaea18ea4d25ee4b2d1283f905a3644381aca [file] [log] [blame]
Adrià Vilanova Martínez18d03c42024-04-21 16:43:01 +02001import Feature from '../common/architecture/features/Feature';
2import {
3 ScriptEnvironment,
4 ScriptPage,
5 ScriptRunPhase,
6} from '../common/architecture/scripts/Script';
7import InfiniteScrollFeature from './infiniteScroll/infiniteScroll.feature';
8
9export type ConcreteFeatureClass = { new (): Feature };
10
11export interface Context {
12 page: ScriptPage;
13 environment: ScriptEnvironment;
14 runPhase: ScriptRunPhase;
15}
16
17export default class Features {
18 private features: ConcreteFeatureClass[] = [InfiniteScrollFeature];
19 private initializedFeatures: Feature[];
20
21 runScripts(context: Context) {
22 const scripts = this.getScripts(context).sort((a, b) =>
23 a.priority < b.priority ? -1 : 1,
24 );
25 for (const script of scripts) {
26 script.execute();
27 }
28 }
29
30 getScripts(context: Context) {
31 const features = this.getFeatures();
32 const allScripts = features.map((feature) => feature.getScripts()).flat(1);
33 return allScripts.filter(
34 (script) =>
35 script.page === context.page &&
36 script.environment === context.environment &&
37 script.runPhase === context.runPhase,
38 );
39 }
40
41 private getFeatures() {
42 if (this.initializedFeatures === undefined) {
43 this.initializedFeatures = this.features.map((feature) => new feature());
44 }
45 return this.initializedFeatures;
46 }
47}