diff --git a/website/src/lib/components/embedding/Embedding.svelte b/website/src/lib/components/embedding/Embedding.svelte index 62f719d8..7b89e517 100644 --- a/website/src/lib/components/embedding/Embedding.svelte +++ b/website/src/lib/components/embedding/Embedding.svelte @@ -1,264 +1,272 @@
-
- - - - - {#if $fileObservers.size > 1} -
- -
- {/if} -
-
- - {#if options.elevation.show} - dataset !== null)} - elevationFill={options.elevation.fill} - panelSize={options.elevation.height} - showControls={options.elevation.controls} - class="py-2" - /> - {/if} -
+
+ + + + + {#if $fileObservers.size > 1} +
+ +
+ {/if} +
+
+ + {#if options.elevation.show} + dataset !== null)} + elevationFill={options.elevation.fill} + panelSize={options.elevation.height} + showControls={options.elevation.controls} + class="py-2" + /> + {/if} +
diff --git a/website/src/lib/components/embedding/Embedding.ts b/website/src/lib/components/embedding/Embedding.ts index 6681550e..d67f6475 100644 --- a/website/src/lib/components/embedding/Embedding.ts +++ b/website/src/lib/components/embedding/Embedding.ts @@ -2,140 +2,147 @@ 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[]; + ids: 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: [], + 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)); + return JSON.parse(JSON.stringify(defaultEmbeddingOptions)); } export function getMergedEmbeddingOptions( - options: any, - defaultOptions: any = defaultEmbeddingOptions + 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; + 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 + 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; + 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) + (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`; + 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; + 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; } diff --git a/website/src/lib/components/embedding/EmbeddingPlayground.svelte b/website/src/lib/components/embedding/EmbeddingPlayground.svelte index e1d8c5ec..1a75b978 100644 --- a/website/src/lib/components/embedding/EmbeddingPlayground.svelte +++ b/website/src/lib/components/embedding/EmbeddingPlayground.svelte @@ -35,15 +35,21 @@ ]; let files = options.files[0]; - let driveIds = ''; - $: if (files || driveIds) { + $: { let urls = files.split(','); urls = urls.filter((url) => url.length > 0); - let ids = driveIds.split(','); - ids = ids.filter((id) => id.length > 0); - urls.push(...ids.map(getURLForGoogleDriveFile)); if (JSON.stringify(urls) !== JSON.stringify(options.files)) { options.files = urls; + console.log(options.files); + } + } + let driveIds = ''; + $: { + let ids = driveIds.split(','); + ids = ids.filter((id) => id.length > 0); + if (JSON.stringify(ids) !== JSON.stringify(options.ids)) { + options.ids = ids; + console.log(options.ids); } } diff --git a/website/src/lib/components/embedding/OpenIn.svelte b/website/src/lib/components/embedding/OpenIn.svelte index 960ce411..bf6d8518 100644 --- a/website/src/lib/components/embedding/OpenIn.svelte +++ b/website/src/lib/components/embedding/OpenIn.svelte @@ -1,18 +1,23 @@ diff --git a/website/src/routes/[[language]]/app/+page.svelte b/website/src/routes/[[language]]/app/+page.svelte index f5d814ef..a272794c 100644 --- a/website/src/routes/[[language]]/app/+page.svelte +++ b/website/src/routes/[[language]]/app/+page.svelte @@ -17,6 +17,7 @@ import { page } from '$app/stores'; import { languages } from '$lib/languages'; import { getURLForLanguage } from '$lib/utils'; + import { getURLForGoogleDriveFile } from '$lib/components/embedding/Embedding'; const { verticalFileView, @@ -30,11 +31,13 @@ onMount(() => { observeFilesFromDatabase(); - let files = JSON.parse($page.url.searchParams.get('files') || '[]'); + let files: string[] = JSON.parse($page.url.searchParams.get('files') || '[]'); + let ids: string[] = JSON.parse($page.url.searchParams.get('ids') || '[]'); + let urls: string[] = files.concat(ids.map(getURLForGoogleDriveFile)); - if (files.length > 0) { + if (urls.length > 0) { let downloads: Promise[] = []; - files.forEach((url) => { + urls.forEach((url) => { downloads.push( fetch(url) .then((response) => response.blob())