123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <script setup lang="ts">
- import { onMounted } from 'vue'
- import { ElMessageBox } from 'element-plus'
- import nprogress from 'nprogress'
- import dayjs from 'dayjs'
- import { isClient, useStorage, useToggle } from '@vueuse/core'
- import { useSidebar } from '../composables/sidebar'
- import { useToggleWidgets } from '../composables/toggle-widgets'
- import { useLang } from '../composables/lang'
- import { breakpoints } from '../constant'
- import VPOverlay from './vp-overlay.vue'
- import VPNav from './vp-nav.vue'
- import VPSubNav from './vp-subnav.vue'
- import VPSidebar from './vp-sidebar.vue'
- import VPContent from './vp-content.vue'
- import VPSponsors from './vp-sponsors.vue'
- const USER_PREFER_GITHUB_PAGE = 'USER_PREFER_GITHUB_PAGE'
- const [isSidebarOpen, toggleSidebar] = useToggle(false)
- const { hasSidebar } = useSidebar()
- const lang = useLang()
- const mirrorUrl = 'element-plus.gitee.io'
- const isMirrorUrl = () => {
- if (!isClient) return
- return window.location.hostname === mirrorUrl
- }
- useToggleWidgets(isSidebarOpen, () => {
- if (!isClient) return
- if (window.outerWidth >= breakpoints.lg) {
- toggleSidebar(false)
- }
- })
- const userPrefer = useStorage<boolean | string>(USER_PREFER_GITHUB_PAGE, null)
- onMounted(async () => {
- if (!isClient) return
- window.addEventListener(
- 'click',
- (e) => {
- const link = (e.target as HTMLElement).closest('a')
- if (!link) return
- const { protocol, hostname, pathname, target } = link
- const currentUrl = window.location
- const extMatch = pathname.match(/\.\w+$/)
- // only intercept inbound links
- if (
- !e.ctrlKey &&
- !e.shiftKey &&
- !e.altKey &&
- !e.metaKey &&
- target !== `_blank` &&
- protocol === currentUrl.protocol &&
- hostname === currentUrl.hostname &&
- !(extMatch && extMatch[0] !== '.html')
- ) {
- e.preventDefault()
- if (pathname !== currentUrl.pathname) {
- nprogress.start()
- }
- }
- },
- { capture: true }
- )
- if (lang.value === 'zh-CN') {
- if (isMirrorUrl()) return
- if (userPrefer.value) {
- // no alert in the next 90 days
- if (
- dayjs
- .unix(Number(userPrefer.value))
- .add(90, 'day')
- .diff(dayjs(), 'day', true) > 0
- )
- return
- }
- try {
- await ElMessageBox.confirm(
- '建议大陆用户访问部署在国内的站点,是否跳转?',
- '提示',
- {
- confirmButtonText: '跳转',
- cancelButtonText: '取消',
- }
- )
- const toLang = '/zh-CN/'
- location.href = `https://element-plus.gitee.io${toLang}${location.pathname.slice(
- toLang.length
- )}`
- } catch {
- userPrefer.value = String(dayjs().unix())
- }
- }
- // unregister sw
- navigator?.serviceWorker?.getRegistrations().then((registrations) => {
- for (const registration of registrations) {
- registration.unregister()
- }
- })
- })
- </script>
- <template>
- <div class="App">
- <VPOverlay
- class="overlay"
- :show="isSidebarOpen"
- @click="toggleSidebar(false)"
- />
- <VPNav />
- <VPSubNav v-if="hasSidebar" @open-menu="toggleSidebar(true)" />
- <VPSidebar :open="isSidebarOpen" @close="toggleSidebar(false)">
- <template #top>
- <VPSponsors />
- </template>
- <template #bottom>
- <slot name="sidebar-bottom" />
- </template>
- </VPSidebar>
- <VPContent :is-sidebar-open="isSidebarOpen">
- <template #content-top>
- <slot name="content-top" />
- </template>
- <template #content-bottom>
- <slot name="content-bottom" />
- </template>
- <template #aside-top>
- <slot name="aside-top" />
- </template>
- <template #aside-mid>
- <slot name="aside-mid" />
- </template>
- <template #aside-bottom>
- <slot name="aside-bottom" />
- </template>
- </VPContent>
- <Debug />
- </div>
- </template>
|