diff --git a/src/lib/api/events.ts b/src/lib/api/events.ts index 57a717c..18ebe9a 100644 --- a/src/lib/api/events.ts +++ b/src/lib/api/events.ts @@ -4,6 +4,8 @@ export type EventCreateRequestData = { name: string; choices: string[]; electoral_system: string; + allow_registration?: boolean; + allow_voting?: boolean; }; export type EventStatus = 'RE' | 'VO' | 'CL'; @@ -12,16 +14,23 @@ export type EventResponseData = { id: number; name: string; choices: string[]; - status: EventStatus; + allow_registration: boolean; + allow_voting: boolean; electoral_system: string; share_token: string; show_results: boolean; + closed: null | string; }; export type EventCreateResponseData = EventResponseData & { host_token: string; }; +export type EventUpdateBody = { + allow_registration?: boolean; + allow_voting?: boolean; +}; + export type BallotResponseData = { id: number; voter_name: string; @@ -47,7 +56,9 @@ export class EventsAPI extends BaseAPI { }; closeEvent = async (eventID: number, host_token: string) => { - return this.post(`/${eventID}/close`, null, { 'X-API-Key': host_token }); + return this.post(`/${eventID}/close`, null, { 'X-API-Key': host_token }) as Promise<{ + closed: string; + }>; }; openEvent = async (eventID: number, host_token: string) => { @@ -72,14 +83,10 @@ export class EventsAPI extends BaseAPI { }) as Promise; }; - updateStatus = async (eventID: number, token: string, status: EventStatus) => { - return this.patch( - `/${eventID}/update-status`, - { status }, - { - 'X-API-Key': token - } - ); + update = async (eventID: number, token: string, body: EventUpdateBody) => { + return this.patch(`/${eventID}/update`, body, { + 'X-API-Key': token + }) as Promise; }; } diff --git a/src/lib/components/EventForm.svelte b/src/lib/components/EventForm.svelte index 86d03b5..66eb524 100644 --- a/src/lib/components/EventForm.svelte +++ b/src/lib/components/EventForm.svelte @@ -40,7 +40,8 @@ const response = await api.createEvent({ name: eventName, choices: dishes, - electoral_system: votingSystem + electoral_system: votingSystem, + allow_registration: true }); storage.saveEvent(response.id, response.name, response.host_token); diff --git a/src/lib/components/SavedBallotList.svelte b/src/lib/components/SavedBallotList.svelte index bf4c2dc..090fb90 100644 --- a/src/lib/components/SavedBallotList.svelte +++ b/src/lib/components/SavedBallotList.svelte @@ -33,7 +33,7 @@ eventName: response.name, eventID: localBallots[keyAsNumber].eventID, id: keyAsNumber, - state: response.status == 'CL' ? 'closed' : 'open' + state: response.closed ? 'closed' : 'open' }); } catch (e) { const status = (e as APIError).status; diff --git a/src/lib/components/SavedEventList.svelte b/src/lib/components/SavedEventList.svelte index 2b6ca3b..ae6491c 100644 --- a/src/lib/components/SavedEventList.svelte +++ b/src/lib/components/SavedEventList.svelte @@ -31,7 +31,7 @@ events.push({ name: localEvents[keyAsNumber].name, id: keyAsNumber, - state: event.status === 'CL' ? 'closed' : 'open' + state: event.closed ? 'closed' : 'open' }); } catch (e) { const status = (e as APIError).status; diff --git a/src/routes/event/[id=eventID]/+page.svelte b/src/routes/event/[id=eventID]/+page.svelte index a9c433a..dd7475a 100644 --- a/src/routes/event/[id=eventID]/+page.svelte +++ b/src/routes/event/[id=eventID]/+page.svelte @@ -38,12 +38,12 @@
- {#if event?.status == 'RE'} + {#if event?.closed} + + {:else if event?.allow_registration == true && event?.allow_voting == false} - {:else if event?.status == 'VO'} + {:else if event?.allow_voting == true} - {:else if event?.status == 'CL'} - {:else} Loading... {/if} diff --git a/src/routes/event/[id=eventID]/ballot/[ballotID=eventID]/+page.svelte b/src/routes/event/[id=eventID]/ballot/[ballotID=eventID]/+page.svelte index 2b0c036..3e4d8bf 100644 --- a/src/routes/event/[id=eventID]/ballot/[ballotID=eventID]/+page.svelte +++ b/src/routes/event/[id=eventID]/ballot/[ballotID=eventID]/+page.svelte @@ -43,14 +43,14 @@
- {#if ballot && event?.status == 'RE'} + {#if ballot && event?.allow_registration == true && event?.allow_voting == false} {event.name}

Thanks for registering for {event.name}. Sit tight and wait for the event to start.

- {:else if ballot && event?.status == 'VO'} + {:else if ballot && event?.allow_registration == false && event?.allow_voting == true} - {:else if ballot && event?.status == 'CL'} + {:else if ballot && event?.closed} {:else} Loading... diff --git a/src/routes/event/[id=eventID]/components/registration.svelte b/src/routes/event/[id=eventID]/components/registration.svelte index 8a80162..f5fc236 100644 --- a/src/routes/event/[id=eventID]/components/registration.svelte +++ b/src/routes/event/[id=eventID]/components/registration.svelte @@ -7,7 +7,7 @@ import { Button, Heading, P } from 'flowbite-svelte'; import { ClipboardCheckOutline, ClipboardCleanOutline } from 'flowbite-svelte-icons'; - const { + let { event = $bindable(), ballots }: { @@ -39,8 +39,10 @@ const beginVote = async () => { const api = new EventsAPI(); - await api.updateStatus(event.id, storage.getEvent(event.id).token, 'VO'); - event.status = 'VO'; + event = await api.update(event.id, storage.getEvent(event.id).token, { + allow_registration: false, + allow_voting: true + }); }; diff --git a/src/routes/event/[id=eventID]/components/voting.svelte b/src/routes/event/[id=eventID]/components/voting.svelte index 9be588a..28dcf97 100644 --- a/src/routes/event/[id=eventID]/components/voting.svelte +++ b/src/routes/event/[id=eventID]/components/voting.svelte @@ -4,7 +4,7 @@ import { getStorageContext } from '$lib/storage/storage'; import { Button, Heading, P } from 'flowbite-svelte'; - const { + let { event = $bindable(), ballots }: { event: EventResponseData; ballots: BallotResponseData[] | null } = $props(); @@ -23,8 +23,8 @@ const closeVoting = async () => { const api = new EventsAPI(); - await api.updateStatus(event.id, storage.getEvent(event.id).token, 'CL'); - event.status = 'CL'; + const response = await api.closeEvent(event.id, storage.getEvent(event.id).token); + event.closed = response.closed; };