~sirn/fanboi2

ref: 5b482cfc1bfb0bb1e89715cb57c7bac864391768 fanboi2/assets/app/javascripts/components/topic_manager.ts -rw-r--r-- 1.3 KiB
5b482cfcKridsada Thanabulpong 0.30.0 3 years ago
                                                                                
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
import {VNode, create, diff, patch} from 'virtual-dom';
import {CollectionComponent} from './base';
import {ITopicEventConstructor, ITopicEventHandler} from './topic/base';
import {TopicState} from './topic/topic_state';
import {TopicLoadPosts} from './topic/topic_load_posts';
import {TopicNewPost} from './topic/topic_new_post';


export class TopicManager extends CollectionComponent {
    public targetSelector = '[data-topic]';

    protected bindOne($target: Element): void {
        let topicIdAttr = $target.getAttribute('data-topic');

        if (topicIdAttr) {
          let topicId = parseInt(topicIdAttr, 10);

          this.bindEvent($target, topicId, 'updateState', TopicState);
          this.bindEvent($target, topicId, 'readState',   TopicState);
          this.bindEvent($target, topicId, 'loadPosts',   TopicLoadPosts);
          this.bindEvent($target, topicId, 'newPost',     TopicNewPost);
        }
    }

    private bindEvent(
        $target: Element,
        topicId: number,
        eventName: string,
        eventHandler: ITopicEventConstructor
    ): void {
        let handler = new eventHandler(topicId, $target);

        $target.addEventListener(eventName, (e: CustomEvent) => {
            e.stopPropagation();
            handler.bind(e);
        });
    }
}