Files
gpx.studio/website/src/lib/components/embedding/Embedding.ts

156 lines
4.5 KiB
TypeScript
Raw Normal View History

import { PUBLIC_MAPBOX_TOKEN } from '$env/static/public';
import { basemaps } from '$lib/assets/layers';
2024-07-12 18:08:27 +02:00
2024-07-12 15:00:33 +02:00
export type EmbeddingOptions = {
2024-09-06 13:53:14 +02:00
token: string;
files: string[];
ids: string[];
basemap: string;
elevation: {
show: boolean;
height: number;
controls: boolean;
fill: 'slope' | 'surface' | 'highway' | undefined;
2024-09-06 13:53:14 +02:00
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';
2024-07-12 15:00:33 +02:00
};
export const defaultEmbeddingOptions = {
2024-09-06 13:53:14 +02:00
token: '',
files: [],
ids: [],
basemap: 'mapboxOutdoors',
elevation: {
show: true,
height: 170,
controls: true,
fill: undefined,
speed: false,
hr: false,
cad: false,
temp: false,
power: false,
2024-09-06 13:53:14 +02:00
},
distanceMarkers: false,
directionMarkers: false,
distanceUnits: 'metric',
velocityUnits: 'speed',
temperatureUnits: 'celsius',
theme: 'system',
2024-07-12 15:00:33 +02:00
};
export function getDefaultEmbeddingOptions(): EmbeddingOptions {
2024-09-06 13:53:14 +02:00
return JSON.parse(JSON.stringify(defaultEmbeddingOptions));
2024-07-12 15:00:33 +02:00
}
export function getMergedEmbeddingOptions(
2024-09-06 13:53:14 +02:00
options: any,
defaultOptions: any = defaultEmbeddingOptions
): EmbeddingOptions {
2024-09-06 13:53:14 +02:00
const mergedOptions = JSON.parse(JSON.stringify(defaultOptions));
for (const key in options) {
if (
typeof options[key] === 'object' &&
options[key] !== null &&
!Array.isArray(options[key])
) {
2024-09-06 13:53:14 +02:00
mergedOptions[key] = getMergedEmbeddingOptions(options[key], defaultOptions[key]);
} else {
mergedOptions[key] = options[key];
}
}
return mergedOptions;
}
export function getCleanedEmbeddingOptions(
2024-09-06 13:53:14 +02:00
options: any,
defaultOptions: any = defaultEmbeddingOptions
): any {
2024-09-06 13:53:14 +02:00
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]
);
2024-09-06 13:53:14 +02:00
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;
2024-07-12 15:00:33 +02:00
}
export const allowedEmbeddingBasemaps = Object.keys(basemaps).filter(
2024-09-06 13:53:14 +02:00
(basemap) => !['ordnanceSurvey'].includes(basemap)
);
2024-09-06 13:53:14 +02:00
export function getFilesFromEmbeddingOptions(options: EmbeddingOptions): string[] {
return options.files.concat(options.ids.map((id) => getURLForGoogleDriveFile(id)));
}
export function getURLForGoogleDriveFile(fileId: string): string {
2024-09-06 13:53:14 +02:00
return `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&key=AIzaSyA2ZadQob_hXiT2VaYIkAyafPvz_4ZMssk`;
}
export function convertOldEmbeddingOptions(options: URLSearchParams): any {
2024-09-06 13:53:14 +02:00
let newOptions: any = {
token: PUBLIC_MAPBOX_TOKEN,
files: [],
ids: [],
};
if (options.has('state')) {
let state = JSON.parse(options.get('state')!);
if (state.ids) {
newOptions.ids.push(...state.ids);
}
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',
2024-09-06 13:53:14 +02:00
};
}
return newOptions;
}