diff --git a/webapp/src/App.vue b/webapp/src/App.vue index c66d55b..4a2480f 100644 --- a/webapp/src/App.vue +++ b/webapp/src/App.vue @@ -2,12 +2,15 @@ import { RouterView, useRouter } from 'vue-router' import { computed, ref, watch, onMounted } from 'vue' import { useTheme } from 'vuetify'; +import DiscordWarningDialog from '@/components/DiscordWarningDialog.vue'; +import { useDiscordIntercept } from '@/composables/useDiscordIntercept'; const theme = useTheme(); const router = useRouter(); const snackbar = ref({ show: false, text: '' }); const isDark = computed(() => theme.name.value === 'dark'); const isFullscreen = computed(() => router.currentRoute.value?.query.fullscreen === 'true'); +const { showDialog, discordUrl, interceptDiscordLinks } = useDiscordIntercept(); function toggleTheme() { const newTheme = theme.global.name.value === 'dark' ? 'light' : 'dark'; @@ -22,6 +25,10 @@ function toggleTheme() { } } +function handleDiscordProceed(url: string) { + window.open(url, '_blank'); +} + onMounted(() => { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { @@ -31,6 +38,7 @@ onMounted(() => { theme.global.name.value = prefersDark ? 'dark' : 'light'; localStorage.setItem('theme', theme.global.name.value); } + interceptDiscordLinks(); }); const items = [ @@ -153,6 +161,12 @@ watch(() => theme.global.name.value, (newTheme) => { + + diff --git a/webapp/src/components/DiscordWarningDialog.vue b/webapp/src/components/DiscordWarningDialog.vue new file mode 100644 index 0000000..4a3ad7c --- /dev/null +++ b/webapp/src/components/DiscordWarningDialog.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/webapp/src/composables/useDiscordIntercept.ts b/webapp/src/composables/useDiscordIntercept.ts new file mode 100644 index 0000000..728bcd2 --- /dev/null +++ b/webapp/src/composables/useDiscordIntercept.ts @@ -0,0 +1,26 @@ +import { ref } from 'vue'; + +export function useDiscordIntercept() { + const showDialog = ref(false); + const discordUrl = ref(''); + + function interceptDiscordLinks() { + document.addEventListener('click', (e) => { + const target = e.target as HTMLElement; + if (!target) return; + let link: HTMLAnchorElement | null = null; + if (target.tagName === 'A') { + link = target as HTMLAnchorElement; + } else { + link = target.closest('a'); + } + if (link && link.href && (link.href.includes('discord.gg') || link.href.includes('discord.com'))) { + e.preventDefault(); + discordUrl.value = link.href; + showDialog.value = true; + } + }, true); + } + + return { showDialog, discordUrl, interceptDiscordLinks }; +}