diff --git a/website/src/lib/components/WithUnits.svelte b/website/src/lib/components/WithUnits.svelte index 73171b13..b68ba3cf 100644 --- a/website/src/lib/components/WithUnits.svelte +++ b/website/src/lib/components/WithUnits.svelte @@ -23,18 +23,18 @@ {#if type === 'distance'} - { getConvertedDistance(value, $distanceUnits).toFixed(decimals ?? 2) } - { showUnits ? getDistanceUnits($distanceUnits) : '' } + {getConvertedDistance(value, $distanceUnits).toFixed(decimals ?? 2)} + {showUnits ? getDistanceUnits($distanceUnits) : ''} {:else if type === 'elevation'} - { getConvertedElevation(value, $distanceUnits).toFixed(decimals ?? 2) } - { showUnits ? getElevationUnits($distanceUnits) : '' } + {getConvertedElevation(value, $distanceUnits).toFixed(decimals ?? 2)} + {showUnits ? getElevationUnits($distanceUnits) : ''} {:else if type === 'speed'} {#if $velocityUnits === 'speed'} - { getConvertedVelocity(value, $velocityUnits, $distanceUnits).toFixed(decimals ?? 2) } - { showUnits ? getVelocityUnits($velocityUnits, $distanceUnits) : '' } + {getConvertedVelocity(value, $velocityUnits, $distanceUnits).toFixed(decimals ?? 2)} + {showUnits ? getVelocityUnits($velocityUnits, $distanceUnits) : ''} {:else} - { secondsToHHMMSS(getConvertedVelocity(value, $velocityUnits, $distanceUnits)) } - { showUnits ? getVelocityUnits($velocityUnits, $distanceUnits) : '' } + {secondsToHHMMSS(getConvertedVelocity(value, $velocityUnits, $distanceUnits))} + {showUnits ? getVelocityUnits($velocityUnits, $distanceUnits) : ''} {/if} {:else if type === 'temperature'} {#if $temperatureUnits === 'celsius'} @@ -43,6 +43,6 @@ {celsiusToFahrenheit(value)} {showUnits ? $_('units.fahrenheit') : ''} {/if} {:else if type === 'time'} - { secondsToHHMMSS(value) } + {secondsToHHMMSS(value)} {/if} diff --git a/website/src/lib/components/embedding/Embedding.ts b/website/src/lib/components/embedding/Embedding.ts index 1f7be1ff..6681550e 100644 --- a/website/src/lib/components/embedding/Embedding.ts +++ b/website/src/lib/components/embedding/Embedding.ts @@ -1,129 +1,141 @@ -import { PUBLIC_MAPBOX_TOKEN } from "$env/static/public"; -import { basemaps } from "$lib/assets/layers"; +import { PUBLIC_MAPBOX_TOKEN } from '$env/static/public'; +import { basemaps } from '$lib/assets/layers'; export type EmbeddingOptions = { - token: string; - files: string[]; - basemap: string; - elevation: { - show: boolean; - height: number, - controls: boolean, - fill: 'slope' | 'surface' | undefined, - speed: boolean, - hr: boolean, - cad: boolean, - temp: boolean, - power: boolean, - }, - distanceMarkers: boolean, - directionMarkers: boolean, - distanceUnits: 'metric' | 'imperial' | 'nautical', - velocityUnits: 'speed' | 'pace', - temperatureUnits: 'celsius' | 'fahrenheit', - theme: 'system' | 'light' | 'dark', + token: string; + files: string[]; + basemap: string; + elevation: { + show: boolean; + height: number; + controls: boolean; + fill: 'slope' | 'surface' | undefined; + speed: boolean; + hr: boolean; + cad: boolean; + temp: boolean; + power: boolean; + }; + distanceMarkers: boolean; + directionMarkers: boolean; + distanceUnits: 'metric' | 'imperial' | 'nautical'; + velocityUnits: 'speed' | 'pace'; + temperatureUnits: 'celsius' | 'fahrenheit'; + theme: 'system' | 'light' | 'dark'; }; export const defaultEmbeddingOptions = { - token: '', - files: [], - basemap: 'mapboxOutdoors', - elevation: { - show: true, - height: 170, - controls: true, - fill: undefined, - speed: false, - hr: false, - cad: false, - temp: false, - power: false, - }, - distanceMarkers: false, - directionMarkers: false, - distanceUnits: 'metric', - velocityUnits: 'speed', - temperatureUnits: 'celsius', - theme: 'system', + token: '', + files: [], + basemap: 'mapboxOutdoors', + elevation: { + show: true, + height: 170, + controls: true, + fill: undefined, + speed: false, + hr: false, + cad: false, + temp: false, + power: false + }, + distanceMarkers: false, + directionMarkers: false, + distanceUnits: 'metric', + velocityUnits: 'speed', + temperatureUnits: 'celsius', + theme: 'system' }; export function getDefaultEmbeddingOptions(): EmbeddingOptions { - return JSON.parse(JSON.stringify(defaultEmbeddingOptions)); + return JSON.parse(JSON.stringify(defaultEmbeddingOptions)); } -export function getMergedEmbeddingOptions(options: any, defaultOptions: any = defaultEmbeddingOptions): EmbeddingOptions { - const mergedOptions = JSON.parse(JSON.stringify(defaultOptions)); - for (const key in options) { - if (typeof options[key] === 'object' && options[key] !== null && !Array.isArray(options[key])) { - mergedOptions[key] = getMergedEmbeddingOptions(options[key], defaultOptions[key]); - } else { - mergedOptions[key] = options[key]; - } - } - return mergedOptions; +export function getMergedEmbeddingOptions( + options: any, + defaultOptions: any = defaultEmbeddingOptions +): EmbeddingOptions { + const mergedOptions = JSON.parse(JSON.stringify(defaultOptions)); + for (const key in options) { + if (typeof options[key] === 'object' && options[key] !== null && !Array.isArray(options[key])) { + mergedOptions[key] = getMergedEmbeddingOptions(options[key], defaultOptions[key]); + } else { + mergedOptions[key] = options[key]; + } + } + return mergedOptions; } -export function getCleanedEmbeddingOptions(options: any, defaultOptions: any = defaultEmbeddingOptions): any { - const cleanedOptions = JSON.parse(JSON.stringify(options)); - for (const key in cleanedOptions) { - if (typeof cleanedOptions[key] === 'object' && cleanedOptions[key] !== null && !Array.isArray(cleanedOptions[key])) { - cleanedOptions[key] = getCleanedEmbeddingOptions(cleanedOptions[key], defaultOptions[key]); - if (Object.keys(cleanedOptions[key]).length === 0) { - delete cleanedOptions[key]; - } - } else if (JSON.stringify(cleanedOptions[key]) === JSON.stringify(defaultOptions[key])) { - delete cleanedOptions[key]; - } - } - return cleanedOptions; +export function getCleanedEmbeddingOptions( + options: any, + defaultOptions: any = defaultEmbeddingOptions +): any { + const cleanedOptions = JSON.parse(JSON.stringify(options)); + for (const key in cleanedOptions) { + if ( + typeof cleanedOptions[key] === 'object' && + cleanedOptions[key] !== null && + !Array.isArray(cleanedOptions[key]) + ) { + cleanedOptions[key] = getCleanedEmbeddingOptions(cleanedOptions[key], defaultOptions[key]); + if (Object.keys(cleanedOptions[key]).length === 0) { + delete cleanedOptions[key]; + } + } else if (JSON.stringify(cleanedOptions[key]) === JSON.stringify(defaultOptions[key])) { + delete cleanedOptions[key]; + } + } + return cleanedOptions; } -export const allowedEmbeddingBasemaps = Object.keys(basemaps).filter(basemap => !['ordnanceSurvey'].includes(basemap)); +export const allowedEmbeddingBasemaps = Object.keys(basemaps).filter( + (basemap) => !['ordnanceSurvey'].includes(basemap) +); export function getURLForGoogleDriveFile(fileId: string): string { - return `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&key=AIzaSyA2ZadQob_hXiT2VaYIkAyafPvz_4ZMssk`; + return `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&key=AIzaSyA2ZadQob_hXiT2VaYIkAyafPvz_4ZMssk`; } export function convertOldEmbeddingOptions(options: URLSearchParams): any { - let newOptions: any = { - token: PUBLIC_MAPBOX_TOKEN, - files: [], - }; - if (options.has('state')) { - let state = JSON.parse(options.get('state')!); - if (state.ids) { - newOptions.files.push(...state.ids.map(getURLForGoogleDriveFile)); - } - if (state.urls) { - newOptions.files.push(...state.urls); - } - } - if (options.has('source')) { - let basemap = options.get('source')!; - if (basemap === 'satellite') { - newOptions.basemap = 'mapboxSatellite'; - } else if (basemap === 'otm') { - newOptions.basemap = 'openTopoMap'; - } else if (basemap === 'ohm') { - newOptions.basemap = 'openHikingMap'; - } - } - if (options.has('imperial')) { - newOptions.distanceUnits = 'imperial'; - } - if (options.has('running')) { - newOptions.velocityUnits = 'pace'; - } - if (options.has('distance')) { - newOptions.distanceMarkers = true; - } - if (options.has('direction')) { - newOptions.directionMarkers = true; - } - if (options.has('slope')) { - newOptions.elevation = { - fill: 'slope', - }; - } - return newOptions; -} \ No newline at end of file + let newOptions: any = { + token: PUBLIC_MAPBOX_TOKEN, + files: [] + }; + if (options.has('state')) { + let state = JSON.parse(options.get('state')!); + if (state.ids) { + newOptions.files.push(...state.ids.map(getURLForGoogleDriveFile)); + } + if (state.urls) { + newOptions.files.push(...state.urls); + } + } + if (options.has('source')) { + let basemap = options.get('source')!; + if (basemap === 'satellite') { + newOptions.basemap = 'mapboxSatellite'; + } else if (basemap === 'otm') { + newOptions.basemap = 'openTopoMap'; + } else if (basemap === 'ohm') { + newOptions.basemap = 'openHikingMap'; + } + } + if (options.has('imperial')) { + newOptions.distanceUnits = 'imperial'; + } + if (options.has('running')) { + newOptions.velocityUnits = 'pace'; + } + if (options.has('distance')) { + newOptions.distanceMarkers = true; + } + if (options.has('direction')) { + newOptions.directionMarkers = true; + } + if (options.has('slope')) { + newOptions.elevation = { + fill: 'slope' + }; + } + return newOptions; +} diff --git a/website/src/lib/units.ts b/website/src/lib/units.ts index 90fbdf7d..a3c8012c 100644 --- a/website/src/lib/units.ts +++ b/website/src/lib/units.ts @@ -5,192 +5,199 @@ import { _ } from 'svelte-i18n'; const { distanceUnits, velocityUnits, temperatureUnits } = settings; export function kilometersToMiles(value: number) { - return value * 0.621371; + return value * 0.621371; } export function milesToKilometers(value: number) { - return value * 1.60934; + return value * 1.60934; } export function metersToFeet(value: number) { - return value * 3.28084; + return value * 3.28084; } export function kilometersToNauticalMiles(value: number) { - return value * 0.539957; + return value * 0.539957; } export function nauticalMilesToKilometers(value: number) { - return value * 1.852; + return value * 1.852; } export function celsiusToFahrenheit(value: number) { - return value * 1.8 + 32; + return value * 1.8 + 32; } export function distancePerHourToSecondsPerDistance(value: number) { - if (value === 0) { - return 0; - } - return 3600 / value; + if (value === 0) { + return 0; + } + return 3600 / value; } export function secondsToHHMMSS(value: number) { - var hours = Math.floor(value / 3600); - var minutes = Math.floor(value / 60) % 60; - var seconds = Math.min(59, Math.round(value % 60)); + var hours = Math.floor(value / 3600); + var minutes = Math.floor(value / 60) % 60; + var seconds = Math.min(59, Math.round(value % 60)); - return [hours, minutes, seconds] - .map((v) => (v < 10 ? '0' + v : v)) - .filter((v, i) => v !== '00' || i > 0) - .join(':'); + return [hours, minutes, seconds] + .map((v) => (v < 10 ? '0' + v : v)) + .filter((v, i) => v !== '00' || i > 0) + .join(':'); } // Get a string representation of the value with units export function getDistanceWithUnits(value: number, convert: boolean = true) { - if (convert) { - return getConvertedDistance(value).toFixed(2) + ' ' + getDistanceUnits(); - } else { - return value.toFixed(2) + ' ' + getDistanceUnits(); - } + if (convert) { + return getConvertedDistance(value).toFixed(2) + ' ' + getDistanceUnits(); + } else { + return value.toFixed(2) + ' ' + getDistanceUnits(); + } } export function getVelocityWithUnits(value: number, convert: boolean = true) { - if (get(velocityUnits) === 'speed') { - if (convert) { - return getConvertedVelocity(value).toFixed(2) + ' ' + getVelocityUnits(); - } else { - return value.toFixed(2) + ' ' + getVelocityUnits(); - } - } else { - if (convert) { - return secondsToHHMMSS(getConvertedVelocity(value)) + ' ' + getVelocityUnits(); - } else { - return secondsToHHMMSS(value) + ' ' + getVelocityUnits(); - } - } + if (get(velocityUnits) === 'speed') { + if (convert) { + return getConvertedVelocity(value).toFixed(2) + ' ' + getVelocityUnits(); + } else { + return value.toFixed(2) + ' ' + getVelocityUnits(); + } + } else { + if (convert) { + return secondsToHHMMSS(getConvertedVelocity(value)) + ' ' + getVelocityUnits(); + } else { + return secondsToHHMMSS(value) + ' ' + getVelocityUnits(); + } + } } export function getElevationWithUnits(value: number, convert: boolean = true) { - if (convert) { - return getConvertedElevation(value).toFixed(0) + ' ' + getElevationUnits(); - } else { - return value.toFixed(0) + ' ' + getElevationUnits(); - } + if (convert) { + return getConvertedElevation(value).toFixed(0) + ' ' + getElevationUnits(); + } else { + return value.toFixed(0) + ' ' + getElevationUnits(); + } } export function getHeartRateWithUnits(value: number) { - return value.toFixed(0) + ' ' + getHeartRateUnits(); + return value.toFixed(0) + ' ' + getHeartRateUnits(); } export function getCadenceWithUnits(value: number) { - return value.toFixed(0) + ' ' + getCadenceUnits(); + return value.toFixed(0) + ' ' + getCadenceUnits(); } export function getPowerWithUnits(value: number) { - return value.toFixed(0) + ' ' + getPowerUnits(); + return value.toFixed(0) + ' ' + getPowerUnits(); } export function getTemperatureWithUnits(value: number, convert: boolean = true) { - if (convert) { - return getConvertedTemperature(value).toFixed(0) + ' ' + getTemperatureUnits(); - } else { - return value.toFixed(0) + ' ' + getTemperatureUnits(); - } + if (convert) { + return getConvertedTemperature(value).toFixed(0) + ' ' + getTemperatureUnits(); + } else { + return value.toFixed(0) + ' ' + getTemperatureUnits(); + } } // Get the units export function getDistanceUnits(targetDistanceUnits = get(distanceUnits)) { - switch (targetDistanceUnits) { - case 'metric': - return get(_)('units.kilometers'); - case 'imperial': - return get(_)('units.miles'); - case 'nautical': - return get(_)('units.nautical_miles'); - } + switch (targetDistanceUnits) { + case 'metric': + return get(_)('units.kilometers'); + case 'imperial': + return get(_)('units.miles'); + case 'nautical': + return get(_)('units.nautical_miles'); + } } -export function getVelocityUnits(targetVelocityUnits = get(velocityUnits), targetDistanceUnits = get(distanceUnits)) { - if (targetVelocityUnits === 'speed') { - switch (targetDistanceUnits) { - case 'metric': - return get(_)('units.kilometers_per_hour'); - case 'imperial': - return get(_)('units.miles_per_hour'); - case 'nautical': - return get(_)('units.knots'); - } - } else { - switch (targetDistanceUnits) { - case 'metric': - return get(_)('units.minutes_per_kilometer'); - case 'imperial': - return get(_)('units.minutes_per_mile'); - case 'nautical': - return get(_)('units.minutes_per_nautical_mile'); - } - } +export function getVelocityUnits( + targetVelocityUnits = get(velocityUnits), + targetDistanceUnits = get(distanceUnits) +) { + if (targetVelocityUnits === 'speed') { + switch (targetDistanceUnits) { + case 'metric': + return get(_)('units.kilometers_per_hour'); + case 'imperial': + return get(_)('units.miles_per_hour'); + case 'nautical': + return get(_)('units.knots'); + } + } else { + switch (targetDistanceUnits) { + case 'metric': + return get(_)('units.minutes_per_kilometer'); + case 'imperial': + return get(_)('units.minutes_per_mile'); + case 'nautical': + return get(_)('units.minutes_per_nautical_mile'); + } + } } export function getElevationUnits(targetDistanceUnits = get(distanceUnits)) { - return targetDistanceUnits === 'metric' ? get(_)('units.meters') : get(_)('units.feet'); + return targetDistanceUnits === 'metric' ? get(_)('units.meters') : get(_)('units.feet'); } export function getHeartRateUnits() { - return get(_)('units.heartrate'); + return get(_)('units.heartrate'); } export function getCadenceUnits() { - return get(_)('units.cadence'); + return get(_)('units.cadence'); } export function getPowerUnits() { - return get(_)('units.power'); + return get(_)('units.power'); } export function getTemperatureUnits() { - return get(temperatureUnits) === 'celsius' ? get(_)('units.celsius') : get(_)('units.fahrenheit'); + return get(temperatureUnits) === 'celsius' ? get(_)('units.celsius') : get(_)('units.fahrenheit'); } // Convert only the value export function getConvertedDistance(value: number, targetDistanceUnits = get(distanceUnits)) { - switch (targetDistanceUnits) { - case 'metric': - return value; - case 'imperial': - return kilometersToMiles(value); - case 'nautical': - return kilometersToNauticalMiles(value); - } + switch (targetDistanceUnits) { + case 'metric': + return value; + case 'imperial': + return kilometersToMiles(value); + case 'nautical': + return kilometersToNauticalMiles(value); + } } export function getConvertedElevation(value: number, targetDistanceUnits = get(distanceUnits)) { - return targetDistanceUnits === 'metric' ? value : metersToFeet(value); + return targetDistanceUnits === 'metric' ? value : metersToFeet(value); } -export function getConvertedVelocity(value: number, targetVelocityUnits = get(velocityUnits), targetDistanceUnits = get(distanceUnits)) { - if (targetVelocityUnits === 'speed') { - switch (targetDistanceUnits) { - case 'metric': - return value; - case 'imperial': - return kilometersToMiles(value); - case 'nautical': - return kilometersToNauticalMiles(value); - } - } else { - switch (targetDistanceUnits) { - case 'metric': - return distancePerHourToSecondsPerDistance(value); - case 'imperial': - return distancePerHourToSecondsPerDistance(kilometersToMiles(value)); - case 'nautical': - return distancePerHourToSecondsPerDistance(kilometersToNauticalMiles(value)); - } - } +export function getConvertedVelocity( + value: number, + targetVelocityUnits = get(velocityUnits), + targetDistanceUnits = get(distanceUnits) +) { + if (targetVelocityUnits === 'speed') { + switch (targetDistanceUnits) { + case 'metric': + return value; + case 'imperial': + return kilometersToMiles(value); + case 'nautical': + return kilometersToNauticalMiles(value); + } + } else { + switch (targetDistanceUnits) { + case 'metric': + return distancePerHourToSecondsPerDistance(value); + case 'imperial': + return distancePerHourToSecondsPerDistance(kilometersToMiles(value)); + case 'nautical': + return distancePerHourToSecondsPerDistance(kilometersToNauticalMiles(value)); + } + } } export function getConvertedTemperature(value: number) { - return get(temperatureUnits) === 'celsius' ? value : celsiusToFahrenheit(value); + return get(temperatureUnits) === 'celsius' ? value : celsiusToFahrenheit(value); }