From 82fd1aaa6da09f2b9bf60524567e3f8e620a48a5 Mon Sep 17 00:00:00 2001 From: Gus Ruben Date: Tue, 22 Jul 2025 15:32:56 -0400 Subject: [PATCH] Use new Leaflet map --- bun.lock | 8 +++ package.json | 2 + src/components/MapComponent.svelte | 77 +++++++++++++++++++++++++++++ src/routes/+page.svelte | 11 ++--- src/routes/api/map-data/+server.js | 64 ++++++++++++++++++++++++ static/map-flag.png | Bin 0 -> 427 bytes 6 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 src/components/MapComponent.svelte create mode 100644 src/routes/api/map-data/+server.js create mode 100644 static/map-flag.png diff --git a/bun.lock b/bun.lock index d2abe5a..b2811c8 100644 --- a/bun.lock +++ b/bun.lock @@ -7,8 +7,10 @@ "@fontsource/atkinson-hyperlegible": "^5.2.6", "@sveltejs/adapter-node": "^5.2.13", "@sveltejs/adapter-static": "^3.0.8", + "@types/leaflet": "^1.9.20", "airtable": "^0.12.2", "gsap": "^3.13.0", + "leaflet": "^1.9.4", "lenis": "^1.3.4", "winston": "^3.17.0", }, @@ -196,6 +198,10 @@ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/leaflet": ["@types/leaflet@1.9.20", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw=="], + "@types/node": ["@types/node@14.18.63", "", {}, "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="], "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], @@ -292,6 +298,8 @@ "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], + "leaflet": ["leaflet@1.9.4", "", {}, "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="], + "lenis": ["lenis@1.3.4", "", { "peerDependencies": { "@nuxt/kit": ">=3.0.0", "react": ">=17.0.0", "vue": ">=3.0.0" }, "optionalPeers": ["@nuxt/kit", "react", "vue"] }, "sha512-WIGk8wiV2ABm/T7M+NC+tAV8fjzNJD1J4z11aZ3mTtx7WAZX/4QdCNhBO0g/TqXISA+/3hTbzrPC4FW1nhoNMQ=="], "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], diff --git a/package.json b/package.json index bb2f2db..1462349 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,10 @@ "@fontsource/atkinson-hyperlegible": "^5.2.6", "@sveltejs/adapter-node": "^5.2.13", "@sveltejs/adapter-static": "^3.0.8", + "@types/leaflet": "^1.9.20", "airtable": "^0.12.2", "gsap": "^3.13.0", + "leaflet": "^1.9.4", "lenis": "^1.3.4", "winston": "^3.17.0" } diff --git a/src/components/MapComponent.svelte b/src/components/MapComponent.svelte new file mode 100644 index 0000000..8690a13 --- /dev/null +++ b/src/components/MapComponent.svelte @@ -0,0 +1,77 @@ + + +
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0f851b1..247fefb 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,6 +2,7 @@ import { onMount } from "svelte"; import { gsap } from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; + import MapComponent from "../components/MapComponent.svelte"; /** @type {import('./$types').PageData} */ export let data; @@ -883,13 +884,11 @@ Mumbai`.split("\n")
100 Cities Worldwide - + style="mask: url('hole.png') no-repeat center; -webkit-mask: url('hole.png') no-repeat center; mask-size: contain; -webkit-mask-size: contain;"> + +

All daydream events are organized by high school students like yourself!
Sign up to organize now!

diff --git a/src/routes/api/map-data/+server.js b/src/routes/api/map-data/+server.js new file mode 100644 index 0000000..4a06dad --- /dev/null +++ b/src/routes/api/map-data/+server.js @@ -0,0 +1,64 @@ +import { AIRTABLE_API_KEY, AIRTABLE_BASE_ID, GEOCODER_API_KEY } from '$env/static/private'; +import { json } from '@sveltejs/kit'; + +export const prerender = true; + +/** @type {import('./$types').RequestHandler} */ +export async function GET() { + if (!AIRTABLE_API_KEY || !AIRTABLE_BASE_ID || !GEOCODER_API_KEY) { + return json({ error: 'Missing required environment variables' }, { status: 500 }); + } + + try { + // Fetch approved events from Airtable + const airtableUrl = `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/events?filterByFormula={triage_status}="Approved"`; + const airtableResponse = await fetch(airtableUrl, { + headers: { + 'Authorization': `Bearer ${AIRTABLE_API_KEY}` + } + }); + + if (!airtableResponse.ok) { + throw new Error(`Airtable API error: ${airtableResponse.status}`); + } + + const airtableData = await airtableResponse.json(); + const events = airtableData.records; + + // Geocode each event location + const locations = []; + for (const event of events) { + const { city, state, country, event_name } = event.fields; + + if (!city || !event_name) continue; + + // Build address string + const addressParts = [city, state, country].filter(Boolean); + const address = addressParts.join(', '); + + try { + const geocodeUrl = `https://geocoder.hackclub.com/v1/geocode?address=${encodeURIComponent(address)}&key=${GEOCODER_API_KEY}`; + const geocodeResponse = await fetch(geocodeUrl); + + if (geocodeResponse.ok) { + const geocodeData = await geocodeResponse.json(); + locations.push({ + lat: geocodeData.lat, + lng: geocodeData.lng, + event_name, + city, + state, + country + }); + } + } catch (error) { + console.error(`Failed to geocode ${address}:`, error); + } + } + + return json(locations); + } catch (error) { + console.error('Failed to fetch map data:', error); + return json({ error: 'Failed to fetch map data' }, { status: 500 }); + } +} diff --git a/static/map-flag.png b/static/map-flag.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd18cd5078eb864ecd835f4e7da2653535ef72d GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!>H>U1T!Hj^hk)l60q-pWUYQ2G zHVHVntl*7V!11L8r1Jtq2)5S3);_%yR z7x|hLL>dy6G;}xjoYLqGT2k>}yvMq5E$iH?Vb=fWiq}~2Ckr$sN_<;WGXF{F>a|zj zW|}X)_*(tgjM;Cq#r7S1>b;=gz*W9gMdvh@>P)^h?L9-C3|CJ>gOY=T10x@c2_uuK z$bZ`IHduF%)J+i1i#r=FhvJmf%WlLY(IeoQ_ zRW`HVA%#QXgSx}329}b8H|AZhIDKeC{2RVWm!pCXnXLE=^Z|pXtDnm{r-UW|^^?C) literal 0 HcmV?d00001