mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
132 lines (102 loc) • 4.16 kB
text/typescript
import {ArgumentMapillaryError} from "../Error";
import {Container, Navigator} from "../Viewer";
import {CoverComponent, Component, IComponentConfiguration} from "../Component";
interface IActiveComponent {
active: boolean;
component: Component<IComponentConfiguration>;
}
export class ComponentService {
public static registeredCoverComponent: typeof CoverComponent;
public static registeredComponents: {[key: string]: { new (...args: any[]): Component<IComponentConfiguration>; }} = {};
private _coverActivated: boolean;
private _coverComponent: CoverComponent;
private _components: {[key: string]: IActiveComponent} = {};
constructor (container: Container, navigator: Navigator) {
for (const componentName in ComponentService.registeredComponents) {
if (!ComponentService.registeredComponents.hasOwnProperty(componentName)) {
continue;
}
const component: new (...args: any[]) => Component<IComponentConfiguration> =
ComponentService.registeredComponents[componentName];
this._components[componentName] = {
active: false,
component: new component(componentName, container, navigator),
};
}
this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
this._coverComponent.activate();
this._coverActivated = true;
}
public static register<T extends Component<IComponentConfiguration>>(
component: { componentName: string, new (...args: any[]): T; }): void {
if (ComponentService.registeredComponents[component.componentName] === undefined) {
ComponentService.registeredComponents[component.componentName] = component;
}
}
public static registerCover(coverComponent: typeof CoverComponent): void {
ComponentService.registeredCoverComponent = coverComponent;
}
public get coverActivated(): boolean {
return this._coverActivated;
}
public activateCover(): void {
if (this._coverActivated) {
return;
}
this._coverActivated = true;
for (const componentName in this._components) {
if (!this._components.hasOwnProperty(componentName)) {
continue;
}
const component: IActiveComponent = this._components[componentName];
if (component.active) {
component.component.deactivate();
}
}
}
public deactivateCover(): void {
if (!this._coverActivated) {
return;
}
this._coverActivated = false;
for (const componentName in this._components) {
if (!this._components.hasOwnProperty(componentName)) {
continue;
}
const component: IActiveComponent = this._components[componentName];
if (component.active) {
component.component.activate();
}
}
}
public activate(name: string): void {
this._checkName(name);
this._components[name].active = true;
if (!this._coverActivated) {
this.get(name).activate();
}
}
public configure<TConfiguration extends IComponentConfiguration>(name: string, conf: TConfiguration): void {
this._checkName(name);
this.get(name).configure(conf);
}
public deactivate(name: string): void {
this._checkName(name);
this._components[name].active = false;
if (!this._coverActivated) {
this.get(name).deactivate();
}
}
public get<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {
return <TComponent>this._components[name].component;
}
public getCover(): CoverComponent {
return this._coverComponent;
}
private _checkName(name: string): void {
if (!(name in this._components)) {
throw new ArgumentMapillaryError(`Component does not exist: ${name}`);
}
}
}
export default ComponentService;