1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-08-04 20:55:19 +02:00
AdventureLog/frontend/src/routes/search/+page.svelte

144 lines
3.8 KiB
Svelte
Raw Normal View History

2024-07-17 17:36:05 -04:00
<script lang="ts">
import AdventureCard from '$lib/components/AdventureCard.svelte';
import NotFound from '$lib/components/NotFound.svelte';
import type { Adventure, OpenStreetMapPlace } from '$lib/types';
import { onMount } from 'svelte';
2024-07-17 17:36:05 -04:00
import type { PageData } from './$types';
2024-07-22 10:08:42 -04:00
import EditAdventure from '$lib/components/EditAdventure.svelte';
2024-07-22 10:56:18 -04:00
import { appVersion } from '$lib/config';
2024-07-17 17:36:05 -04:00
export let data: PageData;
2024-07-17 22:06:55 -04:00
function deleteAdventure(event: CustomEvent<number>) {
myAdventures = myAdventures.filter((adventure) => adventure.id !== event.detail);
2024-07-17 22:06:55 -04:00
}
let osmResults: OpenStreetMapPlace[] = [];
let myAdventures: Adventure[] = [];
let publicAdventures: Adventure[] = [];
let query: string | null = '';
onMount(() => {
const urlParams = new URLSearchParams(window.location.search);
query = urlParams.get('query');
fetchData();
});
async function fetchData() {
2024-07-22 10:56:18 -04:00
let res = await fetch(`https://nominatim.openstreetmap.org/search?q=${query}&format=jsonv2`, {
headers: {
'User-Agent': `AdventureLog / ${appVersion} `
}
});
const data = await res.json();
osmResults = data;
}
onMount(async () => {
2024-07-22 10:56:18 -04:00
let res = await fetch(`https://nominatim.openstreetmap.org/search?q=${query}&format=jsonv2`, {
headers: {
'User-Agent': `AdventureLog / ${appVersion} `
}
});
const data = await res.json();
osmResults = data;
});
2024-07-17 17:36:05 -04:00
console.log(data);
2024-07-17 17:36:05 -04:00
if (data.props) {
myAdventures = data.props.adventures;
publicAdventures = data.props.adventures;
if (data.user?.pk != null) {
myAdventures = myAdventures.filter((adventure) => adventure.user_id === data.user?.pk ?? -1);
} else {
myAdventures = [];
}
publicAdventures = publicAdventures.filter((adventure) => adventure.user_id !== data.user?.pk);
2024-07-17 17:36:05 -04:00
}
2024-07-22 10:08:42 -04:00
let adventureToEdit: Adventure;
let isEditModalOpen: boolean = false;
let isShowingCreateModal: boolean = false;
function editAdventure(event: CustomEvent<Adventure>) {
adventureToEdit = event.detail;
isEditModalOpen = true;
}
function saveEdit(event: CustomEvent<Adventure>) {
myAdventures = myAdventures.map((adventure) => {
2024-07-22 10:08:42 -04:00
if (adventure.id === event.detail.id) {
return event.detail;
}
return adventure;
});
isEditModalOpen = false;
}
2024-07-17 17:36:05 -04:00
</script>
2024-07-22 10:08:42 -04:00
{#if isEditModalOpen}
<EditAdventure
{adventureToEdit}
on:close={() => (isEditModalOpen = false)}
on:saveEdit={saveEdit}
/>
{/if}
{#if myAdventures.length === 0 && osmResults.length === 0}
2024-07-18 14:55:23 -04:00
<NotFound error={data.error} />
{/if}
{#if myAdventures.length !== 0 && publicAdventures.length !== 0}
<h2 class="text-center font-bold text-2xl mb-4">AdventureLog Results</h2>
{/if}
{#if myAdventures.length > 0}
<h2 class="text-center font-bold text-2xl mb-4">My Adventures</h2>
<div class="flex flex-wrap gap-4 mr-4 justify-center content-center">
{#each myAdventures as adventure}
2024-07-18 18:37:46 -04:00
<AdventureCard
user={data.user}
type={adventure.type}
{adventure}
on:delete={deleteAdventure}
2024-07-22 10:08:42 -04:00
on:edit={editAdventure}
2024-07-18 18:37:46 -04:00
/>
{/each}
</div>
{/if}
{#if publicAdventures.length > 0}
<h2 class="text-center font-bold text-2xl mb-4">Public Adventures</h2>
<div class="flex flex-wrap gap-4 mr-4 justify-center content-center">
{#each publicAdventures as adventure}
<AdventureCard
user={null}
type={adventure.type}
{adventure}
on:delete={deleteAdventure}
on:edit={editAdventure}
/>
{/each}
</div>
{/if}
{#if myAdventures.length > 0 && osmResults.length > 0 && publicAdventures.length > 0}
<div class="divider"></div>
{/if}
{#if osmResults.length > 0}
<h2 class="text-center font-bold text-2xl mb-4">Online Results</h2>
<div class="flex flex-wrap gap-4 mr-4 justify-center content-center">
{#each osmResults as result}
2024-07-19 09:05:47 -04:00
<div class="bg-base-300 rounded-lg shadow-md p-4 w-96 mb-2">
<h2 class="text-xl font-bold">{result.display_name}</h2>
<p>{result.type}</p>
<p>{result.lat}, {result.lon}</p>
</div>
{/each}
</div>
2024-07-17 17:36:05 -04:00
{/if}