UNPKG

@sports-alliance/sports-lib

Version:

A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc

132 lines (131 loc) 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Event = void 0; const duration_class_abstract_1 = require("../duration/duration.class.abstract"); const privacy_class_interface_1 = require("../privacy/privacy.class.interface"); const activity_types_1 = require("../activities/activity.types"); const data_activity_types_1 = require("../data/data.activity-types"); const data_device_names_1 = require("../data/data.device-names"); class Event extends duration_class_abstract_1.DurationClassAbstract { constructor(name, startDate, endDate, srcFileType, privacy, description, isMerge = false) { super(startDate, endDate); this.privacy = privacy_class_interface_1.Privacy.Private; this.activities = []; this.name = name; this.srcFileType = srcFileType; if (privacy) { this.privacy = privacy; } if (description) { this.description = description; } this.isMerge = isMerge; } addActivity(activity) { this.activities.push(activity); } addActivities(activities) { activities.forEach(activity => this.addActivity(activity)); } clearActivities() { this.activities = []; } removeActivity(activityToRemove) { this.activities = this.activities.filter(activity => activityToRemove.getID() !== activity.getID()); } getActivities() { this.sortActivities(); // PErhaps move on adding ? Lets check performance return this.activities; } getFirstActivity() { return this.getActivities().reduce((activityA, activityB) => { return activityA.startDate < activityB.startDate ? activityA : activityB; }); } getLastActivity() { return this.getActivities().reduce((activityA, activityB) => { return activityA.startDate < activityB.startDate ? activityB : activityA; }); } getActivityTypesAsArray() { const activityTypesStat = this.getStat(data_activity_types_1.DataActivityTypes.type); if (!activityTypesStat) { throw new Error(`Event with id ${this.getID()} has no activity types`); } return activityTypesStat.getValue(); } getActivityTypesAsString() { var _a, _b; const activityTypesStat = this.getStat(data_activity_types_1.DataActivityTypes.type); if (!activityTypesStat) { throw new Error(`Event with id ${this.getID()} has no activity types`); } const values = activityTypesStat.getValue(); return activityTypesStat.getValue().length > 1 ? `${this.getUniqueStringWithMultiplier(activityTypesStat .getValue() .map((activityType) => activity_types_1.ActivityTypes[activityType]))}` : activity_types_1.ActivityTypesHelper.resolveActivityType((_a = values[0]) !== null && _a !== void 0 ? _a : activityTypesStat.getDisplayValue()) || ((_b = values[0]) !== null && _b !== void 0 ? _b : activityTypesStat.getDisplayValue()); } getDeviceNamesAsString() { const deviceNamesStat = this.getStat(data_device_names_1.DataDeviceNames.type); if (!deviceNamesStat) { throw new Error(`Event with id ${this.getID()} has no device names`); } return `${this.getUniqueStringWithMultiplier(deviceNamesStat.getValue())}`; } sortActivities() { this.activities.sort((activityA, activityB) => { return +activityA.startDate - +activityB.startDate; }); } getUniqueStringWithMultiplier(arrayOfStrings) { const uniqueObject = arrayOfStrings.reduce((uniqueObj, type) => { if (!uniqueObj[type]) { uniqueObj[type] = 1; } else { uniqueObj[type] += 1; } return uniqueObj; }, {}); return Object.keys(uniqueObject) .reduce((uniqueArray, key) => { if (uniqueObject[key] === 1) { uniqueArray.push(key); } else { uniqueArray.push(uniqueObject[key] + 'x ' + key); } return uniqueArray; }, []) .join(', '); } isMultiSport() { return !this.isMerge && this.getActivities().length > 1; } toJSON() { const stats = {}; this.stats.forEach((value) => { Object.assign(stats, value.toJSON()); }); return { name: this.name, srcFileType: this.srcFileType, description: this.description || null, privacy: this.privacy, startDate: this.startDate.getTime(), endDate: this.endDate.getTime(), stats: stats, powerCurve: this.powerCurve ? this.powerCurve.toJSON() : null, isMerge: this.isMerge, activities: this.getActivities().reduce((activities, activity) => { const jsonActivity = activity.toJSON(); activities.push(jsonActivity); return activities; }, []) }; } } exports.Event = Event;