2026-02-24 11:12:26 +07:00
|
|
|
<script setup lang="ts">
|
|
|
|
|
/**
|
|
|
|
|
* @file app.vue
|
|
|
|
|
* @description Root application component.
|
|
|
|
|
* Handles initialization of authentication and theme settings.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// Initialize composables
|
2026-01-14 15:15:31 +07:00
|
|
|
const { fetchUserProfile, isAuthenticated } = useAuth()
|
2026-02-24 11:12:26 +07:00
|
|
|
const { isDark, set: setTheme } = useThemeMode()
|
2026-01-14 15:15:31 +07:00
|
|
|
|
2026-02-24 11:12:26 +07:00
|
|
|
// App initialization logic
|
2026-01-14 15:15:31 +07:00
|
|
|
onMounted(() => {
|
2026-02-24 11:12:26 +07:00
|
|
|
// 1. Fetch user profile if tokens exist
|
2026-01-14 15:15:31 +07:00
|
|
|
if (isAuthenticated.value) {
|
|
|
|
|
fetchUserProfile()
|
|
|
|
|
}
|
2026-01-23 13:27:19 +07:00
|
|
|
|
2026-02-24 11:12:26 +07:00
|
|
|
// 2. Initialize theme from persistent storage or system preference
|
2026-01-23 13:27:19 +07:00
|
|
|
const savedTheme = localStorage.getItem('theme')
|
2026-02-24 11:12:26 +07:00
|
|
|
if (savedTheme) {
|
|
|
|
|
setTheme(savedTheme === 'dark')
|
|
|
|
|
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
|
|
|
setTheme(true)
|
2026-01-23 13:27:19 +07:00
|
|
|
}
|
2026-01-14 15:15:31 +07:00
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
|
2026-01-13 10:46:40 +07:00
|
|
|
<template>
|
2026-01-23 09:54:35 +07:00
|
|
|
<!-- แสดง Loader ระหว่างเปลี่ยนหน้า หรือโหลดข้อมูล -->
|
2026-01-13 12:55:21 +07:00
|
|
|
<GlobalLoader />
|
2026-01-23 09:54:35 +07:00
|
|
|
|
|
|
|
|
<!-- NuxtLayout: แสดง Layout ที่กำหนดในแต่ละเพจ (default: layouts/default.vue) -->
|
2026-01-13 10:46:40 +07:00
|
|
|
<NuxtLayout>
|
2026-01-23 09:54:35 +07:00
|
|
|
<!-- NuxtPage: แสดงเนื้อหาของเพจปัจจุบัน (ตาม URL routng) -->
|
2026-01-13 10:46:40 +07:00
|
|
|
<NuxtPage />
|
|
|
|
|
</NuxtLayout>
|
|
|
|
|
</template>
|