@vkontakte/videoplayer-interactive 1.0.19-dev.100e5528.0 → 1.0.19-dev.1ff354f7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,40 @@
1
- export class Interactives {
2
- constructor(options: any);
1
+ import { Observable, Subject, ValueSubject } from '@vkontakte/videoplayer-shared';
2
+ import { LatestChapter, LatestManifest } from '../../movika.core/manifest';
3
+ import { type InteractiveRange } from './utils/getInteractiveRanges';
4
+ import type { IOptionalInteractiveOptions } from './types';
5
+ import { IPlayer } from '@vkontakte/videoplayer-core';
6
+ import { InstanceStatistics } from '../../modules/SeamlessController/InstanceManager';
7
+ declare enum INTERACTIVE_APP_STATES {
8
+ created = 0,
9
+ initiated = 1,
10
+ ready = 2,
11
+ destroyed = 3
12
+ }
13
+ export declare class Interactives {
14
+ private subscription;
15
+ private globalEventEmitter;
16
+ private animation;
17
+ private eventManager;
18
+ private seekToInteractiveController;
19
+ private endedRanges;
20
+ private gameControllers;
21
+ private rootElement;
22
+ private factories;
23
+ private isFirstChapterFetched;
24
+ private options;
25
+ private manifestController;
26
+ private resizeManager;
27
+ private historyController;
28
+ private player;
29
+ private interactiveEvents;
30
+ private selectBranches;
31
+ private seamlessController;
32
+ private graph;
33
+ private lastFrame;
34
+ private noInteractionTimeout;
35
+ appState: INTERACTIVE_APP_STATES;
3
36
  state: {
4
- prevChapter$: ValueSubject<null>;
37
+ prevChapter$: ValueSubject<Nullable<import("../../movika.core/manifest/types").Chapter>>;
5
38
  isInitialChapter$: ValueSubject<boolean>;
6
39
  isFirstChapter$: ValueSubject<boolean>;
7
40
  isEndChapter$: ValueSubject<boolean>;
@@ -9,98 +42,77 @@ export class Interactives {
9
42
  calledByInteractive$: ValueSubject<boolean>;
10
43
  lastChapterChangeWasInitiatedByInteractive$: ValueSubject<boolean>;
11
44
  disabledControls$: ValueSubject<boolean>;
12
- interactiveRanges$: ValueSubject<never[]>;
45
+ interactiveRanges$: ValueSubject<InteractiveRange[]>;
13
46
  isInteractiveTime$: ValueSubject<boolean>;
14
- statistics$: ValueSubject<null>;
47
+ statistics$: ValueSubject<Nullable<InstanceStatistics>>;
48
+ isSeekable$: ValueSubject<boolean>;
15
49
  };
16
50
  events: {
17
- noInteraction$: Subject<any>;
51
+ noInteraction$: Subject<void>;
18
52
  };
19
- options: any;
20
- factories: Map<string, (container: any, rootElement: any) => import("./containers").ChoiceContainer | undefined>;
21
- rootElement: HTMLDivElement;
22
- isFirstChapterFetched: boolean;
23
- appState: 0;
24
- clearHistoryIfEnded: () => void;
25
- /**
26
- * Returns an object with observables used for sending statistics
27
- * @returns {any}
28
- */
29
- getStatEvents(): any;
30
- setPlayer(player: any): void;
31
- /**
32
- * Set new manifest
33
- *
34
- * @async
35
- * @param {Record<string, any> | string} manifest whose version is higher than 3
36
- * @returns {Promise<any>}
37
- */
38
- setManifest(manifest: Record<string, any> | string): Promise<any>;
39
- /**
40
- * @param {string[]} chapterIds
41
- */
42
- setVisitedChapters(chapterIds: string[]): void;
43
- /**
44
- * @typedef {Object} VideosInfo
45
- * @property {string} id
46
- * @property {string} cover
47
- * @property {string=} title
48
- */
49
- /**
50
- * @param {Array<VideosInfo>} videosInfo
51
- */
52
- updateGraphVideosInfo(videosInfo: Array<{
53
- id: string;
54
- cover: string;
55
- title?: string | undefined;
56
- }>): void;
57
- /**
58
- * Set new chapter
59
- *
60
- * @async
61
- * @param {{ chapterId?: string; pushToHistory?: boolean }}
62
- * @returns {Promise<any>}
63
- */
64
- setChapter({ chapterId, pushToHistory }?: {
53
+ constructor(options: IOptionalInteractiveOptions);
54
+ private clearHistoryIfEnded;
55
+ private initSubscriptions;
56
+ private initSeamless;
57
+ private handleSeamlessPlayerChanged;
58
+ private onPlaybackStarted;
59
+ private handlePositionChange;
60
+ private registerVideoEvents;
61
+ private removeControllers;
62
+ private setGameControllers;
63
+ private filterGameControllers;
64
+ private checkIfSeekable;
65
+ private updateLastEventInfo;
66
+ private pushChapterToHistory;
67
+ private completeInteractiveRange;
68
+ private clearNoInteractionTimeout;
69
+ private reset;
70
+ init(): void;
71
+ setManifest(manifest: any): Promise<LatestManifest | undefined>;
72
+ setPlayer(player: IPlayer): void;
73
+ setChapter({ chapterId, pushToHistory, playPrev }?: {
65
74
  chapterId?: string;
66
75
  pushToHistory?: boolean;
67
- }): Promise<any>;
76
+ playPrev?: boolean;
77
+ }): Promise<void>;
78
+ getStatEvents(): {
79
+ click$: Observable<unknown>;
80
+ nextMovie$: Observable<unknown>;
81
+ };
68
82
  toggleGraphView(show?: boolean): void;
69
- init(): void;
83
+ setVisitedChapters(chapterIds: string[]): void;
84
+ updateGraphVideosInfo(videosInfo: any): void;
70
85
  deadEndCheck(): boolean;
71
86
  allControlsAreRemoved(): boolean;
72
- isEndedExpectation(): any;
87
+ isEndedExpectation(): boolean;
73
88
  playPrevChapter(): void;
74
- setDisabledControls(value: any): void;
75
- isSupport(manifest?: any): boolean;
89
+ setDisabledControls(value: boolean): void;
90
+ isSupport(manifest?: Nullable<import("../../movika.core/manifest/manifest_3_3/manifest").Manifest_3_3>): boolean;
76
91
  getInitialVideoInfo(): {
77
- videoId: any;
78
- chapterId: any;
92
+ videoId: string | null;
93
+ chapterId: string;
79
94
  };
80
- getHistoryState(): any;
81
- getIsSeekable(): ValueSubject<boolean>;
82
- getInteractiveRanges(): import("./utils/getInteractiveRanges").ReduceAcc;
83
- /**
84
- * Description
85
- * @param {number|undefined} [offsetMs="3000"]
86
- * @returns {number | null}
87
- */
88
- getNextInteractiveStartTime(offsetMs?: number | undefined): number | null;
95
+ getHistoryState(): import("./utils/HistoryController").HistoryControllerState;
89
96
  /**
90
- * Description
91
- * @param {string} [chapterId]
92
- * @returns {any}
93
- */
94
- getChapterBranches(chapterId?: string | undefined): any;
95
- getCurrentChapter(): any;
96
- getCurrentManifest(): any;
97
- addFactory(type: any, factory: any): void;
98
- removeFactory(type: any): void;
99
- on(...args: any[]): this;
100
- off(...args: any[]): this;
101
- once(...args: any[]): this;
97
+ * @deprecated Используйте this.state.isSeekable$
98
+ */
99
+ getIsSeekable(): ValueSubject<boolean>;
100
+ getInteractiveRanges(): import("./utils/getInteractiveRanges").InteractiveRanges;
101
+ getNextInteractiveStartTime(offsetMs?: number): number | null;
102
+ getChapterBranches(chapterId?: string): {
103
+ chapter: LatestChapter;
104
+ graph: import("../../movika.core/manifest/manifest_3_3/graph").GraphEditChapter | import("../../movika.core/manifest/manifest_3_3/graph").GraphViewChapter | undefined;
105
+ media: import("../../movika.core/manifest").ManifestVideo;
106
+ }[];
107
+ getCurrentChapter(): {
108
+ chapter: Nullable<import("../../movika.core/manifest/types").Chapter>;
109
+ media: Nullable<import("../../movika.core/manifest/manifest_3_3/manifest").Media>;
110
+ graph: Nullable<import("../../movika.core/manifest/manifest_3_3/graph").GraphDesign>;
111
+ };
112
+ getCurrentManifest(): Nullable<import("../../movika.core/manifest/manifest_3_3/manifest").Manifest_3_3>;
113
+ on(eventName: string, fn: Function): this;
114
+ off(eventName: string, fn: Function): this;
115
+ once(eventName: string, fn: Function): this;
102
116
  destroy(): void;
103
- #private;
104
117
  }
105
- import { ValueSubject } from '@vkontakte/videoplayer-shared';
106
- import { Subject } from '@vkontakte/videoplayer-shared';
118
+ export {};
@@ -1,9 +1,13 @@
1
- export class Layout {
2
- constructor(layout: any);
3
- layout: any;
1
+ import { LatestContainer, LatestControlLayoutParams } from '../../movika.core/manifest';
2
+ declare abstract class Layout {
3
+ layout: LatestContainer['layout'];
4
+ protected constructor(layout: LatestContainer['layout']);
5
+ abstract setContainerLayout(target: HTMLElement): any;
6
+ abstract setControlLayout(target: HTMLElement, layoutParams: LatestControlLayoutParams): any;
4
7
  }
5
- export function createRelativeLayout(layout: any): RelativeLayout | undefined;
6
- export class RelativeLayout extends Layout {
7
- setContainerLayout(target: any): void;
8
- setControlLayout(target: any, layoutParams: any): void;
8
+ export declare class RelativeLayout extends Layout {
9
+ constructor(layout: any);
10
+ setContainerLayout(target: HTMLElement): void;
11
+ setControlLayout(target: HTMLElement, layoutParams: LatestControlLayoutParams): void;
9
12
  }
13
+ export {};
@@ -1,11 +1,2 @@
1
- export function createAreaControl(control: any): AreaControl | undefined;
2
- export class AreaControl extends Control {
3
- createView({ parent, layoutFn }: {
4
- parent: any;
5
- layoutFn: any;
6
- }): HTMLDivElement;
7
- controlEl: HTMLButtonElement | undefined;
8
- disable(): void;
9
- enable(): void;
10
- }
11
- import { Control } from './Control';
1
+ import { type ControlCreator } from './types';
2
+ export declare const createAreaControl: ControlCreator;
@@ -1,11 +1,2 @@
1
- export function createButtonControl(control: any): ButtonControl | undefined;
2
- export class ButtonControl extends Control {
3
- createView({ parent, layoutFn }: {
4
- parent: any;
5
- layoutFn: any;
6
- }): HTMLDivElement;
7
- controlEl: HTMLButtonElement | undefined;
8
- disable(): void;
9
- enable(): void;
10
- }
11
- import { Control } from './Control';
1
+ import { type ControlCreator } from './types';
2
+ export declare const createButtonControl: ControlCreator;
@@ -1,13 +1,22 @@
1
- export class Control {
2
- constructor(control: any);
3
- control: any;
4
- createView(layoutFn: any): {
5
- controlContainerEl: HTMLDivElement;
6
- dependsOn: {
7
- height: string;
8
- width: string;
9
- };
10
- };
11
- setEvents(element: any, callback: any): void;
12
- getElement(): Element | null;
1
+ import { LatestControl } from '../../../movika.core/manifest';
2
+ import { ControlEventCallback, CreateViewParams, Dimensions, LayoutCallback } from './types';
3
+ type ControlContainer = {
4
+ element: HTMLElement;
5
+ dimensions: Dimensions;
6
+ };
7
+ export default abstract class Control {
8
+ control: LatestControl;
9
+ protected container: Nullable<ControlContainer>;
10
+ protected controlElement: Nullable<HTMLElement>;
11
+ private clickListener;
12
+ protected constructor(control: LatestControl);
13
+ abstract createView(params: CreateViewParams): void;
14
+ abstract getElement(): Nullable<HTMLElement>;
15
+ abstract disable(): void;
16
+ abstract enable(): void;
17
+ protected createContainerElement(layoutCallback: LayoutCallback): void;
18
+ private createClickListener;
19
+ setEvents(callback: ControlEventCallback): void;
20
+ removeListeners(): void;
13
21
  }
22
+ export {};
@@ -1,11 +1,2 @@
1
- export function createTextControl(control: any): TextControl | undefined;
2
- export class TextControl extends Control {
3
- createView({ parent, layoutFn }: {
4
- parent: any;
5
- layoutFn: any;
6
- }): HTMLDivElement;
7
- controlEl: HTMLDivElement | undefined;
8
- disable(): void;
9
- enable(): void;
10
- }
11
- import { Control } from './Control';
1
+ import { type ControlCreator } from './types';
2
+ export declare const createTextControl: ControlCreator;
@@ -1,3 +1,4 @@
1
- export * from "./AreaControl";
2
- export * from "./ButtonControl";
3
- export * from "./Control";
1
+ export * from './AreaControl.js';
2
+ export * from './ButtonControl.js';
3
+ export * from './Control';
4
+ export * from './types';
@@ -0,0 +1,25 @@
1
+ import { ControlEvent, ControlLayoutParams } from '../../../movika.core/manifest/manifest_3_3/control';
2
+ import { LatestControl } from '../../../movika.core/manifest';
3
+ import Control from '../../../modules/Interactives/controls/Control';
4
+ export declare enum CONTROLLER_IDS {
5
+ AREA = "int_area",
6
+ TEXT = "int_text",
7
+ BUTTON = "int_bttn"
8
+ }
9
+ export type Dimensions = {
10
+ width: string;
11
+ height: string;
12
+ };
13
+ export type LayoutCallback = (element: HTMLElement, controlLayoutParams: ControlLayoutParams) => void;
14
+ export type CreateViewParams = {
15
+ parentElement: HTMLElement;
16
+ layoutCallback: LayoutCallback;
17
+ };
18
+ type ControlEventCallbackParams = {
19
+ action: ControlEvent['action'];
20
+ controlId: string;
21
+ controlType: LatestControl['type'];
22
+ };
23
+ export type ControlEventCallback = (params: ControlEventCallbackParams) => void;
24
+ export type ControlCreator = (control: LatestControl) => Control | undefined;
25
+ export {};
@@ -1,14 +1,14 @@
1
1
  import { Container } from './containers/index';
2
2
  export { Interactives } from './Interactives';
3
3
  export { EVENT_NAMES, graphEventTypes, interactivesEventTypes } from './utils/events';
4
- export type { InteractiveRange, VideoInfo } from './types';
4
+ export type { VideoInfo, InteractiveProjectInfo } from './types';
5
5
  export { isLastChapter, hasEndTemplate } from './utils/gameUtils';
6
+ export type { InteractiveRange } from './utils/getInteractiveRanges';
6
7
  export declare const utils: {
7
8
  Container: typeof Container;
8
9
  createChoiceContainer: (container: any, rootElement: any) => import("./containers/ChoiceContainer").ChoiceContainer | undefined;
9
- createAreaControl: (control: any) => import("./controls/AreaControl").AreaControl | undefined;
10
- createButtonControl: (control: any) => import("./controls/ButtonControl").ButtonControl | undefined;
11
- createRelativeLayout: (layout: any) => import("./Layout").RelativeLayout | undefined;
10
+ createAreaControl: import("./controls").ControlCreator;
11
+ createButtonControl: import("./controls").ControlCreator;
12
12
  getRootEl: () => Element | null;
13
13
  classnamesPrefix: string;
14
14
  };
@@ -1,9 +1,45 @@
1
- export type InteractiveRange = {
2
- range: [number, number];
3
- subjects: string[];
4
- };
1
+ import type { InterfaceLanguage } from '@vkontakte/videoplayer-shared';
2
+ import type { IOptionalTuningConfig } from '@vkontakte/videoplayer-core';
3
+ import type { IOneStat } from '@vkontakte/videoplayer-statistics';
4
+ import type { Loaders } from '../../modules/ManifestController/Loadable';
5
+ import type { HistoryApi, HistorySettings } from '../../modules/Interactives/utils/HistoryController';
5
6
  export type VideoInfo = {
6
7
  id: string;
7
8
  cover: string;
8
9
  title?: string;
9
10
  };
11
+ export type InteractiveProjectInfo = {
12
+ videoId: string;
13
+ pid?: string;
14
+ title?: string;
15
+ variantPayloadType?: string;
16
+ };
17
+ export type RequiredOptions = 'parentElement' | 'fullscreenTargetElement';
18
+ export type IOptionalInteractiveOptions = Partial<Omit<IInteractiveOptions, RequiredOptions | 'config'>> & Required<Pick<IInteractiveOptions, RequiredOptions>> & {
19
+ config?: Partial<IInteractiveOptions['config']>;
20
+ };
21
+ export interface IInteractiveOptions {
22
+ parentElement: HTMLElement;
23
+ fullscreenTargetElement: HTMLElement;
24
+ lang: InterfaceLanguage | string;
25
+ config: {
26
+ historyMaxLength: number;
27
+ noInteractionEventTimeout: number;
28
+ };
29
+ graph: boolean;
30
+ lastFrame: boolean;
31
+ initSeamless: boolean;
32
+ permanentTextControls: boolean;
33
+ loaders: Partial<Loaders>;
34
+ initChapterId?: string;
35
+ projectInfo?: InteractiveProjectInfo;
36
+ historyApi?: HistoryApi;
37
+ historySettings?: HistorySettings;
38
+ coreConfig?: IOptionalTuningConfig;
39
+ vkVideoLoader?: (owner_id: string, video_id: string) => unknown;
40
+ createOneStat?: (video: any, configOverwrite?: any) => IOneStat | undefined;
41
+ /**
42
+ * @deprecated
43
+ * */
44
+ disableControlsOnPause?: boolean;
45
+ }
@@ -3,22 +3,22 @@ import type { IValueSubject } from '@vkontakte/videoplayer-shared';
3
3
  import { EventEmitter } from '../../../utils/EventEmitter';
4
4
  import type { VideoId } from '../../../movika.core/manifest';
5
5
  import type { Interactives } from '../../../modules/Interactives';
6
- interface HistoryApi {
7
- get: (videoId: string) => Promise<number[]>;
8
- save: (videoId: string, videoIds: Array<VideoId>) => Promise<void>;
6
+ export interface HistoryApi {
7
+ get: (rawId: string) => Promise<number[]>;
8
+ save: (rawId: string, videoIds: number[]) => Promise<void>;
9
9
  }
10
- interface HistorySettings {
10
+ export interface HistorySettings {
11
11
  maxLength: number;
12
12
  initChapterId?: string;
13
13
  }
14
14
  interface HistoryControllerParams {
15
- videoId: string;
16
15
  globalEventEmitter: EventEmitter;
17
16
  interactiveController: Interactives;
18
17
  settings: HistorySettings;
18
+ videoId?: string;
19
19
  historyApi?: Nullable<HistoryApi>;
20
20
  }
21
- interface HistoryControllerState {
21
+ export interface HistoryControllerState {
22
22
  history$: IValueSubject<string[]>;
23
23
  hasPrevChapter$: IValueSubject<boolean>;
24
24
  prevChapter$: IValueSubject<Nullable<string>>;
@@ -27,7 +27,7 @@ interface HistoryControllerState {
27
27
  }
28
28
  export default class HistoryController {
29
29
  #private;
30
- state: Nullable<HistoryControllerState>;
30
+ state: HistoryControllerState;
31
31
  constructor({ globalEventEmitter, videoId, interactiveController, historyApi, settings }: HistoryControllerParams);
32
32
  setManifest(manifest: any): Promise<void>;
33
33
  get inited(): boolean;
@@ -1,7 +1,7 @@
1
1
  import { type Container } from '../../../movika.core/manifest';
2
- export type ReduceAccItem = {
2
+ export type InteractiveRange = {
3
3
  subjects: string[];
4
4
  range: [number, number];
5
5
  };
6
- export type ReduceAcc = Array<ReduceAccItem>;
7
- export declare const getInteractiveRanges: (containers?: Container[]) => ReduceAcc;
6
+ export type InteractiveRanges = Array<InteractiveRange>;
7
+ export declare const getInteractiveRanges: (containers?: Container[]) => InteractiveRanges;
@@ -1,5 +1,5 @@
1
- export const classnamesPrefix: "SDK_NAME";
2
- export const rootElClassName: "SDK_NAME-controls-container";
1
+ export const classnamesPrefix: "interactive";
2
+ export const rootElClassName: "interactive-controls-container";
3
3
  export function getRootEl(): Element | null;
4
4
  export const DISABLE_OPACITY: 0.4;
5
5
  export namespace controlStylesFallbacks {
@@ -1,14 +1,11 @@
1
- declare const LoaderTypes: {
2
- readonly chapterLoaders: "chapterLoaders";
3
- readonly manifestLoaders: "manifestLoaders";
4
- };
5
- type LoaderTypes = (typeof LoaderTypes)[keyof typeof LoaderTypes];
1
+ type LoaderTypes = 'chapterLoaders' | 'manifestLoaders';
2
+ export type Loaders = Record<LoaderTypes, Function[]>;
6
3
  interface ILoadable {
7
4
  exec(type: LoaderTypes, inputArg: Record<string, any>): Promise<any>;
8
5
  }
9
6
  export declare class Loadable implements ILoadable {
10
- loaders: Record<LoaderTypes, any>;
11
- constructor(loaders: Record<LoaderTypes, any>);
7
+ loaders: Loaders;
8
+ constructor(loaders: Partial<Loaders>);
12
9
  exec(type: LoaderTypes, inputArg: Record<string, any>): Promise<any>;
13
10
  }
14
11
  export declare function addErrorMessage(errObj: Record<string, Array<string>> | null, loaderName: string, message: string): Record<string, Array<string>>;
@@ -2,6 +2,7 @@ import type { Chapter as Chapter_3_2, ChapterContainer as ChapterContainer_3_2,
2
2
  import type { Manifest_3_2, ManifestVideo as ManifestVideo_3_2, ManifestVideoVariant as ManifestVideoVariant_3_2, Media as Media_3_2, Metadata as Metadata_3_2 } from './manifest_3_2/manifest';
3
3
  import type { Chapter as Chapter_3_3, ChapterContainer as ChapterContainer_3_3, ChapterBranch as ChapterBranch_3_3 } from './manifest_3_3/chapter';
4
4
  import type { Manifest_3_3, ManifestVideo as ManifestVideo_3_3, ManifestVideoVariant as ManifestVideoVariant_3_3, Media as Media_3_3, Metadata as Metadata_3_3, ManifestVideoVariantType, Extensions, Standard } from './manifest_3_3/manifest';
5
+ import type { Control, ControlLayoutParams } from './manifest_3_3/control';
5
6
  export type Container = ChapterContainer_3_2 | ChapterContainer_3_3;
6
7
  export type Media = Media_3_2 | Media_3_3;
7
8
  export type Chapter = Chapter_3_2 | Chapter_3_3;
@@ -14,6 +15,9 @@ export type { ManifestVideoVariantType, Extensions, Standard };
14
15
  export type LatestMedia = Media_3_3;
15
16
  export type LatestChapter = Chapter_3_3;
16
17
  export type LatestManifest = Manifest_3_3;
18
+ export type LatestContainer = ChapterContainer_3_3;
19
+ export type LatestControl = Control;
20
+ export type LatestControlLayoutParams = ControlLayoutParams;
17
21
  export * from './migrations';
18
22
  export * from './types';
19
23
  export * from './utils';
@@ -1,12 +1,12 @@
1
1
  import { Binding } from './Binding';
2
2
  import { MultiMap } from './MultiMap';
3
3
  import type { HtmlEventType } from '../types';
4
- type OptionsType = undefined | boolean | AddEventListenerOptions;
4
+ type OptionsType = boolean | AddEventListenerOptions;
5
5
  export declare class EventManager {
6
6
  bindingMap: MultiMap<Binding> | null;
7
7
  release(): void;
8
- listen(target: Element, type: HtmlEventType, listener: EventListener, options: OptionsType): void;
9
- listenOnce(target: Element, type: HtmlEventType, listener: EventListener, options: OptionsType): void;
8
+ listen(target: Element, type: HtmlEventType, listener: EventListener, options?: OptionsType): void;
9
+ listenOnce(target: Element, type: HtmlEventType, listener: EventListener, options?: OptionsType): void;
10
10
  unlisten(target: Element, type: HtmlEventType, listener: EventListener): void;
11
11
  removeAll(): void;
12
12
  }
@@ -2,7 +2,7 @@ export declare class Raf {
2
2
  raf: number | undefined;
3
3
  fn: VoidFunction | undefined;
4
4
  fns: Array<VoidFunction>;
5
- constructor(fn: VoidFunction);
5
+ constructor(fn?: VoidFunction);
6
6
  addFn: (fn: VoidFunction, shouldRequest?: boolean) => void;
7
7
  removeFn: (fn: VoidFunction, shouldRequest?: boolean) => void;
8
8
  updateFn: () => void;
@@ -1,5 +0,0 @@
1
- export namespace CONTROLLER_IDS {
2
- let AREA: string;
3
- let TEXT: string;
4
- let BUTTON: string;
5
- }