Files
vtuber-awards/frontend/src/views/admin/AdminSettingsView.vue
T
2026-06-26 18:09:29 +02:00

126 lines
4.0 KiB
Vue

<script setup lang="ts">
import { Settings } from '@lucide/vue'
import { computed, onBeforeUnmount, onMounted } from 'vue'
import { onBeforeRouteLeave } from 'vue-router'
import AdminOperationalSettingsCard from '../../components/admin/AdminOperationalSettingsCard.vue'
import AdminPageHeader from '../../components/admin/AdminPageHeader.vue'
import AdminSeasonToolbar from '../../components/admin/AdminSeasonToolbar.vue'
import AdminSettingsDatabaseCard from '../../components/admin/AdminSettingsDatabaseCard.vue'
import AdminSettingsOverviewBoard from '../../components/admin/AdminSettingsOverviewBoard.vue'
import { watchAdminErrorToast, watchAdminToast } from '../../composables/useAdminToast'
import { useAuthStore } from '../../stores/auth'
import { useAdminOperationalSettings } from '../../components/admin/useAdminOperationalSettings'
import { useAdminSettingsOverview } from '../../components/admin/useAdminSettingsOverview'
const authStore = useAuthStore()
const canManageOperationalSettings = computed(() => authStore.canManageOperationalSettings)
const {
healthLoading,
healthError,
databaseHealth,
pendingMigrationCount,
healthLoadedLabel,
contentChecks,
contentCompletion,
checks,
gates,
refreshDatabaseHealth,
} = useAdminSettingsOverview()
const {
operationalLoading,
operationalSaving,
operationalError,
operationalSuccess,
operationalForm,
demoPasswordSet,
demoManagedByDatabase,
demoPasswordInput,
twitchClientSecretSet,
twitchAuthConfigured,
twitchAuthManagedByDatabase,
twitchClientSecretInput,
demoPasswordHint,
twitchSecretHint,
demoCredentialsComplete,
twitchAuthComplete,
operationalSummary,
hasUnsavedOperationalChanges,
saveOperationalSettings,
} = useAdminOperationalSettings()
watchAdminToast(operationalSuccess, operationalError)
watchAdminErrorToast(healthError)
function confirmDiscardOperationalChanges() {
if (!hasUnsavedOperationalChanges.value) {
return true
}
return window.confirm('Du hast ungespeicherte Änderungen in Demo & Wartung. Änderungen verwerfen?')
}
function handleBeforeUnload(event: BeforeUnloadEvent) {
if (!hasUnsavedOperationalChanges.value) return
event.preventDefault()
event.returnValue = ''
}
onBeforeRouteLeave(() => confirmDiscardOperationalChanges())
onMounted(() => window.addEventListener('beforeunload', handleBeforeUnload))
onBeforeUnmount(() => window.removeEventListener('beforeunload', handleBeforeUnload))
</script>
<template>
<div class="space-y-6">
<AdminPageHeader
eyebrow="Einstellungen"
description="Demo-Zugang, Wartungsmodus und Healthchecks."
:icon="Settings"
/>
<AdminSeasonToolbar />
<AdminSettingsOverviewBoard
:checks="checks"
:gates="gates"
:content-checks="contentChecks"
:content-completion="contentCompletion"
/>
<AdminOperationalSettingsCard
v-model:demo-password="demoPasswordInput"
v-model:twitch-client-secret="twitchClientSecretInput"
:form="operationalForm"
:loading="operationalLoading"
:saving="operationalSaving"
:error="operationalError"
:success="operationalSuccess"
:demo-password-hint="demoPasswordHint"
:demo-password-set="demoPasswordSet"
:demo-managed-by-database="demoManagedByDatabase"
:demo-credentials-complete="demoCredentialsComplete"
:twitch-secret-hint="twitchSecretHint"
:twitch-client-secret-set="twitchClientSecretSet"
:twitch-auth-configured="twitchAuthConfigured"
:twitch-auth-managed-by-database="twitchAuthManagedByDatabase"
:twitch-auth-complete="twitchAuthComplete"
:summary="operationalSummary"
:dirty="hasUnsavedOperationalChanges"
:can-manage="canManageOperationalSettings"
@save="saveOperationalSettings"
/>
<AdminSettingsDatabaseCard
:health-loading="healthLoading"
:health-error="healthError"
:database-health="databaseHealth"
:pending-migration-count="pendingMigrationCount"
:health-loaded-label="healthLoadedLabel"
:refresh-database-health="refreshDatabaseHealth"
/>
</div>
</template>