diff --git a/frontend/src/lib/components/EditAdventure.svelte b/frontend/src/lib/components/EditAdventure.svelte index 099d269..d6d62ee 100644 --- a/frontend/src/lib/components/EditAdventure.svelte +++ b/frontend/src/lib/components/EditAdventure.svelte @@ -12,17 +12,21 @@ let originalName = adventureToEdit.name; let isPointModalOpen: boolean = false; + let isImageFetcherOpen: boolean = false; + + let fileInput: HTMLInputElement; + let image: File; import MapMarker from '~icons/mdi/map-marker'; import Calendar from '~icons/mdi/calendar'; import Notebook from '~icons/mdi/notebook'; import ClipboardList from '~icons/mdi/clipboard-list'; - import Image from '~icons/mdi/image'; import Star from '~icons/mdi/star'; import Attachment from '~icons/mdi/attachment'; import PointSelectionModal from './PointSelectionModal.svelte'; import Earth from '~icons/mdi/earth'; import Wikipedia from '~icons/mdi/wikipedia'; + import ImageFetcher from './ImageFetcher.svelte'; onMount(async () => { modal = document.getElementById('my_modal_1') as HTMLDialogElement; @@ -88,6 +92,23 @@ } } } + + function handleImageFetch(event: CustomEvent) { + const file = event.detail.file; + if (file && fileInput) { + // Create a DataTransfer object and add the file + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(file); + + // Set the files property of the file input + fileInput.files = dataTransfer.files; + + // Update the adventureToEdit object + adventureToEdit.image = file; + } + isImageFetcherOpen = false; + } + function setLongLat(event: CustomEvent<[number, number]>) { console.log(event.detail); adventureToEdit.latitude = event.detail[1]; @@ -105,6 +126,10 @@ /> {/if} +{#if isImageFetcherOpen} + (isImageFetcherOpen = false)} /> +{/if} + @@ -193,14 +218,23 @@ />
-
- +
+
+ + +

+ import { addToast } from '$lib/toasts'; + import { createEventDispatcher } from 'svelte'; + const dispatch = createEventDispatcher(); + import { onMount } from 'svelte'; + let modal: HTMLDialogElement; + + let url: string = ''; + let query: string = ''; + + let error = ''; + + onMount(() => { + modal = document.getElementById('my_modal_1') as HTMLDialogElement; + if (modal) { + modal.showModal(); + } + }); + + async function fetchImage() { + let res = await fetch(url); + let data = await res.blob(); + if (!data) { + error = 'No image found at that URL.'; + return; + } + let file = new File([data], 'image.jpg', { type: 'image/jpeg' }); + close(); + dispatch('image', { file }); + } + + async function fetchWikiImage() { + let res = await fetch(`/api/generate/img/?name=${query}`); + let data = await res.json(); + if (data.source) { + let imageUrl = data.source; + let res = await fetch(imageUrl); + let blob = await res.blob(); + let file = new File([blob], `${query}.jpg`, { type: 'image/jpeg' }); + close(); + dispatch('image', { file }); + } else { + error = 'No image found for that Wikipedia article.'; + } + } + + function close() { + dispatch('close'); + } + + function handleKeydown(event: KeyboardEvent) { + if (event.key === 'Escape') { + dispatch('close'); + } + } + + + + + + + diff --git a/frontend/src/lib/components/NewAdventure.svelte b/frontend/src/lib/components/NewAdventure.svelte index edf23cb..b1f15bc 100644 --- a/frontend/src/lib/components/NewAdventure.svelte +++ b/frontend/src/lib/components/NewAdventure.svelte @@ -5,6 +5,7 @@ import { enhance } from '$app/forms'; import { addToast } from '$lib/toasts'; import PointSelectionModal from './PointSelectionModal.svelte'; + import ImageFetcher from './ImageFetcher.svelte'; export let type: string = 'visited'; @@ -28,8 +29,10 @@ }; let image: File; + let fileInput: HTMLInputElement; let isPointModalOpen: boolean = false; + let isImageFetcherOpen: boolean = false; const dispatch = createEventDispatcher(); let modal: HTMLDialogElement; @@ -102,6 +105,22 @@ } } + function handleImageFetch(event: CustomEvent) { + const file = event.detail.file; + if (file && fileInput) { + // Create a DataTransfer object and add the file + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(file); + + // Set the files property of the file input + fileInput.files = dataTransfer.files; + + // Update the adventureToEdit object + newAdventure.image = file; + } + isImageFetcherOpen = false; + } + function setLongLat(event: CustomEvent<[number, number]>) { console.log(event.detail); newAdventure.latitude = event.detail[1]; @@ -114,6 +133,10 @@ (isPointModalOpen = false)} on:submit={setLongLat} /> {/if} +{#if isImageFetcherOpen} + (isImageFetcherOpen = false)} /> +{/if} + @@ -234,16 +257,23 @@ />
-
- +
+
+ + +