From 6e4edd96ce93183a5f959252b291aeacf0ccabeb Mon Sep 17 00:00:00 2001 From: aarbit Date: Mon, 18 May 2026 16:31:00 -0500 Subject: [PATCH] Allows for editing Hunt details --- src/lib/api/index.ts | 3 + src/lib/components/DateTimePicker.svelte | 20 ++++-- src/routes/admin/HuntManage.svelte | 91 +++++++++++++++++++++++- 3 files changed, 106 insertions(+), 8 deletions(-) diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index a4524f2..913b821 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -35,6 +35,9 @@ export const apiGetAllHunts = (status?: 'UNSTARTED' | 'ONGOING' | 'CLOSED') => export const apiCreateHunt = (title: string, startDateTime: string, endDateTime: string) => client.post('/hunt', { title, startDateTime, endDateTime }) +export const apiUpdateHunt = (huntId: string, title: string, startDateTime: string, endDateTime: string, isTerminated: boolean) => + client.patch(`/hunt/${huntId}`, { title, startDateTime, endDateTime, isTerminated }) + // ── Hunter ──────────────────────────────────────────────────────────────────── export const apiGetOngoingHunts = () => diff --git a/src/lib/components/DateTimePicker.svelte b/src/lib/components/DateTimePicker.svelte index 2a73868..c806ddb 100644 --- a/src/lib/components/DateTimePicker.svelte +++ b/src/lib/components/DateTimePicker.svelte @@ -4,9 +4,11 @@ let { value = $bindable(''), defaultTimeIndex = 36, + initialValue = '', }: { value?: string defaultTimeIndex?: number + initialValue?: string } = $props() const months = [ @@ -25,11 +27,19 @@ return { value: i, label: `${displayHour}:${minute.toString().padStart(2, '0')} ${ampm}` } }) - const today = new Date() - let month = $state(today.getMonth()) - let day = $state(today.getDate()) - let year = $state(today.getFullYear()) - let timeIndex = $state(untrack(() => defaultTimeIndex)) + const seed = untrack(() => { + if (initialValue) { + const d = new Date(initialValue) + return { month: d.getMonth(), day: d.getDate(), year: d.getFullYear(), timeIndex: d.getHours() * 4 + Math.round(d.getMinutes() / 15) } + } + const today = new Date() + return { month: today.getMonth(), day: today.getDate(), year: today.getFullYear(), timeIndex: defaultTimeIndex } + }) + + let month = $state(seed.month) + let day = $state(seed.day) + let year = $state(seed.year) + let timeIndex = $state(seed.timeIndex) const daysInMonth = $derived(new Date(year, month + 1, 0).getDate()) diff --git a/src/routes/admin/HuntManage.svelte b/src/routes/admin/HuntManage.svelte index f155d62..73cc4be 100644 --- a/src/routes/admin/HuntManage.svelte +++ b/src/routes/admin/HuntManage.svelte @@ -8,11 +8,13 @@ apiGetHunt, apiGetItems, apiListTeams, + apiUpdateHunt, apiUpdateItem } from '../../lib/api/index' import type {HuntResponse, ItemResponse, TeamResponse} from '../../lib/api/types' import StatusBadge from '../../lib/components/StatusBadge.svelte' import LoadingSpinner from '../../lib/components/LoadingSpinner.svelte' + import DateTimePicker from '../../lib/components/DateTimePicker.svelte' let { params }: { params: { huntId: string } } = $props() @@ -34,6 +36,40 @@ let newTeamName = $state('') let addingTeam = $state(false) + let editingHunt = $state(false) + let editTitle = $state('') + let editStart = $state('') + let editEnd = $state('') + let editTerminated = $state(false) + let savingHunt = $state(false) + + function startEditHunt() { + if (!hunt) return + editTitle = hunt.title + editStart = hunt.startDateTime + editEnd = hunt.endDateTime + editTerminated = hunt.isTerminated + editingHunt = true + } + + function cancelEditHunt() { + editingHunt = false + } + + async function saveHunt() { + if (!hunt || !editTitle.trim() || !editStart || !editEnd) return + savingHunt = true + error = '' + try { + hunt = await apiUpdateHunt(params.huntId, editTitle.trim(), editStart, editEnd, editTerminated) + editingHunt = false + } catch (e: unknown) { + error = e instanceof Error ? e.message : 'Failed to update hunt' + } finally { + savingHunt = false + } + } + let editingItemId = $state(null) let editName = $state('') let editPoints = $state(0) @@ -127,18 +163,67 @@
-
+
{#if hunt} -

{hunt.title}

+

{hunt.title}

{/if}
+ {#if hunt && !editingHunt} + + {/if}
+ {#if editingHunt && hunt} +
+

Edit Hunt

+ {#if error} +
{error}
+ {/if} + +
+ Start + +
+
+ End + +
+ +
+ + +
+
+ {/if} + {#if loading} {:else} - {#if error} + {#if error && !editingHunt}
{error}
{/if}