diff options
| author | Leonardo Bishop <me@leonardobishop.com> | 2025-08-23 22:29:28 +0100 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.com> | 2025-08-23 22:29:28 +0100 |
| commit | ecc6a55aba7bb35fc778e7a53848396b88214151 (patch) | |
| tree | 1b37a2dc5f4594155114da1ae0c4529d20a4c548 /web/composables | |
| parent | 8f7dec8ba6b2f9bde01afd0a110596ebbd43e0ed (diff) | |
Add multiple conferences feature
Diffstat (limited to 'web/composables')
| -rw-r--r-- | web/composables/api.ts | 14 | ||||
| -rw-r--r-- | web/composables/expire-auth.ts | 8 | ||||
| -rw-r--r-- | web/composables/fetch-favourites.ts | 36 | ||||
| -rw-r--r-- | web/composables/fetch-login.ts | 6 | ||||
| -rw-r--r-- | web/composables/fetch-schedule.ts | 57 | ||||
| -rw-r--r-- | web/composables/logout.ts | 15 |
6 files changed, 93 insertions, 43 deletions
diff --git a/web/composables/api.ts b/web/composables/api.ts new file mode 100644 index 0000000..7881aff --- /dev/null +++ b/web/composables/api.ts @@ -0,0 +1,14 @@ +export function $api<T>( + request: Parameters<typeof $fetch<T>>[0], + opts?: Parameters<typeof $fetch<T>>[1], +) { + const authStore = useAuthStore() + + return $fetch<T>(request, { + ...opts, + headers: { + Authorization: authStore.isLoggedIn() ? `Bearer ${authStore.token}` : '', + ...opts?.headers, + }, + }) +} diff --git a/web/composables/expire-auth.ts b/web/composables/expire-auth.ts new file mode 100644 index 0000000..b0e277e --- /dev/null +++ b/web/composables/expire-auth.ts @@ -0,0 +1,8 @@ +export function expireAuth() { + const authStore = useAuthStore() + + authStore.admin = false; + authStore.username = null; + authStore.token = null; + navigateTo({ path: '/login', state: { error: 'Sorry, your session has expired' } }); +}
\ No newline at end of file diff --git a/web/composables/fetch-favourites.ts b/web/composables/fetch-favourites.ts index e586d5b..965120d 100644 --- a/web/composables/fetch-favourites.ts +++ b/web/composables/fetch-favourites.ts @@ -1,23 +1,21 @@ export default function() { - const favouritesStore = useFavouritesStore(); - const errorStore = useErrorStore(); - const config = useRuntimeConfig(); - - favouritesStore.setStatus('pending') + const conferenceStore = useConferenceStore() + const favouritesStore = useFavouritesStore(); + const errorStore = useErrorStore(); + const config = useRuntimeConfig(); + + favouritesStore.status = 'pending' - useFetch(config.public.baseURL + '/favourites', { - method: 'GET', - server: false, - lazy: true, - onResponseError: ({ response }) => { - favouritesStore.setStatus('idle') + return $api(config.public.baseURL + '/favourites/' + conferenceStore.id, { + method: 'GET', + onResponse: ({ response }) => { + favouritesStore.status = 'idle' + if (!response.ok) { errorStore.setError(response._data.message || 'An unknown error occurred'); - }, - onResponse: ({ response }) => { - if (response._data) { - favouritesStore.setFavourites((response._data as any).data); - } - favouritesStore.setStatus('idle') - }, - }); + } + if (response._data) { + favouritesStore.setFavourites((response._data as any).data); + } + }, + }); }
\ No newline at end of file diff --git a/web/composables/fetch-login.ts b/web/composables/fetch-login.ts index 707a04f..b0b04ba 100644 --- a/web/composables/fetch-login.ts +++ b/web/composables/fetch-login.ts @@ -5,7 +5,7 @@ export default function() { const errorStore = useErrorStore(); const config = useRuntimeConfig(); - loginOptionsStore.setStatus('pending') + loginOptionsStore.status = 'pending' $fetch(config.public.baseURL + '/login', { method: 'GET', @@ -17,8 +17,8 @@ export default function() { } if (response._data) { - loginOptionsStore.setLoginOptions((response._data as any).data.options); - loginOptionsStore.setStatus('idle') + loginOptionsStore.loginOptions = (response._data as any).data.options; + loginOptionsStore.status = 'idle' } }, }); diff --git a/web/composables/fetch-schedule.ts b/web/composables/fetch-schedule.ts index a0e6fec..5e91954 100644 --- a/web/composables/fetch-schedule.ts +++ b/web/composables/fetch-schedule.ts @@ -1,24 +1,39 @@ -export default function() { - const scheduleStore = useScheduleStore(); - const errorStore = useErrorStore(); - const config = useRuntimeConfig(); - - useFetch(config.public.baseURL + '/schedule', { - method: 'GET', - server: false, - lazy: true, - onResponse: ({ response }) => { - if (!response.ok) { - if (response.status === 401) { - navigateTo({ path: '/login', state: { error: 'Sorry, your session has expired' } }); - } else { - errorStore.setError(response._data.message || 'An unknown error occurred'); - } - } +import { useConferenceStore } from "~/stores/conference"; +import { expireAuth } from "./expire-auth"; + +export default async function() { + const conferenceStore = useConferenceStore() + const scheduleStore = useScheduleStore(); + const errorStore = useErrorStore(); + const config = useRuntimeConfig(); - if (response._data) { - scheduleStore.setSchedule((response._data as any).data.schedule); + scheduleStore.status = 'pending' + + return $api(config.public.baseURL + '/conference/' + conferenceStore.id, { + method: 'GET', + onResponse: ({ response }) => { + if (!response.ok) { + if (response.status === 401) { + expireAuth() + return + } else { + errorStore.setError(response._data.message || 'An unknown error occurred'); } - }, - }); + } + + if (response._data) { + let schedule = (response._data as any).data.schedule + scheduleStore.setSchedule(schedule); + + conferenceStore.venue = schedule.conference.venue + conferenceStore.title = schedule.conference.title + conferenceStore.city = schedule.conference.city + + scheduleStore.status = 'idle' + } + }, + }).catch(() => { + // todo do this better + errorStore.setError('An unknown error occurred'); + }); }
\ No newline at end of file diff --git a/web/composables/logout.ts b/web/composables/logout.ts new file mode 100644 index 0000000..35b0511 --- /dev/null +++ b/web/composables/logout.ts @@ -0,0 +1,15 @@ +export function logout() { + const authStore = useAuthStore() + const conferenceStore = useConferenceStore() + const config = useRuntimeConfig(); + + $api(config.public.baseURL + '/logout', { method: 'POST' }).finally(() => { + authStore.admin = false; + authStore.username = null; + authStore.token = null; + + conferenceStore.clear() + + navigateTo({ path: '/login', state: { error: 'You have logged out' } }); + }) +}
\ No newline at end of file |
