From 4542f41243d0fbdd6e52fc683213f286e4439697 Mon Sep 17 00:00:00 2001 From: Pandipipas <62224708+Pandipipas@users.noreply.github.com> Date: Wed, 18 Feb 2026 12:25:26 +0100 Subject: [PATCH] perf: lazy-load scoreboard flag assets --- src/graphics/scoreboard/main.vue | 54 +++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/graphics/scoreboard/main.vue b/src/graphics/scoreboard/main.vue index a17d9f4..fc09ca3 100644 --- a/src/graphics/scoreboard/main.vue +++ b/src/graphics/scoreboard/main.vue @@ -48,35 +48,51 @@ const leftTeam = computed(() => scoreboard.value.leftTeamOverride || ''); const rightTeam = computed(() => scoreboard.value.rightTeamOverride || ''); const flagModules = import.meta.glob('/node_modules/flag-icons/flags/4x3/*.svg', { - eager: true, import: 'default', query: '?url', -}) as Record; +}) as Record Promise>; -const flagByCode = Object.fromEntries( - Object.entries(flagModules) - .map(([path, url]) => { - const filename = path.split('/').pop(); - const code = filename?.replace('.svg', ''); - if (!code) { - return null; - } - return [code.toLowerCase(), url] as const; - }) - .filter((entry): entry is readonly [string, string] => Boolean(entry)), -); +const flagUrlCache: Record = {}; -const getFlagUrl = (country: string | undefined) => { - const code = resolveCountryCode(country); +const leftFlagUrl = ref(''); +const rightFlagUrl = ref(''); + +const loadFlagUrl = async (country: string | undefined) => { + const code = resolveCountryCode(country)?.toLowerCase(); if (!code) { return ''; } - return flagByCode[code.toLowerCase()] ?? ''; + + const cached = flagUrlCache[code]; + if (cached) { + return cached; + } + + const moduleLoader = flagModules[`/node_modules/flag-icons/flags/4x3/${code}.svg`]; + if (!moduleLoader) { + return ''; + } + + const url = await moduleLoader(); + flagUrlCache[code] = url; + return url; }; -const leftFlagUrl = computed(() => getFlagUrl(scoreboard.value.leftCountryOverride)); +watch( + () => scoreboard.value.leftCountryOverride, + async (country) => { + leftFlagUrl.value = await loadFlagUrl(country); + }, + { immediate: true }, +); -const rightFlagUrl = computed(() => getFlagUrl(scoreboard.value.rightCountryOverride)); +watch( + () => scoreboard.value.rightCountryOverride, + async (country) => { + rightFlagUrl.value = await loadFlagUrl(country); + }, + { immediate: true }, +); const roundText = computed(() => scoreboard.value.round || 'Round');