The code changes include adding a new function called addAdventure to the adventureService module. This function is responsible for sending a POST request to the corresponding API endpoint to add a new adventure. If the request is successful, the adventure is added to the local plans array and a success toast is displayed. If the request fails, an error toast is displayed. This functionality allows users to add adventures to the planner page.
156 lines
4.1 KiB
Svelte
156 lines
4.1 KiB
Svelte
<script lang="ts">
|
|
import type { Adventure } from "$lib/utils/types.js";
|
|
import { onMount } from "svelte";
|
|
import AdventureCard from "$lib/components/AdventureCard.svelte";
|
|
import EditModal from "$lib/components/EditModal.svelte";
|
|
import MoreFieldsInput from "$lib/components/CreateNewAdventure.svelte";
|
|
import {
|
|
saveAdventure,
|
|
removeAdventure,
|
|
addAdventure,
|
|
} from "../../services/adventureService.js";
|
|
import SucessToast from "$lib/components/SucessToast.svelte";
|
|
import mapDrawing from "$lib/assets/adventure_map.svg";
|
|
export let data;
|
|
let plans: Adventure[] = [];
|
|
let isLoading = true;
|
|
|
|
onMount(async () => {
|
|
console.log(data);
|
|
plans = data.result;
|
|
isLoading = false;
|
|
});
|
|
|
|
let isShowingMoreFields: boolean = false;
|
|
|
|
let isShowingToast: boolean = false;
|
|
let toastAction: string = "";
|
|
|
|
let adventureToEdit: Adventure | undefined;
|
|
|
|
console.log(data);
|
|
|
|
function showToast(action: string) {
|
|
toastAction = action;
|
|
isShowingToast = true;
|
|
|
|
setTimeout(() => {
|
|
isShowingToast = false;
|
|
toastAction = "";
|
|
}, 3000);
|
|
}
|
|
|
|
function editPlan(event: { detail: number }) {
|
|
const adventure = plans.find((adventure) => adventure.id === event.detail);
|
|
if (adventure) {
|
|
adventureToEdit = adventure;
|
|
}
|
|
}
|
|
|
|
function handleClose() {
|
|
adventureToEdit = undefined;
|
|
isShowingMoreFields = false;
|
|
}
|
|
|
|
async function savePlan(event: { detail: Adventure }) {
|
|
let newArray = await saveAdventure(event.detail, plans);
|
|
if (newArray.length > 0) {
|
|
plans = newArray;
|
|
showToast("Adventure updated successfully!");
|
|
} else {
|
|
showToast("Failed to update adventure");
|
|
}
|
|
adventureToEdit = undefined;
|
|
}
|
|
|
|
async function remove(event: { detail: number }) {
|
|
let initialLength: number = plans.length;
|
|
let theAdventure = plans.find((adventure) => adventure.id === event.detail);
|
|
if (theAdventure) {
|
|
let newArray = await removeAdventure(theAdventure, plans);
|
|
if (newArray.length === initialLength - 1) {
|
|
plans = newArray;
|
|
showToast("Adventure removed successfully!");
|
|
} else {
|
|
showToast("Failed to remove adventure");
|
|
}
|
|
}
|
|
}
|
|
|
|
const createNewAdventure = async (event: { detail: Adventure }) => {
|
|
isShowingMoreFields = false;
|
|
let newArray = await addAdventure(event.detail, plans);
|
|
if (newArray.length > 0) {
|
|
plans = newArray;
|
|
showToast("Adventure added successfully!");
|
|
} else {
|
|
showToast("Failed to add adventure");
|
|
}
|
|
};
|
|
</script>
|
|
|
|
{#if isShowingToast}
|
|
<SucessToast action={toastAction} />
|
|
{/if}
|
|
|
|
<div class="flex justify-center items-center w-full mt-4 mb-4">
|
|
<article class="prose">
|
|
<h2 class="text-center">Add new Plan</h2>
|
|
</article>
|
|
</div>
|
|
|
|
<div class="flex flex-row items-center justify-center gap-4">
|
|
<button
|
|
type="button"
|
|
class="btn btn-secondary"
|
|
on:click={() => (isShowingMoreFields = !isShowingMoreFields)}
|
|
>
|
|
<iconify-icon icon="mdi:plus" class="text-2xl"></iconify-icon>
|
|
</button>
|
|
</div>
|
|
{#if plans.length != 0}
|
|
<div class="flex justify-center items-center w-full mt-4 mb-4">
|
|
<article class="prose">
|
|
<h1 class="text-center">My Adventure Plans</h1>
|
|
</article>
|
|
</div>
|
|
{/if}
|
|
|
|
{#if isLoading}
|
|
<div class="flex justify-center items-center w-full mt-16">
|
|
<span class="loading loading-spinner w-24 h-24"></span>
|
|
</div>
|
|
{/if}
|
|
|
|
<div
|
|
class="grid xl:grid-cols-3 lg:grid-cols-3 md:grid-cols-2 sm:grid-cols-1 gap-4 mt-4 content-center auto-cols-auto ml-6 mr-6"
|
|
>
|
|
{#each plans as adventure (adventure.id)}
|
|
<AdventureCard
|
|
{adventure}
|
|
type="planner"
|
|
on:edit={editPlan}
|
|
on:remove={remove}
|
|
/>
|
|
{/each}
|
|
</div>
|
|
|
|
{#if plans.length == 0 && !isLoading}
|
|
<div class="flex flex-col items-center justify-center mt-16">
|
|
<article class="prose mb-4"><h2>Add some plans!</h2></article>
|
|
<img src={mapDrawing} width="25%" alt="Logo" />
|
|
</div>
|
|
{/if}
|
|
|
|
{#if adventureToEdit && adventureToEdit.id != undefined}
|
|
<EditModal bind:adventureToEdit on:submit={savePlan} on:close={handleClose} />
|
|
{/if}
|
|
|
|
{#if isShowingMoreFields}
|
|
<MoreFieldsInput
|
|
on:create={createNewAdventure}
|
|
on:close={handleClose}
|
|
type="planner"
|
|
/>
|
|
{/if}
|