From 6dcb92bdd89d69560ba8fb7dbedd207cef8a1337 Mon Sep 17 00:00:00 2001 From: Valentyne Stigloher Date: Sun, 19 Jan 2025 22:47:19 +0100 Subject: [PATCH] (nuxt) dynamically load calendar events --- components/CalendarBanner.vue | 41 +++++++++++-------------- components/Logo.vue | 7 ++--- components/Profile.vue | 6 ++-- components/TermsDictionary.vue | 5 ++- nuxt.config.ts | 15 +++++++-- pages/calendar/[[year]].vue | 5 ++- pages/calendar/[year]-[month]-[day].vue | 5 ++- pages/profile/editor.vue | 5 ++- server/api/search.get.ts | 7 ++--- server/calendar.ts | 5 +-- server/data.ts | 14 +++++++++ server/express/calendar.ts | 16 ++++++---- src/calendar/calendar.ts | 18 +++-------- src/data.ts | 15 +++++++++ types/virtual.d.ts | 6 ++++ 15 files changed, 97 insertions(+), 73 deletions(-) create mode 100644 types/virtual.d.ts diff --git a/components/CalendarBanner.vue b/components/CalendarBanner.vue index f340b58f1..c6fe894a8 100644 --- a/components/CalendarBanner.vue +++ b/components/CalendarBanner.vue @@ -1,3 +1,21 @@ + + - - diff --git a/components/Logo.vue b/components/Logo.vue index eba9aa0a6..2ee9fcf57 100644 --- a/components/Logo.vue +++ b/components/Logo.vue @@ -25,8 +25,8 @@ import { storeToRefs } from 'pinia'; import { defineComponent } from 'vue'; import logoSvg from '../public/logo/logo.svg?raw'; -import { buildCalendar } from '../src/calendar/calendar.ts'; import { Day } from '../src/calendar/helpers.ts'; +import { loadCalendar } from '../src/data.ts'; import { ImmutableArray } from '../src/helpers.ts'; import { useMainStore } from '../store/index.ts'; @@ -47,8 +47,7 @@ export default defineComponent({ day: { default: () => Day.today(), type: Day }, }, async setup() { - const runtimeConfig = useRuntimeConfig(); - + const calendarPromise = loadCalendar(); const { data: stats } = await useFetch<{ overall: { users: number } }>( '/api/admin/stats-public', { lazy: true }, @@ -57,7 +56,7 @@ export default defineComponent({ return { stats, selectedDay: storeToRefs(useMainStore()).selectedDay, - calendar: buildCalendar(runtimeConfig.public.baseUrl), + calendar: await calendarPromise, }; }, data(): Data { diff --git a/components/Profile.vue b/components/Profile.vue index 89e1ebd56..526ea2b4b 100644 --- a/components/Profile.vue +++ b/components/Profile.vue @@ -4,9 +4,8 @@ import { useNuxtApp } from 'nuxt/app'; import useConfig from '~/composables/useConfig.ts'; import useMainPronoun from '~/composables/useMainPronoun.ts'; import useSpelling from '~/composables/useSpelling.ts'; -import { buildCalendar } from '~/src/calendar/calendar.ts'; import type { TermsEntryRaw } from '~/src/classes.ts'; -import { loadPronounLibrary } from '~/src/data.ts'; +import { loadCalendar, loadPronounLibrary } from '~/src/data.ts'; import { buildFlags } from '~/src/flags.ts'; import { buildImageUrl } from '~/src/helpers.ts'; import type { Profile, UserWithProfiles } from '~/src/profile.ts'; @@ -24,7 +23,6 @@ const props = withDefaults(defineProps<{ const { $translator: translator } = useNuxtApp(); const { convertName } = useSpelling(); const config = useConfig(); -const runtimeConfig = useRuntimeConfig(); const pronounLibrary = await loadPronounLibrary(config); @@ -40,7 +38,7 @@ const normaliseUrl = (url: string): string | null => { const allFlags = buildFlags(config.locale); const minAge = config.ageLimit || 13; -const year = buildCalendar(runtimeConfig.public.baseUrl).getCurrentYear(); +const year = (await loadCalendar()).getCurrentYear(); const countFlags = computed(() => { return (props.profile.flags?.length ?? 0) + (props.profile.customFlags?.length ?? 0); diff --git a/components/TermsDictionary.vue b/components/TermsDictionary.vue index 36ee91708..7170b6aef 100644 --- a/components/TermsDictionary.vue +++ b/components/TermsDictionary.vue @@ -3,9 +3,9 @@ import type { ComponentExposed } from 'vue-component-type-helpers'; import type Table from '~/components/Table.vue'; import type TermsSubmitForm from '~/components/TermsSubmitForm.vue'; -import { buildCalendar } from '~/src/calendar/calendar.ts'; import { TermsEntry } from '~/src/classes.ts'; import type { TermsEntryRaw } from '~/src/classes.ts'; +import { loadCalendar } from '~/src/data.ts'; import { buildDict, clearLinkedText } from '~/src/helpers.ts'; const props = defineProps<{ @@ -13,7 +13,6 @@ const props = defineProps<{ }>(); const { $translator: translator } = useNuxtApp(); -const runtimeConfig = useRuntimeConfig(); const config = useConfig(); const filter = useFilterWithCategory(); @@ -108,7 +107,7 @@ const remove = async (entry: TermsEntry): Promise => { delete entries.value[entry.id]; }; -const year = buildCalendar(runtimeConfig.public.baseUrl).getCurrentYear()!; +const year = (await loadCalendar()).getCurrentYear()!;