From ca33bb3108300385a04da72b500a9ac209ee5208 Mon Sep 17 00:00:00 2001 From: secondl1ght Date: Sun, 10 Dec 2023 13:28:50 -0700 Subject: [PATCH] improve verify loading --- src/routes/verify-location/+layout.svelte | 17 -- src/routes/verify-location/+page.svelte | 325 ++++++++++++---------- 2 files changed, 180 insertions(+), 162 deletions(-) delete mode 100644 src/routes/verify-location/+layout.svelte diff --git a/src/routes/verify-location/+layout.svelte b/src/routes/verify-location/+layout.svelte deleted file mode 100644 index e3497715..00000000 --- a/src/routes/verify-location/+layout.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - - BTC Map - Verify Location - - - - - -{#if $elements && $elements.length} - -{:else} - -{/if} diff --git a/src/routes/verify-location/+page.svelte b/src/routes/verify-location/+page.svelte index 6fb7d55f..437883e8 100644 --- a/src/routes/verify-location/+page.svelte +++ b/src/routes/verify-location/+page.svelte @@ -22,22 +22,165 @@ toggleMapButtons } from '$lib/map/setup'; import { elementError, elements, theme } from '$lib/store'; - import type { SubmitForm } from '$lib/types'; + import type { DomEventType, Element, Leaflet, SubmitForm } from '$lib/types'; import { detectTheme, errToast } from '$lib/utils'; import axios from 'axios'; import type { Map, TileLayer } from 'leaflet'; import { onDestroy, onMount } from 'svelte'; + let initialRenderComplete = false; + let elementsLoaded = false; + + let leaflet: Leaflet; + let DomEvent: DomEventType; + + const initializeElements = () => { + if (elementsLoaded) return; + + if (id) { + merchant = $elements.find((element) => element.id && element.id === id); + } + + if (merchant) { + name = merchant.osm_json.tags?.name; + lat = latCalc(merchant.osm_json); + long = longCalc(merchant.osm_json); + location = `https://btcmap.org/map?lat=${lat}&long=${long}`; + edit = `https://www.openstreetmap.org/edit?${merchant.osm_json.type}=${merchant.osm_json.id}`; + selected = true; + } else { + showMap = true; + + const theme = detectTheme(); + + // add map and tiles + map = leaflet.map(mapElement, { attributionControl: false }).setView([0, 0], 2); + + osm = leaflet.tileLayer('https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}{r}.png', { + noWrap: true, + maxZoom: 20 + }); + + alidadeSmoothDark = leaflet.tileLayer( + 'https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png', + { + noWrap: true, + maxZoom: 20 + } + ); + + if (theme === 'dark') { + alidadeSmoothDark.addTo(map); + } else { + osm.addTo(map); + } + + // set URL lat/long query view if it exists and is valid + if (lat && long) { + try { + map.fitBounds([[lat, long]]); + } catch (error) { + console.log(error); + } + } + + // change broken marker image path in prod + leaflet.Icon.Default.prototype.options.imagePath = '/icons/'; + + // add OSM attribution + attribution(leaflet, map); + + // add locate button to map + geolocate(leaflet, map); + + // change default icons + changeDefaultIcons(false, leaflet, mapElement, DomEvent); + + // create marker cluster group + /* eslint-disable no-undef */ + // @ts-expect-error + let markers = L.markerClusterGroup(); + /* eslint-enable no-undef */ + + // get date from 1 year ago to add verified check if survey is current + let verifiedDate = calcVerifiedDate(); + + // add location information + $elements.forEach((element) => { + if (element['deleted_at']) { + return; + } + + let icon = element.tags['icon:android']; + let payment = element.tags['payment:uri'] + ? { type: 'uri', url: element.tags['payment:uri'] } + : element.tags['payment:pouch'] + ? { type: 'pouch', username: element.tags['payment:pouch'] } + : element.tags['payment:coinos'] + ? { type: 'coinos', username: element.tags['payment:coinos'] } + : undefined; + let boosted = + element.tags['boost:expires'] && Date.parse(element.tags['boost:expires']) > Date.now() + ? element.tags['boost:expires'] + : undefined; + + const elementOSM = element['osm_json']; + + const latC = latCalc(elementOSM); + const longC = longCalc(elementOSM); + + let divIcon = generateIcon(leaflet, icon, boosted ? true : false); + + let marker = generateMarker( + latC, + longC, + divIcon, + elementOSM, + payment, + leaflet, + verifiedDate, + false, + boosted + ); + + // add marker click event + marker.on('click', (e) => { + if (captchaSecret) { + map.setView(e.latlng, 19); + name = elementOSM.tags?.name || ''; + lat = latC; + long = longC; + location = `https://btcmap.org/map?lat=${lat}&long=${long}`; + edit = `https://www.openstreetmap.org/edit?${elementOSM.type}=${elementOSM.id}`; + selected = true; + } + }); + + markers.addLayer(marker); + }); + + map.addLayer(markers); + + mapLoaded = true; + } + + elementsLoaded = true; + }; + + $: $elements && + $elements.length && + initialRenderComplete && + !elementsLoaded && + initializeElements(); + const id = $page.url.searchParams.has('id') ? $page.url.searchParams.get('id') : ''; - const merchant = $elements.find((element) => element.id && element.id === id); + let merchant: Element | undefined; - let name = merchant ? merchant.osm_json.tags?.name : ''; - let lat = merchant ? latCalc(merchant.osm_json) : undefined; - let long = merchant ? longCalc(merchant.osm_json) : undefined; - let location = lat && long ? `https://btcmap.org/map?lat=${lat}&long=${long}` : ''; - let edit = merchant - ? `https://www.openstreetmap.org/edit?${merchant.osm_json.type}=${merchant.osm_json.id}` - : ''; + let name = ''; + let lat: number | undefined; + let long: number | undefined; + let location = ''; + let edit = ''; let captcha: HTMLDivElement; let captchaSecret: string; @@ -63,7 +206,7 @@ let outdated: string; let verify: HTMLTextAreaElement; - let selected = location ? true : false; + let selected = false; let noLocationSelected = false; let submitted = false; let submitting = false; @@ -111,155 +254,40 @@ // location picker map if not accessing page from webapp let mapElement: HTMLDivElement; let map: Map; - let showMap = !lat || !long || !edit ? true : false; + let showMap = id ? false : true; let mapLoaded = false; let osm: TileLayer; let alidadeSmoothDark: TileLayer; // alert for map errors - $: $elementError && showMap && errToast($elementError); + $: $elementError && errToast($elementError); onMount(async () => { if (browser) { - const theme = detectTheme(); - // fetch and add captcha fetchCaptcha(); - if (showMap) { - //import packages - const leaflet = await import('leaflet'); - // @ts-expect-error - const DomEvent = await import('leaflet/src/dom/DomEvent'); - /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ - const leafletLocateControl = await import('leaflet.locatecontrol'); - const leafletMarkerCluster = await import('leaflet.markercluster'); - /* eslint-enable no-unused-vars, @typescript-eslint/no-unused-vars */ - - // add map and tiles - map = leaflet.map(mapElement, { attributionControl: false }).setView([0, 0], 2); - - osm = leaflet.tileLayer( - 'https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}{r}.png', - { - noWrap: true, - maxZoom: 20 - } - ); - - alidadeSmoothDark = leaflet.tileLayer( - 'https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png', - { - noWrap: true, - maxZoom: 20 - } - ); - - if (theme === 'dark') { - alidadeSmoothDark.addTo(map); - } else { - osm.addTo(map); - } + //import packages + leaflet = await import('leaflet'); + // @ts-expect-error + DomEvent = await import('leaflet/src/dom/DomEvent'); + /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ + const leafletLocateControl = await import('leaflet.locatecontrol'); + const leafletMarkerCluster = await import('leaflet.markercluster'); + /* eslint-enable no-unused-vars, @typescript-eslint/no-unused-vars */ - // set URL lat/long query view if it exists and is valid - if (lat && long) { - try { - map.fitBounds([[lat, long]]); - } catch (error) { - console.log(error); - } - } - - // change broken marker image path in prod - leaflet.Icon.Default.prototype.options.imagePath = '/icons/'; - - // add OSM attribution - attribution(leaflet, map); - - // add locate button to map - geolocate(leaflet, map); - - // change default icons - changeDefaultIcons(false, leaflet, mapElement, DomEvent); - - // create marker cluster group - /* eslint-disable no-undef */ - // @ts-expect-error - let markers = L.markerClusterGroup(); - /* eslint-enable no-undef */ - - // get date from 1 year ago to add verified check if survey is current - let verifiedDate = calcVerifiedDate(); - - // add location information - $elements.forEach((element) => { - if (element['deleted_at']) { - return; - } - - let icon = element.tags['icon:android']; - let payment = element.tags['payment:uri'] - ? { type: 'uri', url: element.tags['payment:uri'] } - : element.tags['payment:pouch'] - ? { type: 'pouch', username: element.tags['payment:pouch'] } - : element.tags['payment:coinos'] - ? { type: 'coinos', username: element.tags['payment:coinos'] } - : undefined; - let boosted = - element.tags['boost:expires'] && Date.parse(element.tags['boost:expires']) > Date.now() - ? element.tags['boost:expires'] - : undefined; - - const elementOSM = element['osm_json']; - - const latC = latCalc(elementOSM); - const longC = longCalc(elementOSM); - - let divIcon = generateIcon(leaflet, icon, boosted ? true : false); - - let marker = generateMarker( - latC, - longC, - divIcon, - elementOSM, - payment, - leaflet, - verifiedDate, - false, - boosted - ); - - // add marker click event - marker.on('click', (e) => { - if (captchaSecret) { - map.setView(e.latlng, 19); - name = elementOSM.tags?.name || ''; - lat = latC; - long = longC; - location = lat && long ? `https://btcmap.org/map?lat=${lat}&long=${long}` : ''; - edit = `https://www.openstreetmap.org/edit?${elementOSM.type}=${elementOSM.id}`; - selected = true; - } - }); - - markers.addLayer(marker); - }); - - map.addLayer(markers); - - mapLoaded = true; - } + initialRenderComplete = true; } }); - $: $theme !== undefined && mapLoaded === true && showMap && toggleMapButtons(); + $: $theme !== undefined && mapLoaded && showMap && toggleMapButtons(); const closePopup = () => { map.closePopup(); }; - $: $theme !== undefined && mapLoaded === true && showMap && closePopup(); + $: $theme !== undefined && mapLoaded && showMap && closePopup(); const toggleTheme = () => { if ($theme === 'dark') { @@ -271,7 +299,7 @@ } }; - $: $theme !== undefined && mapLoaded === true && showMap && toggleTheme(); + $: $theme !== undefined && mapLoaded && showMap && toggleTheme(); if (showMap) { onDestroy(async () => { @@ -283,6 +311,13 @@ } + + BTC Map - Verify Location + + + + +
@@ -354,7 +389,7 @@ readonly type="text" name="name" - placeholder="Merchant Name" + placeholder={!showMap && !elementsLoaded ? 'Loading Merchant...' : 'Merchant Name'} class="w-full rounded-2xl border-2 border-input p-3 text-center font-semibold focus:outline-link" />
@@ -366,7 +401,7 @@ > Outdated information (If applicable)