mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
118 lines
2.3 KiB
JavaScript
118 lines
2.3 KiB
JavaScript
import { ref } from 'vue';
|
|
import { config } from 'site-desktop-shared';
|
|
|
|
let queue = [];
|
|
let isIframeReady = false;
|
|
|
|
function iframeReady(callback) {
|
|
if (isIframeReady) {
|
|
callback();
|
|
} else {
|
|
queue.push(callback);
|
|
}
|
|
}
|
|
|
|
if (window.top === window) {
|
|
window.addEventListener('message', (event) => {
|
|
if (event.data.type === 'iframeReady') {
|
|
isIframeReady = true;
|
|
queue.forEach((callback) => callback());
|
|
queue = [];
|
|
}
|
|
});
|
|
} else {
|
|
window.top.postMessage({ type: 'iframeReady' }, '*');
|
|
}
|
|
|
|
function getCurrentDir() {
|
|
const router = window.vueRouter;
|
|
const { path } = router.currentRoute.value;
|
|
|
|
if (config.site.simulator?.routeMapper) {
|
|
return config.site.simulator?.routeMapper(path);
|
|
}
|
|
return path;
|
|
}
|
|
|
|
export function syncPathToParent() {
|
|
window.top.postMessage(
|
|
{
|
|
type: 'replacePath',
|
|
value: getCurrentDir(),
|
|
},
|
|
'*'
|
|
);
|
|
}
|
|
|
|
export function syncPathToChild() {
|
|
const iframe = document.querySelector('iframe');
|
|
if (iframe) {
|
|
iframeReady(() => {
|
|
iframe.contentWindow.postMessage(
|
|
{
|
|
type: 'replacePath',
|
|
value: getCurrentDir(),
|
|
},
|
|
'*'
|
|
);
|
|
});
|
|
}
|
|
}
|
|
|
|
export function syncThemeToChild(theme) {
|
|
const iframe = document.querySelector('iframe');
|
|
if (iframe) {
|
|
iframeReady(() => {
|
|
iframe.contentWindow.postMessage(
|
|
{
|
|
type: 'updateTheme',
|
|
value: theme,
|
|
},
|
|
'*'
|
|
);
|
|
});
|
|
}
|
|
}
|
|
|
|
export function getDefaultTheme() {
|
|
const cache = window.localStorage.getItem('vantTheme');
|
|
|
|
if (cache) {
|
|
return cache;
|
|
}
|
|
|
|
const useDark =
|
|
window.matchMedia &&
|
|
window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
return useDark ? 'dark' : 'light';
|
|
}
|
|
|
|
export function useCurrentTheme() {
|
|
const theme = ref(getDefaultTheme());
|
|
|
|
window.addEventListener('message', (event) => {
|
|
if (event.data?.type !== 'updateTheme') {
|
|
return;
|
|
}
|
|
|
|
const newTheme = event.data?.value || '';
|
|
theme.value = newTheme;
|
|
});
|
|
|
|
return theme;
|
|
}
|
|
|
|
export function listenToSyncPath(router) {
|
|
window.addEventListener('message', (event) => {
|
|
if (event.data?.type !== 'replacePath') {
|
|
return;
|
|
}
|
|
|
|
const path = event.data?.value || '';
|
|
// should preserve hash for anchor
|
|
if (router.currentRoute.value.path !== path) {
|
|
router.replace(path).catch(() => {});
|
|
}
|
|
});
|
|
}
|