mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-10-15 20:08:19 +00:00
156 lines
4.5 KiB
TypeScript
156 lines
4.5 KiB
TypeScript
import { PUBLIC_MAPBOX_TOKEN } from '$env/static/public';
|
|
import { basemaps } from '$lib/assets/layers';
|
|
|
|
export type EmbeddingOptions = {
|
|
token: string;
|
|
files: string[];
|
|
ids: string[];
|
|
basemap: string;
|
|
elevation: {
|
|
show: boolean;
|
|
height: number;
|
|
controls: boolean;
|
|
fill: 'slope' | 'surface' | 'highway' | 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: [],
|
|
ids: [],
|
|
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));
|
|
}
|
|
|
|
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 const allowedEmbeddingBasemaps = Object.keys(basemaps).filter(
|
|
(basemap) => !['ordnanceSurvey'].includes(basemap)
|
|
);
|
|
|
|
export function getFilesFromEmbeddingOptions(options: EmbeddingOptions): string[] {
|
|
return options.files.concat(options.ids.map((id) => getURLForGoogleDriveFile(id)));
|
|
}
|
|
|
|
export function getURLForGoogleDriveFile(fileId: string): string {
|
|
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: [],
|
|
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',
|
|
};
|
|
}
|
|
return newOptions;
|
|
}
|