feat: Implement announcements (#1204)

* feat: Implement announcements

Fixes #1203

* Remove unnecessary code

* Fix new announcement test

* Update web/app/src/views/Home.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove useless garbage

* Require announcement timestamp

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
TwiN
2025-08-16 09:54:50 -04:00
committed by GitHub
parent 609a634df3
commit 131447f702
12 changed files with 560 additions and 51 deletions

View File

@@ -92,7 +92,7 @@
<!-- Main Content -->
<main class="relative">
<router-view @showTooltip="showTooltip" />
<router-view @showTooltip="showTooltip" :announcements="announcements" />
</main>
<!-- Footer -->
@@ -154,7 +154,7 @@
<script setup>
/* eslint-disable no-undef */
import { ref, computed, onMounted } from 'vue'
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { useRoute } from 'vue-router'
import { Menu, X, LogIn } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
@@ -169,9 +169,11 @@ const route = useRoute()
// State
const retrievedConfig = ref(false)
const config = ref({ oidc: false, authenticated: true })
const announcements = ref([])
const tooltip = ref({})
const mobileMenuOpen = ref(false)
const isOidcLoading = ref(false)
let configInterval = null
// Computed properties
const logo = computed(() => {
@@ -199,6 +201,7 @@ const fetchConfig = async () => {
if (response.status === 200) {
const data = await response.json()
config.value = data
announcements.value = data.announcements || []
}
} catch (error) {
console.error('Failed to fetch config:', error)
@@ -210,8 +213,18 @@ const showTooltip = (result, event) => {
tooltip.value = { result, event }
}
// Fetch config on mount
// Fetch config on mount and set up interval
onMounted(() => {
fetchConfig()
// Refresh config every 10 minutes for announcements
configInterval = setInterval(fetchConfig, 600000)
})
// Clean up interval on unmount
onUnmounted(() => {
if (configInterval) {
clearInterval(configInterval)
configInterval = null
}
})
</script>