donmahallem/TrapezeClientNg

View on GitHub
src/app/modules/stop/departure-list-item.component.ts

Summary

Maintainability
A
45 mins
Test Coverage
import {
    Component,
    Input,
} from '@angular/core';
import { IDeparture } from '@donmahallem/trapeze-api-types';
import { VEHICLE_STATUS } from '@donmahallem/trapeze-api-types/dist/vehicle-status';
import * as moment from 'moment';
@Component({
    selector: 'app-departure-list-item',
    styleUrls: ['./departure-list-item.component.scss'],
    templateUrl: './departure-list-item.component.pug',
})
export class DepartureListItemComponent {

    /**
     * Object holding the current departure
     * Can be undefined
     */
    private mDeparture: IDeparture = undefined;
    /**
     * The delay of the departure. Can be positive or negative excluding zero
     * or false if no delay is to be expected
     */
    private mDelay: boolean | number = false;
    /**
     * The time of arrival
     */
    private mTime = '';

    /**
     * Sets the departure
     * @param deps The departures
     */
    @Input('departure')
    public set departure(deps: IDeparture) {
        this.mDeparture = deps;
        this.mDelay = this.calculateDelay(deps);
        this.mTime = this.convertTime(deps);
    }

    /**
     * gets the departure
     * @returns the departure or undefined
     */
    public get departure(): IDeparture {
        return this.mDeparture;
    }

    public get time(): string {
        return this.mTime;
    }

    public get statusIcon(): string {
        switch (this.mDeparture.status) {
            case VEHICLE_STATUS.PREDICTED:
                return 'directions_bus';
            case VEHICLE_STATUS.DEPARTED:
                return 'directions_bus';
            case VEHICLE_STATUS.STOPPING:
                return 'departure_board';
            case VEHICLE_STATUS.PLANNED:
            default:
                return 'query_builder';
        }
    }

    /**
     * Returns the DepartureStatus
     * @returns vehicle status {@VEHICLE_STATUS}
     */
    public get status(): VEHICLE_STATUS {
        return this.mDeparture.status;
    }

    public convertTime(data: IDeparture) {
        const time: number = data.actualRelativeTime;
        if (time > 300) {
            return data.actualTime;
        } else {
            return Math.ceil(time / 60) + 'min';
        }
    }

    /**
     * Returns the delay
     * @returns false or an integer except 0
     */
    public get delay(): boolean | number {
        return this.mDelay;
    }

    /**
     * Calculates the delay
     * @param data a number except 0 or false
     */
    public calculateDelay(data: IDeparture): false | number {
        if (data && data.actualTime && data.plannedTime) {
            if (data.actualTime !== data.plannedTime) {
                const actual: moment.Moment = moment(data.actualTime, 'HH:mm');
                const planned: moment.Moment = moment(data.plannedTime, 'HH:mm');
                let diffMinutes: number = moment.duration(actual.diff(planned)).asMinutes();
                if (diffMinutes > 60 * 12) {
                    diffMinutes -= 60 * 24;
                } else if (diffMinutes < - 60 * 12) {
                    diffMinutes += 60 * 24;
                }
                return diffMinutes;
            }
        }
        return false;
    }

}