mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
129 lines (103 loc) • 3.62 kB
text/typescript
import {refCount, publishReplay, scan, startWith} from "rxjs/operators";
import {BehaviorSubject, Observable, Subject} from "rxjs";
import {IComponentConfiguration} from "../Component";
import {
Container,
Navigator,
} from "../Viewer";
import {EventEmitter} from "../Utils";
export abstract class Component<TConfiguration extends IComponentConfiguration> extends EventEmitter {
public static componentName: string = "not_worthy";
protected _activated: boolean;
protected _container: Container;
protected _name: string;
protected _navigator: Navigator;
protected _activated$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
protected _configuration$: Observable<TConfiguration>;
protected _configurationSubject$: Subject<TConfiguration> = new Subject<TConfiguration>();
constructor (name: string, container: Container, navigator: Navigator) {
super();
this._activated = false;
this._container = container;
this._name = name;
this._navigator = navigator;
this._configuration$ =
this._configurationSubject$.pipe(
startWith(this.defaultConfiguration),
scan(
(conf: TConfiguration, newConf: TConfiguration): TConfiguration => {
for (let key in newConf) {
if (newConf.hasOwnProperty(key)) {
conf[key] = <any>newConf[key];
}
}
return conf;
}),
publishReplay(1),
refCount());
this._configuration$.subscribe(() => { /*noop*/ });
}
public get activated(): boolean {
return this._activated;
}
/** @ignore */
public get activated$(): Observable<boolean> {
return this._activated$;
}
/**
* Get default configuration.
*
* @returns {TConfiguration} Default configuration for component.
*/
public get defaultConfiguration(): TConfiguration {
return this._getDefaultConfiguration();
}
/** @ignore */
public get configuration$(): Observable<TConfiguration> {
return this._configuration$;
}
/**
* Get name.
*
* @description The name of the component. Used when interacting with the
* component through the Viewer's API.
*/
public get name(): string {
return this._name;
}
public activate(conf?: TConfiguration): void {
if (this._activated) {
return;
}
if (conf !== undefined) {
this._configurationSubject$.next(conf);
}
this._activated = true;
this._activate();
this._activated$.next(true);
}
public configure(conf: TConfiguration): void {
this._configurationSubject$.next(conf);
}
public deactivate(): void {
if (!this._activated) {
return;
}
this._activated = false;
this._deactivate();
this._container.domRenderer.clear(this._name);
this._container.glRenderer.clear(this._name);
this._activated$.next(false);
}
/**
* Detect the viewer's new width and height and resize the component's
* rendered elements accordingly if applicable.
*
* @ignore
*/
public resize(): void { return; }
protected abstract _activate(): void;
protected abstract _deactivate(): void;
protected abstract _getDefaultConfiguration(): TConfiguration;
}
export default Component;