import { API_REDIRECT_TO, API_TYPE_REDIRECT_TO, defineAsyncApi, RedirectToOptions, RedirectToProtocol, } from '@dcloudio/uni-api' import { parseUrl } from '@dcloudio/uni-shared' import { getCurrentPage } from '@dcloudio/uni-core' import { removePage } from '../../framework/page/getCurrentPages' import { registerPage } from '../../framework/page' import { navigate, RouteOptions } from './utils' import { showWebview } from './webview' import { setStatusBarStyle } from '../../statusBar' import { ComponentPublicInstance } from 'vue' export const redirectTo = defineAsyncApi( API_REDIRECT_TO, ({ url }, { resolve, reject }) => { const { path, query } = parseUrl(url) navigate(path, () => { _redirectTo({ url, path, query, }) .then(resolve) .catch(reject) }) }, RedirectToProtocol, RedirectToOptions ) interface RedirectToOptions extends RouteOptions {} function _redirectTo({ url, path, query, }: RedirectToOptions): Promise { // TODO exists // if (exists === 'back') { // const existsPageIndex = findExistsPageIndex(url) // if (existsPageIndex !== -1) { // const delta = len - existsPageIndex // if (delta > 0) { // navigateBack({ // delta, // }) // invoke(callbackId, { // errMsg: 'redirectTo:ok', // }) // return // } // } // } const lastPage = getCurrentPage() lastPage && removePage(lastPage) return new Promise((resolve) => { showWebview( registerPage({ url, path, query, openType: 'redirectTo', }), 'none', 0, () => { if (lastPage) { const webview = (lastPage as ComponentPublicInstance) .$getAppWebview!() // TODO preload // if (webview.__preload__) { // removePreloadWebview(webview) // } webview.close('none') } resolve(undefined) } ) setStatusBarStyle() }) }