import { Pipe, PipeTransform } from '@angular/core'; import { OccupancyService } from './occupancy.service'; import { Dataset, Axis } from '@components/chart/chart.model'; import { NextStop } from '@features/realtime-data/realtime-data.model'; import { Observable } from 'rxjs'; import { StopOccupancy } from './occupancy.model'; const fakeResponse: StopOccupancy = { timeSlots: ['00:00', '06:45', '08:45', '11:30', '13:30', '15:30', '18:30', '21:00'], currentTimeSlot: 5, occupancy: { routeDirection: { 'SEM:C:1': [156, 2825, 1800, 1121, 1349, 2255, 944, 420] } } }; @Pipe({ name: 'occupancyDataset' }) export class OccupancyDatasetPipe implements PipeTransform { constructor(private occupancyService: OccupancyService) { } transform(obj: NextStop, axis?: { x?: Axis, y?: Axis, }): Observable { const routeDirection = `${obj.ligne.id}:${obj.pattern.dir}`; return new Observable(observer => { observer.next(this.toDataset(fakeResponse, 'SEM:C:1', axis, true)); this.occupancyService.getOccupancy(obj.stopId).subscribe(response => { const dataset = this.toDataset(response, routeDirection, axis, false); observer.next(dataset); observer.complete(); }); }); } private toDataset(data: StopOccupancy, routeDirection: string, axis?: { x?: Axis, y?: Axis, }, ghost = false): Dataset { let dataset: Dataset; if (data?.occupancy?.routeDirection && routeDirection in data.occupancy.routeDirection) { const points = data.timeSlots.map((time, index, list) => { return { x: time, y: data.occupancy.routeDirection[routeDirection][index] }; }); const isEmpty = points.every(p => p.y === 0); dataset = { points: [[]], axis, options: { padding: [4, 0, 8, 16], empty: isEmpty, ghost } }; if (!isEmpty) { dataset.points = [points]; } } else { dataset = { points: [[]], axis, options: { padding: [4, 0, 8, 16], unavailable: true, ghost } } } return dataset; } }