Applied browser fullscreen
This commit is contained in:
1 parent
e7bab2a95c
commit
ec69c85102
4 files changed
+72
-7
No files matched your search
@@ -1,5 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const fullscreen = useFullscreen()
|
const { fullscreen, close: closeFullscreen } = useFullscreen()
|
||||||
const song = useSong()
|
const song = useSong()
|
||||||
|
|
||||||
const mouseMovedRecently = ref(true)
|
const mouseMovedRecently = ref(true)
|
||||||
@@ -26,7 +26,7 @@ onMounted(() => {
|
|||||||
const nuxtApp = useNuxtApp()
|
const nuxtApp = useNuxtApp()
|
||||||
|
|
||||||
nuxtApp.hook("page:finish", () => {
|
nuxtApp.hook("page:finish", () => {
|
||||||
fullscreen.value = false
|
closeFullscreen()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ nuxtApp.hook("page:finish", () => {
|
|||||||
name="lucide:x"
|
name="lucide:x"
|
||||||
class="close-btn"
|
class="close-btn"
|
||||||
:class="{ show: mouseMovedRecently }"
|
:class="{ show: mouseMovedRecently }"
|
||||||
@click="fullscreen = false"
|
@click="closeFullscreen()"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="content-container" :class="{ lyrics: song.lyrics }">
|
<div class="content-container" :class="{ lyrics: song.lyrics }">
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const { animationDuration, offset, showScrollBar } = defineProps<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const song = useSong()
|
const song = useSong()
|
||||||
const fullscreen = useFullscreen()
|
const { fullscreen } = useFullscreen()
|
||||||
const { secondsPlayed } = usePlayer()
|
const { secondsPlayed } = usePlayer()
|
||||||
|
|
||||||
const parsedLyrics = computed(() => {
|
const parsedLyrics = computed(() => {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ const durationFormatted = computed(() =>
|
|||||||
)
|
)
|
||||||
|
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
const fullscreen = useFullscreen()
|
const { open: openFullscreen } = useFullscreen()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -107,7 +107,7 @@ const fullscreen = useFullscreen()
|
|||||||
name="lucide:list"
|
name="lucide:list"
|
||||||
@click="toast.show('Not yet implemented')"
|
@click="toast.show('Not yet implemented')"
|
||||||
/>
|
/>
|
||||||
<Icon name="lucide:expand" @click="fullscreen = true" />
|
<Icon name="lucide:expand" @click="openFullscreen()" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
@@ -1 +1,66 @@
|
|||||||
export const useFullscreen = () => useState<boolean>("fullscreen", () => false)
|
type FullscreenState = ReturnType<typeof useState<boolean>>
|
||||||
|
|
||||||
|
type FullscreenControls = {
|
||||||
|
fullscreen: FullscreenState
|
||||||
|
open: () => Promise<boolean>
|
||||||
|
close: () => Promise<boolean>
|
||||||
|
toggle: () => Promise<boolean>
|
||||||
|
}
|
||||||
|
|
||||||
|
const syncFullscreenState = (fullscreen: FullscreenState) => {
|
||||||
|
fullscreen.value = Boolean(document.fullscreenElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
let fullscreenListenerInstalled = false
|
||||||
|
|
||||||
|
export const useFullscreen = () => {
|
||||||
|
const fullscreen = useState<boolean>("fullscreen", () => false)
|
||||||
|
|
||||||
|
const open = async () => {
|
||||||
|
fullscreen.value = true
|
||||||
|
|
||||||
|
if (!import.meta.client) return true
|
||||||
|
if (!document.documentElement.requestFullscreen) return true
|
||||||
|
|
||||||
|
try {
|
||||||
|
await document.documentElement.requestFullscreen()
|
||||||
|
return true
|
||||||
|
} catch {
|
||||||
|
fullscreen.value = false
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const close = async () => {
|
||||||
|
if (import.meta.client && document.fullscreenElement) {
|
||||||
|
try {
|
||||||
|
await document.exitFullscreen()
|
||||||
|
} catch {
|
||||||
|
// Fall through to keep the app state consistent.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fullscreen.value = false
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggle = async () => {
|
||||||
|
if (fullscreen.value) return close()
|
||||||
|
return open()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.client && !fullscreenListenerInstalled) {
|
||||||
|
fullscreenListenerInstalled = true
|
||||||
|
document.addEventListener("fullscreenchange", () => {
|
||||||
|
syncFullscreenState(fullscreen)
|
||||||
|
})
|
||||||
|
syncFullscreenState(fullscreen)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
fullscreen,
|
||||||
|
open,
|
||||||
|
close,
|
||||||
|
toggle,
|
||||||
|
} as FullscreenControls
|
||||||
|
}
|
||||||
Reference in new issue
Block a user