mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-10-31 11:32:09 +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(() => {});
 | |
|     }
 | |
|   });
 | |
| }
 |