fix: show immediate full-screen loader during route navigation

This commit is contained in:
Ruslan Bakiev
2026-03-14 11:01:53 +07:00
parent b7f452cdd1
commit ebe72907a4
2 changed files with 72 additions and 1 deletions

View File

@@ -0,0 +1,41 @@
export default defineNuxtPlugin((nuxtApp) => {
const routeLoading = useState<boolean>('route-loading', () => false)
let hideTimer: ReturnType<typeof setTimeout> | null = null
const show = () => {
if (hideTimer) {
clearTimeout(hideTimer)
hideTimer = null
}
routeLoading.value = true
}
const hide = () => {
if (hideTimer) {
clearTimeout(hideTimer)
}
// Small delay to prevent flicker on very fast routes.
hideTimer = setTimeout(() => {
routeLoading.value = false
hideTimer = null
}, 120)
}
nuxtApp.$router.beforeEach((_to, _from, next) => {
show()
next()
})
nuxtApp.$router.afterEach(() => {
hide()
})
nuxtApp.$router.onError(() => {
hide()
})
nuxtApp.hook('page:finish', () => {
hide()
})
})