chore: refactor logic in nav and sidebar composables

userquin/feat-add-inert-content-again
userquin 2 years ago
parent e2d4cc653e
commit 4640702e61

@ -12,8 +12,7 @@ const inertStateSymbol = Symbol()
export interface Inert { export interface Inert {
isSidebarOpen: boolean isSidebarOpen: boolean
isScreenOpen: boolean isScreenOpen: boolean
isSidebarEnabled: boolean isSidebarVisible: boolean
onAfterRouteChanged: () => void
} }
export interface InertState { export interface InertState {
@ -37,20 +36,13 @@ export function provideInert(app: App) {
const inert = reactive({ const inert = reactive({
isSidebarOpen: false, isSidebarOpen: false,
isScreenOpen: false, isScreenOpen: false,
isSidebarEnabled: false, isSidebarVisible: true
onAfterRouteChanged() {
inert.isSidebarOpen = false
inert.isScreenOpen = false
}
}) })
const inertState = reactive({ const inertState = reactive({
inertSkipLink: computed(() => inert.isSidebarOpen || inert.isScreenOpen), inertSkipLink: computed(() => inert.isSidebarOpen || inert.isScreenOpen),
inertNav: computed(() => inert.isSidebarOpen), inertNav: computed(() => inert.isSidebarOpen),
inertLocalNav: computed(() => inert.isSidebarOpen || inert.isScreenOpen), inertLocalNav: computed(() => inert.isSidebarOpen || inert.isScreenOpen),
inertSidebar: computed( inertSidebar: computed(() => !inert.isSidebarVisible || inert.isScreenOpen),
() =>
!inert.isSidebarEnabled && (!inert.isSidebarOpen || inert.isScreenOpen)
),
inertContent: computed(() => inert.isSidebarOpen || inert.isScreenOpen), inertContent: computed(() => inert.isSidebarOpen || inert.isScreenOpen),
inertFooter: computed(() => inert.isSidebarOpen || inert.isScreenOpen) inertFooter: computed(() => inert.isSidebarOpen || inert.isScreenOpen)
}) })

@ -1,42 +1,44 @@
import { computed, watch } from 'vue' import { ref, watch } from 'vue'
import { useInert, useRoute } from 'vitepress' import { useInert, useRoute } from 'vitepress'
import { useMediaQuery } from '@vueuse/core'
export function useNav() { export function useNav() {
const inert = useInert()! const inert = useInert()!
const isScreenOpen = computed(() => inert.isScreenOpen) const is768 = useMediaQuery('(min-width: 768px)')
const isScreenOpen = ref(false)
function openScreen() { function openScreen() {
inert.isScreenOpen = true isScreenOpen.value = true
window.addEventListener('resize', closeScreenOnTabletWindow)
}
function handleCloseScreen(fromRoute = false) {
if (fromRoute) inert.onAfterRouteChanged()
else inert.isScreenOpen = false
window.removeEventListener('resize', closeScreenOnTabletWindow)
} }
function closeScreen() { function closeScreen() {
handleCloseScreen() isScreenOpen.value = false
} }
function toggleScreen() { function toggleScreen() {
isScreenOpen.value ? handleCloseScreen() : openScreen() isScreenOpen.value ? closeScreen() : openScreen()
} }
/** watch(is768, (mq) => {
* Close the screen when the user resizes the window wider than tablet size. if (mq) {
*/ isScreenOpen.value = false
function closeScreenOnTabletWindow() { }
window.outerWidth >= 768 && handleCloseScreen() })
}
const route = useRoute()
watch( watch(
() => route.path, () => [isScreenOpen.value, is768.value],
() => handleCloseScreen(true) ([screenOpen, mq]) => {
if (mq) {
inert.isScreenOpen = false
} else {
inert.isScreenOpen = screenOpen
}
}
) )
const route = useRoute()
watch(() => route.path, closeScreen)
return { return {
isScreenOpen, isScreenOpen,
openScreen, openScreen,

@ -32,10 +32,10 @@ export interface SidebarControl {
export function useSidebar() { export function useSidebar() {
const { frontmatter, page, theme } = useData() const { frontmatter, page, theme } = useData()
const inert = useInert()!
const is960 = useMediaQuery('(min-width: 960px)') const is960 = useMediaQuery('(min-width: 960px)')
const inert = useInert()! const isOpen = ref(false)
const isOpen = computed(() => inert.isSidebarOpen)
const _sidebar = computed(() => { const _sidebar = computed(() => {
const sidebarConfig = theme.value.sidebar const sidebarConfig = theme.value.sidebar
@ -74,16 +74,28 @@ export function useSidebar() {
const isSidebarEnabled = computed(() => hasSidebar.value && is960.value) const isSidebarEnabled = computed(() => hasSidebar.value && is960.value)
watch(
() => [hasSidebar.value, is960.value, isOpen.value],
([sb, mq, o]) => {
if (o) {
inert.isSidebarVisible = inert.isSidebarOpen = true
} else {
inert.isSidebarOpen = false
inert.isSidebarVisible = sb && mq
}
}
)
const sidebarGroups = computed(() => { const sidebarGroups = computed(() => {
return hasSidebar.value ? getSidebarGroups(sidebar.value) : [] return hasSidebar.value ? getSidebarGroups(sidebar.value) : []
}) })
function open() { function open() {
inert.isSidebarOpen = true isOpen.value = true
} }
function close() { function close() {
inert.isSidebarOpen = false isOpen.value = false
} }
function toggle() { function toggle() {

Loading…
Cancel
Save