financial-assistant

Форк
0
55 строк · 1.5 Кб
1
import { EventTypes, Links } from "../contracts/enums";
2
import EventObserver from "../observer/observer";
3

4
class Router {
5
  private observer: EventObserver;
6
  private routes: Map<Links, () => void> = new Map();
7

8
  constructor(observer: EventObserver) {
9
    this.observer = observer;
10
    this.subscribeToUrlChange();
11
  }
12

13
  private subscribeToUrlChange() {
14
    this.observer.subscribe(EventTypes.CHANGE_PAGE, this.navigate.bind(this));
15
    window.addEventListener("popstate", () => this.resolveRoute());
16
    window.addEventListener("hashchange", () => this.resolveRoute());
17
  }
18

19
  public getPath(): Links {
20
    const url = new URL(window.location.href);
21
    const path = url.pathname.slice(1);
22

23
    if (!this.isValidPath(path)) {
24
      throw new Error("Unavailable URL: " + path);
25
    }
26
    return path === "" ? Links.home : (path as Links);
27
  }
28

29
  private isValidPath(path: string): boolean {
30
    return Object.values(Links).includes(path as Links) || path === "";
31
  }
32

33
  public resolveRoute() {
34
    const callback = this.routes.get(this.getPath());
35
    if (callback) callback();
36
  }
37

38
  public route(path: Links, callback: () => void): void {
39
    this.routes.set(path, callback);
40
  }
41

42
  private updateURL(path: Links): void {
43
    const url = new URL(location.toString());
44
    url.pathname = path;
45
    history.pushState(null, "", url.toString());
46
  }
47

48
  private navigate(path: Links = Links.home) {
49
    this.updateURL(path);
50
    const callback = this.routes.get(path);
51
    if (callback) callback();
52
  }
53
}
54

55
export default Router;
56

57

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.