diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index f009f36..0d8b097 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -1161,5 +1161,4 @@ class ReverseGeocodeViewSet(viewsets.ViewSet): visited_region.save() new_region_count += 1 new_regions[region.id] = region.name - return Response({"new_regions": new_region_count, "regions": new_regions}) - + return Response({"new_regions": new_region_count, "regions": new_regions}) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 38d81e3..9ffdfdc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,7 +43,7 @@ services: - DEBUG=False - FRONTEND_URL='http://localhost:8015' # Used for email generation. This should be the url of the frontend ports: - - "8016:80" # User can change this to any outward port without breaking the setup + - "8016:80" depends_on: - db volumes: diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index 429858d..4715c7c 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -70,7 +70,8 @@ images: adventureToEdit?.images || [], user_id: adventureToEdit?.user_id || null, collection: adventureToEdit?.collection || collection?.id || null, - visits: adventureToEdit?.visits || [] + visits: adventureToEdit?.visits || [], + is_visited: adventureToEdit?.is_visited || false }; let markers: Point[] = []; diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index cab49d4..40d5ff9 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -253,6 +253,39 @@ export let ADVENTURE_TYPES = [ { type: 'other', label: 'Other' } ]; +// adventure type to icon mapping +export let ADVENTURE_TYPE_ICONS = { + general: '🌍', + outdoor: '🏞️', + lodging: '🛌', + dining: '🍽️', + activity: '🏄', + attraction: '🎢', + shopping: '🛍️', + nightlife: '🌃', + event: '🎉', + transportation: '🚗', + culture: '🎭', + water_sports: '🚤', + hiking: '🥾', + wildlife: '🦒', + historical_sites: '🏛️', + music_concerts: '🎶', + fitness: '🏋️', + art_museums: '🎨', + festivals: '🎪', + spiritual_journeys: '🧘‍♀️', + volunteer_work: '🤝', + other: '❓' +}; + +type AdventureType = keyof typeof ADVENTURE_TYPE_ICONS; + +export function getAdventureTypeLabel(type: AdventureType) { + const typeObj = ADVENTURE_TYPE_ICONS[type]; + return typeObj; +} + export function getRandomBackground() { const randomIndex = Math.floor(Math.random() * randomBackgrounds.backgrounds.length); return randomBackgrounds.backgrounds[randomIndex] as Background; diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 5d168aa..758f7c9 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -63,6 +63,9 @@ export type VisitedRegion = { id: number; region: number; user_id: number; + longitude: number; + latitude: number; + name: string; }; export type Point = { diff --git a/frontend/src/routes/map/+page.server.ts b/frontend/src/routes/map/+page.server.ts index 919b101..98d036c 100644 --- a/frontend/src/routes/map/+page.server.ts +++ b/frontend/src/routes/map/+page.server.ts @@ -19,43 +19,21 @@ export const load = (async (event) => { Cookie: `${event.cookies.get('auth')}` } }); - let visitedRegions = (await visitedRegionsFetch.json()) as VisitedRegion[]; - if (!visitedFetch.ok) { + let visitedRegions = (await visitedRegionsFetch.json()) as VisitedRegion[]; + let adventures = (await visitedFetch.json()) as Adventure[]; + + if (!visitedRegionsFetch.ok) { + console.error('Failed to fetch visited regions'); + return redirect(302, '/login'); + } else if (!visitedFetch.ok) { console.error('Failed to fetch visited adventures'); return redirect(302, '/login'); } else { - let visited: Adventure[] = []; - try { - let api_result = await visitedFetch.json(); - visited = api_result as Adventure[]; - if (!Array.isArray(visited) || visited.length === 0 || !visited) { - throw new Error('Visited adventures response is not an array'); - } - } catch (error) { - console.error('Error parsing visited adventures:', error); - return redirect(302, '/login'); - } - - // make a long lat array like this { lngLat: [-20, 0], name: 'Adventure 1' }, - let markers = visited - .filter((adventure) => adventure.latitude !== null && adventure.longitude !== null) - .map((adventure) => { - return { - lngLat: [adventure.longitude, adventure.latitude], - name: adventure.name, - visits: adventure.visits, - type: adventure.type, - is_visited: adventure.is_visited - }; - }); - - console.log('sent'); - return { props: { - markers, - visitedRegions + visitedRegions, + adventures } }; } diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index 0b8d925..89b03d5 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -1,91 +1,53 @@ -

Adventure Map

@@ -109,14 +71,14 @@ id="show-geo" name="show-geo" class="checkbox" - bind:checked={showGEO} + on:click={() => (showGeo = !showGeo)} /> - - {#if newMarker.length > 0} +
+ {#if newMarker} - {:else} @@ -142,12 +104,13 @@ class="relative aspect-[9/16] max-h-[70vh] w-full sm:aspect-video sm:max-h-full" standardControls > - {#each filteredMarkers as marker} - {#if marker.is_visited} + {#each filteredAdventures as adventure} + {#if adventure.latitude && adventure.longitude} (clickedName = marker.name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-red-300 text-black shadow-md" + lngLat={[adventure.longitude, adventure.latitude]} + class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-{adventure.is_visited + ? 'red' + : 'blue'}-300 text-black shadow-md" > - + -
{marker.name}
-

Visited

+
{adventure.name}

- {$t(`adventures.activities.${marker.type}`)} + {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}

- {#if marker.visits && marker.visits.length > 0} -

- {#each marker.visits as visit} - {visit.start_date - ? new Date(visit.start_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} - {visit.end_date && visit.end_date !== '' && visit.end_date !== visit.start_date - ? ' - ' + - new Date(visit.end_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} -
- {/each} -

- {/if} -
-
- {:else} - (clickedName = marker.name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-blue-300 text-black shadow-2xl focus:outline-2 focus:outline-black" - > - - - - -
{marker.name}
-

Planned

- {$t(`adventures.activities.${marker.type}`)} + {$t(`adventures.activities.${adventure.type}`)}

- {#if marker.visits && marker.visits.length > 0} + {#if adventure.visits && adventure.visits.length > 0}

- {#each marker.visits as visit} + {#each adventure.visits as visit} {visit.start_date ? new Date(visit.start_date).toLocaleDateString(undefined, { timeZone: 'UTC' @@ -229,31 +160,31 @@ {/each} - {#each newMarker as marker} - - {/each} + {#if newMarker} + + {/if} - {#each allRegions as { longitude, latitude, name, region }} - (clickedName = name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-green-300 text-black shadow-md" - > - - - - - -

{name}
-

{region}

-
-
+ + + + +
{name}
+

{region.name}

+
+ + {/if} {/each}