Passed
Push — develop ( 0b98e4...d22535 )
by Endre
05:35
created

Action.getPageFromRegistry   A

Complexity

Conditions 3

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 11
dl 0
loc 14
ccs 6
cts 6
cp 1
crap 3
rs 9.85
c 0
b 0
f 0
1
import RouterRegistry from '@enbock/application-router/Registry';
2
import Router, {PageData} from '@enbock/application-router/Router';
3
import {Observer, ObserverAdapter} from '@enbock/state-value-observer/ValueObserver';
4
import {Adapter, ModulePageData} from './Application';
5
import ModuleLoader from './ModuleLoader';
6
7
class PageNotInRegistry extends Error {}
8
9
export default class Action {
10
  private menuOpenState: Observer<boolean>;
11
  private router: Router;
12
  private routerAdapter: ObserverAdapter<PageData | null>;
13
  private routerRegistry: RouterRegistry;
14
  private moduleLoader: ModuleLoader;
15
  private currentPage: Observer<PageData | null>;
16
17
  constructor(
18
    menuOpenState: Observer<boolean>,
19
    currentPage: Observer<PageData | null>,
20
    router: Router,
21
    routerRegistry: RouterRegistry,
22
    routerAdapter: ObserverAdapter<PageData | null>,
23
    moduleLoader: ModuleLoader
24
  ) {
25 9
    this.routerAdapter = routerAdapter;
26 9
    this.menuOpenState = menuOpenState;
27 9
    this.currentPage = currentPage;
28 9
    this.router = router;
29 9
    this.routerRegistry = routerRegistry;
30 9
    this.moduleLoader = moduleLoader;
31
  }
32
33
  get adapter(): Adapter {
34 8
    return {
35
      onPageChanged: this.loadModule.bind(this),
36
      onGithubClick: this.openGithubWindow.bind(this),
37
      onMenuClick: this.switchMenuState.bind(this),
38
      onClose: this.closeMenu.bind(this),
39
      onMenu: this.switchPage.bind(this)
40
    };
41
  }
42
43
  public loadPageConfig() {
44 2
    const homePage: ModulePageData = {
45
      name: 'home',
46
      baseUrl: './',
47
      currentUrl: './',
48
      module: './HelloWorld'
49
    };
50 2
    const settingsPage: ModulePageData = {
51
      name: 'settings',
52
      baseUrl: './settings/',
53
      currentUrl: './settings/',
54
      module: './Settings/Settings'
55
    };
56 2
    this.routerRegistry.registerPage(homePage);
57 2
    this.routerRegistry.registerPage(settingsPage);
58
59 2
    if (this.currentPage.value == null) {
60 1
      this.router.changePage(homePage);
61
    } else {
62 1
      this.routerAdapter.onChange(this.currentPage.value);
63
    }
64
  }
65
66
  protected openGithubWindow(): void {
67 1
    window.open('https://github.com/enbock/Time-Tracker/', '_blank');
68
  }
69
70
  protected switchMenuState(): void {
71 1
    this.menuOpenState.value = !this.menuOpenState.value;
72
  }
73
74
  protected closeMenu(): void {
75 3
    this.menuOpenState.value = false;
76
  }
77
78
  protected switchPage(name: string): void {
79 2
    try {
80 2
      const page: PageData = this.getPageFromRegistry(name);
81 1
      this.router.changePage(page);
82 1
      this.closeMenu();
83
    } catch (notInRegistryError) {
84
    }
85
  }
86
87
  private getPageFromRegistry(name: string): PageData {
88 2
    let page: PageData | null = null;
89 2
    this.routerRegistry.getPages().forEach(
90
      function searchForName(item: PageData): void {
91 2
        if (item.name == name) page = item;
92
      }
93
    );
94
95 2
    if (page === null) {
96 1
      throw new PageNotInRegistry();
97
    }
98
99 1
    return page;
100
  }
101
102
  protected async loadModule(newValue: PageData): Promise<void> {
103 1
    await this.moduleLoader.loadModule((newValue as ModulePageData).module);
104
  }
105
}
106