UNPKG

quasar

Version:

Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time

113 lines (87 loc) 2.43 kB
import { ref, watch, onBeforeMount, onMounted, onBeforeUnmount, getCurrentInstance } from 'vue' import History from '../../history.js' import { vmHasRouter } from '../../utils/private/vm.js' let counter = 0 export const useFullscreenProps = { fullscreen: Boolean, noRouteFullscreenExit: Boolean } export const useFullscreenEmits = [ 'update:fullscreen', 'fullscreen' ] export default function () { const vm = getCurrentInstance() const { props, emit, proxy } = vm let historyEntry, fullscreenFillerNode, container const inFullscreen = ref(false) vmHasRouter(vm) === true && watch(() => proxy.$route.fullPath, () => { props.noRouteFullscreenExit !== true && exitFullscreen() }) watch(() => props.fullscreen, v => { if (inFullscreen.value !== v) { toggleFullscreen() } }) watch(inFullscreen, v => { emit('update:fullscreen', v) emit('fullscreen', v) }) function toggleFullscreen () { if (inFullscreen.value === true) { exitFullscreen() } else { setFullscreen() } } function setFullscreen () { if (inFullscreen.value === true) { return } inFullscreen.value = true container = proxy.$el.parentNode container.replaceChild(fullscreenFillerNode, proxy.$el) document.body.appendChild(proxy.$el) counter++ if (counter === 1) { document.body.classList.add('q-body--fullscreen-mixin') } historyEntry = { handler: exitFullscreen } History.add(historyEntry) } function exitFullscreen () { if (inFullscreen.value !== true) { return } if (historyEntry !== void 0) { History.remove(historyEntry) historyEntry = void 0 } container.replaceChild(proxy.$el, fullscreenFillerNode) inFullscreen.value = false counter = Math.max(0, counter - 1) if (counter === 0) { document.body.classList.remove('q-body--fullscreen-mixin') if (proxy.$el.scrollIntoView !== void 0) { setTimeout(() => { proxy.$el.scrollIntoView() }) } } } onBeforeMount(() => { fullscreenFillerNode = document.createElement('span') }) onMounted(() => { props.fullscreen === true && setFullscreen() }) onBeforeUnmount(exitFullscreen) // expose public methods Object.assign(proxy, { toggleFullscreen, setFullscreen, exitFullscreen }) return { inFullscreen, toggleFullscreen } }