in src/component/direction/DirectionComponent.ts [130:225]
protected _activate(): void {
const subs = this._subscriptions;
subs.push(this._configuration$
.subscribe(
(configuration: DirectionConfiguration): void => {
this._renderer.setConfiguration(configuration);
}));
subs.push(this._container.renderService.size$
.subscribe(
(size: ViewportSize): void => {
this._renderer.resize(size);
}));
subs.push(this._navigator.stateService.currentImage$.pipe(
tap(
(image: Image): void => {
this._container.domRenderer.render$.next({ name: this._name, vNode: vd.h("div", {}, []) });
this._renderer.setImage(image);
}),
withLatestFrom(this._configuration$),
switchMap(
([image, configuration]: [Image, DirectionConfiguration]): Observable<[NavigationEdgeStatus, Sequence]> => {
return observableCombineLatest(
image.spatialEdges$,
configuration.distinguishSequence ?
this._navigator.graphService
.cacheSequence$(image.sequenceId).pipe(
catchError(
(error: Error): Observable<Sequence> => {
console.error(`Failed to cache sequence (${image.sequenceId})`, error);
return observableOf<Sequence>(null);
})) :
observableOf<Sequence>(null));
}))
.subscribe(
([edgeStatus, sequence]: [NavigationEdgeStatus, Sequence]): void => {
this._renderer.setEdges(edgeStatus, sequence);
}));
subs.push(this._container.renderService.renderCameraFrame$.pipe(
tap(
(renderCamera: RenderCamera): void => {
this._renderer.setRenderCamera(renderCamera);
}),
map(
(): DirectionDOMRenderer => {
return this._renderer;
}),
filter(
(renderer: DirectionDOMRenderer): boolean => {
return renderer.needsRender;
}),
map(
(renderer: DirectionDOMRenderer): VirtualNodeHash => {
return { name: this._name, vNode: renderer.render(this._navigator) };
}))
.subscribe(this._container.domRenderer.render$));
subs.push(observableCombineLatest(
this._container.domRenderer.element$,
this._container.renderService.renderCamera$,
this._container.mouseService.mouseMove$.pipe(startWith(null)),
this._container.mouseService.mouseUp$.pipe(startWith(null))).pipe(
map(
([element]: [Element, RenderCamera, MouseEvent, MouseEvent]): string => {
let elements: HTMLCollectionOf<Element> =
<HTMLCollectionOf<Element>>element.getElementsByClassName("mapillary-direction-perspective");
for (let i: number = 0; i < elements.length; i++) {
let hovered: Element = elements.item(i).querySelector(":hover");
if (hovered != null && hovered.hasAttribute("data-id")) {
return hovered.getAttribute("data-id");
}
}
return null;
}),
distinctUntilChanged())
.subscribe(this._hoveredIdSubject$));
subs.push(this._hoveredId$
.subscribe(
(id: string): void => {
const type: ComponentEventType = "hover";
const event: ComponentHoverEvent = {
id,
target: this,
type,
};
this.fire(type, event);
}));
}