From 8888650c564261921035895255d8fe96da347818 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 26 May 2024 20:07:23 +0000 Subject: [PATCH 1/5] Add more options for featured adventures --- src/lib/components/AddFromFeatured.svelte | 50 +++++++++++++++++++ src/lib/db/schema.ts | 6 --- src/routes/featured/+page.server.ts | 2 +- src/routes/featured/+page.svelte | 61 ++++++++++++++++++++++- 4 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 src/lib/components/AddFromFeatured.svelte diff --git a/src/lib/components/AddFromFeatured.svelte b/src/lib/components/AddFromFeatured.svelte new file mode 100644 index 0000000..702a10a --- /dev/null +++ b/src/lib/components/AddFromFeatured.svelte @@ -0,0 +1,50 @@ + + + + + + + diff --git a/src/lib/db/schema.ts b/src/lib/db/schema.ts index 5cb928b..a6298a8 100644 --- a/src/lib/db/schema.ts +++ b/src/lib/db/schema.ts @@ -9,12 +9,6 @@ import { integer, } from "drizzle-orm/pg-core"; -export const featuredAdventures = pgTable("featuredAdventures", { - id: serial("id").primaryKey(), - name: text("name").notNull().unique(), - location: text("location"), -}); - export const sharedAdventures = pgTable("sharedAdventures", { id: text("id").primaryKey(), data: json("data").notNull(), diff --git a/src/routes/featured/+page.server.ts b/src/routes/featured/+page.server.ts index c60aa47..50b0180 100644 --- a/src/routes/featured/+page.server.ts +++ b/src/routes/featured/+page.server.ts @@ -1,5 +1,5 @@ import { db } from "$lib/db/db.server"; -import { adventureTable, featuredAdventures } from "$lib/db/schema"; +import { adventureTable } from "$lib/db/schema"; import type { Adventure } from "$lib/utils/types"; import { eq } from "drizzle-orm"; diff --git a/src/routes/featured/+page.svelte b/src/routes/featured/+page.svelte index 1f6c57c..0a0745d 100644 --- a/src/routes/featured/+page.svelte +++ b/src/routes/featured/+page.svelte @@ -3,9 +3,32 @@ import { goto } from "$app/navigation"; import AdventureCard from "$lib/components/AdventureCard.svelte"; import type { Adventure } from "$lib/utils/types.js"; + import AddFromFeatured from "$lib/components/AddFromFeatured.svelte"; + import { addAdventure } from "../../services/adventureService.js"; + import SucessToast from "$lib/components/SucessToast.svelte"; + + let isShowingToast: boolean = false; + let toastAction: string = ""; + + let adventureToAdd: Adventure | null = null; + + function showToast(action: string) { + toastAction = action; + isShowingToast = true; + + setTimeout(() => { + isShowingToast = false; + toastAction = ""; + }, 3000); + } async function add(event: CustomEvent) { - let detailAdventure = event.detail; + adventureToAdd = event.detail; + } + + async function addToVisted() { + let detailAdventure = adventureToAdd; + adventureToAdd = null; const response = await fetch("/api/visits", { method: "POST", @@ -19,10 +42,46 @@ if (response.status === 401) { goto("/login"); + } else { + showToast("Adventure added to visited list!"); + } + } + + async function addIdea() { + let detailAdventure = adventureToAdd; + adventureToAdd = null; + + const response = await fetch("/api/planner", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + detailAdventure, + }), + }); + + if (response.status === 401) { + goto("/login"); + } else { + showToast("Adventure added to idea list!"); } } +{#if isShowingToast} + +{/if} + +{#if adventureToAdd} + (adventureToAdd = null)} + on:visited={addToVisted} + on:idea={addIdea} + /> +{/if} +

Featured Adventure Locations

From 4fd174530b02fe1a3d3201c10653fb80279d8a84 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 26 May 2024 23:24:31 +0000 Subject: [PATCH 2/5] chore: Add trip selection to AddFromFeatured component --- src/lib/components/AddFromFeatured.svelte | 51 +++++++++++++++++++---- src/routes/api/trips/+server.ts | 9 +--- src/routes/featured/+page.svelte | 30 ++++++++++++- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/src/lib/components/AddFromFeatured.svelte b/src/lib/components/AddFromFeatured.svelte index 702a10a..2ae36cb 100644 --- a/src/lib/components/AddFromFeatured.svelte +++ b/src/lib/components/AddFromFeatured.svelte @@ -1,24 +1,29 @@ +{#if tripModal} + +{/if} + @@ -58,26 +64,9 @@ - +
diff --git a/src/lib/components/TripListModal.svelte b/src/lib/components/TripListModal.svelte new file mode 100644 index 0000000..d553cd8 --- /dev/null +++ b/src/lib/components/TripListModal.svelte @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/src/routes/featured/+page.svelte b/src/routes/featured/+page.svelte index 6efd4c9..4433eb5 100644 --- a/src/routes/featured/+page.svelte +++ b/src/routes/featured/+page.svelte @@ -3,7 +3,7 @@ import { goto } from "$app/navigation"; import AdventureCard from "$lib/components/AdventureCard.svelte"; import type { Adventure, Trip } from "$lib/utils/types.js"; - import AddFromFeatured from "$lib/components/AddFromFeatured.svelte"; + import AddFromFeatured from "$lib/components/AddLocationChooser.svelte"; import { addAdventure } from "../../services/adventureService.js"; import SucessToast from "$lib/components/SucessToast.svelte"; From dc9a013a57856a40094a0f4256275610d5c7a670 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 27 May 2024 21:16:29 +0000 Subject: [PATCH 5/5] Auto description and image generation! --- src/lib/components/AdventureCard.svelte | 4 ++ src/lib/components/CreateNewAdventure.svelte | 31 +++++++++- src/lib/components/TripCard.svelte | 6 +- src/lib/index.ts | 61 ++++++++++++++++++++ src/routes/planner/+page.svelte | 2 +- 5 files changed, 97 insertions(+), 7 deletions(-) diff --git a/src/lib/components/AdventureCard.svelte b/src/lib/components/AdventureCard.svelte index ceaf5e4..7ae6205 100644 --- a/src/lib/components/AdventureCard.svelte +++ b/src/lib/components/AdventureCard.svelte @@ -109,6 +109,10 @@ > --> + { @@ -46,6 +46,28 @@ } } + async function generate() { + try { + console.log(newAdventure.name); + const desc = await generateDescription(newAdventure.name); + newAdventure.description = desc; + // Do something with the updated newAdventure object + } catch (error) { + console.error(error); + // Handle the error + } + } + + async function searchImage() { + try { + const imageUrl = await getImage(newAdventure.name); + newAdventure.imageUrl = imageUrl; + } catch (error) { + console.error(error); + // Handle the error + } + } + let activityInput: string = ""; function activitySetup() { @@ -102,6 +124,7 @@ class="input input-bordered w-full max-w-xs" /> +
+ +
diff --git a/src/lib/components/TripCard.svelte b/src/lib/components/TripCard.svelte index 2c291e2..a7fc61b 100644 --- a/src/lib/components/TripCard.svelte +++ b/src/lib/components/TripCard.svelte @@ -19,11 +19,7 @@ dispatch("add", trip); } - function moreInfo() { - console.log(trip.id); - goto(`/trip/${trip.id}`); - } - + // TODO: Implement markVisited function function markVisited() { console.log(trip.id); dispatch("markVisited", trip); diff --git a/src/lib/index.ts b/src/lib/index.ts index 07c1c49..078bef0 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -63,3 +63,64 @@ export function addActivityType( } return adventureToEdit; } + +/** + * Generates a description for an adventure using the adventure title. + * @param adventureTitle - The title of the adventure. + * @returns A Promise that resolves to the description of the adventure. + */ +export async function generateDescription(adventureTitle: string) { + const url = `https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=extracts&exintro&explaintext&format=json&titles=${encodeURIComponent( + adventureTitle + )}`; + + try { + const res = await fetch(url); + const data = await res.json(); + + // Check if the query was successful + if (data.query && data.query.pages) { + const pageId = Object.keys(data.query.pages)[0]; + const page = data.query.pages[pageId]; + + // Check if the page exists + if (page.extract) { + return page.extract; + } else { + return `No Wikipedia article found for "${adventureTitle}".`; + } + } else { + return `Error: ${data.error.info}`; + } + } catch (error) { + console.error("Error fetching Wikipedia data:", error); + return `Error fetching Wikipedia data for "${adventureTitle}".`; + } +} + +export async function getImage(adventureTitle: string) { + const url = `https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=pageimages&format=json&piprop=original&titles=${adventureTitle}`; + + try { + const res = await fetch(url); + const data = await res.json(); + + // Check if the query was successful + if (data.query && data.query.pages) { + const pageId = Object.keys(data.query.pages)[0]; + const page = data.query.pages[pageId]; + + // Check if the page has an image + if (page.original && page.original.source) { + return page.original.source; + } else { + return `No image found for "${adventureTitle}".`; + } + } else { + return `Error: ${data.error.info}`; + } + } catch (error) { + console.error("Error fetching Wikipedia data:", error); + return `Error fetching Wikipedia data for "${adventureTitle}".`; + } +} diff --git a/src/routes/planner/+page.svelte b/src/routes/planner/+page.svelte index 9ee26a2..4377748 100644 --- a/src/routes/planner/+page.svelte +++ b/src/routes/planner/+page.svelte @@ -271,7 +271,7 @@ {#if tripPlans.length !== 0}
-

My Trip Plans

+

My Trip Ideas

{/if}