From 502912347ccaa4d86a751cf620e7f018f578f4bc Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Fri, 16 Jul 2021 14:42:50 +0800 Subject: [PATCH] feat(app): add reLaunch --- .../uni-app-plus/dist/uni-app-service.es.js | 46 ++++++++++++- .../uni-app-plus/src/service/api/index.ts | 1 + .../src/service/api/route/navigateTo.ts | 7 +- .../src/service/api/route/reLaunch.ts | 68 +++++++++++++++++++ .../src/service/api/route/redirectTo.ts | 8 +-- .../src/service/api/route/utils.ts | 5 ++ .../service/framework/page/getCurrentPages.ts | 4 ++ 7 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 packages/uni-app-plus/src/service/api/route/reLaunch.ts diff --git a/packages/uni-app-plus/dist/uni-app-service.es.js b/packages/uni-app-plus/dist/uni-app-service.es.js index 462ba9b03..f93cc1066 100644 --- a/packages/uni-app-plus/dist/uni-app-service.es.js +++ b/packages/uni-app-plus/dist/uni-app-service.es.js @@ -4405,6 +4405,7 @@ var serviceContext = (function (vue) { }; const API_NAVIGATE_TO = 'navigateTo'; const API_REDIRECT_TO = 'redirectTo'; + const API_RE_LAUNCH = 'reLaunch'; const API_SWITCH_TAB = 'switchTab'; const API_NAVIGATE_BACK = 'navigateBack'; const API_PRELOAD_PAGE = 'preloadPage'; @@ -4418,10 +4419,13 @@ var serviceContext = (function (vue) { }, }, createAnimationProtocol(ANIMATION_OUT)); const RedirectToProtocol = BaseRouteProtocol; + const ReLaunchProtocol = BaseRouteProtocol; const NavigateToOptions = /*#__PURE__*/ createRouteOptions(API_NAVIGATE_TO); const RedirectToOptions = /*#__PURE__*/ createRouteOptions(API_REDIRECT_TO); + const ReLaunchOptions = + /*#__PURE__*/ createRouteOptions(API_RE_LAUNCH); const NavigateBackOptions = { formatArgs: { delta(value, params) { @@ -8993,6 +8997,9 @@ var serviceContext = (function (vue) { function addCurrentPage(page) { pages.push(page); } + function getAllPages() { + return pages; + } function getCurrentPages$1() { const curPages = []; pages.forEach((page) => { @@ -9724,6 +9731,42 @@ var serviceContext = (function (vue) { }); } + const reLaunch = defineAsyncApi(API_RE_LAUNCH, ({ url }, { resolve, reject }) => { + const { path, query } = parseUrl(url); + navigate(path, () => { + _reLaunch({ + url, + path, + query, + }) + .then(resolve) + .catch(reject); + }); + }, ReLaunchProtocol, ReLaunchOptions); + function _reLaunch({ url, path, query }) { + return new Promise((resolve) => { + // 获取目前所有页面 + const pages = getAllPages().slice(0); + const routeOptions = __uniRoutes.find((route) => route.path === path); + if (routeOptions.meta.isTabBar) { + tabBar$1.switchTab(path.slice(1)); + } + showWebview(registerPage({ + url, + path, + query, + openType: 'reLaunch', + }), 'none', 0, () => { + pages.forEach((page) => { + removePage(page); + closeWebview(page.$getAppWebview(), 'none'); + }); + resolve(undefined); + }); + setStatusBarStyle(); + }); + } + var uni$1 = /*#__PURE__*/Object.freeze({ __proto__: null, upx2px: upx2px, @@ -9853,7 +9896,8 @@ var serviceContext = (function (vue) { createInteractiveAd: createInteractiveAd, navigateBack: navigateBack, navigateTo: navigateTo, - redirectTo: redirectTo + redirectTo: redirectTo, + reLaunch: reLaunch }); let invokeViewMethodId = 0; diff --git a/packages/uni-app-plus/src/service/api/index.ts b/packages/uni-app-plus/src/service/api/index.ts index 9e33d803d..0eb7b8e84 100644 --- a/packages/uni-app-plus/src/service/api/index.ts +++ b/packages/uni-app-plus/src/service/api/index.ts @@ -55,6 +55,7 @@ export * from './ad/interactiveAd' export * from './route/navigateBack' export * from './route/navigateTo' export * from './route/redirectTo' +export * from './route/reLaunch' export { upx2px, diff --git a/packages/uni-app-plus/src/service/api/route/navigateTo.ts b/packages/uni-app-plus/src/service/api/route/navigateTo.ts index 6364f9b85..1cf237695 100644 --- a/packages/uni-app-plus/src/service/api/route/navigateTo.ts +++ b/packages/uni-app-plus/src/service/api/route/navigateTo.ts @@ -9,7 +9,7 @@ import { } from '@dcloudio/uni-api' import { ANI_DURATION, ANI_SHOW } from '../../constants' -import { navigate } from './utils' +import { navigate, RouteOptions } from './utils' import { showWebview } from './webview' import { registerPage } from '../../framework/page' @@ -43,10 +43,7 @@ export const navigateTo = defineAsyncApi( NavigateToOptions ) -interface NavigateToOptions { - url: string - path: string - query: Record +interface NavigateToOptions extends RouteOptions { aniType: string aniDuration: number } diff --git a/packages/uni-app-plus/src/service/api/route/reLaunch.ts b/packages/uni-app-plus/src/service/api/route/reLaunch.ts new file mode 100644 index 000000000..d09e5a204 --- /dev/null +++ b/packages/uni-app-plus/src/service/api/route/reLaunch.ts @@ -0,0 +1,68 @@ +import { + API_RE_LAUNCH, + API_TYPE_RE_LAUNCH, + defineAsyncApi, + ReLaunchOptions, + ReLaunchProtocol, +} from '@dcloudio/uni-api' +import { parseUrl } from '@dcloudio/uni-shared' +import { ComponentPublicInstance } from 'vue' +import tabBar from '../../framework/app/tabBar' +import { registerPage } from '../../framework/page' +import { getAllPages, removePage } from '../../framework/page/getCurrentPages' +import { setStatusBarStyle } from '../../statusBar' +import { navigate, RouteOptions } from './utils' +import { closeWebview, showWebview } from './webview' + +export const reLaunch = defineAsyncApi( + API_RE_LAUNCH, + ({ url }, { resolve, reject }) => { + const { path, query } = parseUrl(url) + navigate(path, () => { + _reLaunch({ + url, + path, + query, + }) + .then(resolve) + .catch(reject) + }) + }, + ReLaunchProtocol, + ReLaunchOptions +) + +interface ReLaunchOptions extends RouteOptions {} + +function _reLaunch({ url, path, query }: ReLaunchOptions): Promise { + return new Promise((resolve) => { + // 获取目前所有页面 + const pages = getAllPages().slice(0) + const routeOptions = __uniRoutes.find((route) => route.path === path)! + if (routeOptions.meta.isTabBar) { + tabBar.switchTab(path.slice(1)) + } + + showWebview( + registerPage({ + url, + path, + query, + openType: 'reLaunch', + }), + 'none', + 0, + () => { + pages.forEach((page) => { + removePage(page) + closeWebview( + (page as ComponentPublicInstance).$getAppWebview!(), + 'none' + ) + }) + resolve(undefined) + } + ) + setStatusBarStyle() + }) +} diff --git a/packages/uni-app-plus/src/service/api/route/redirectTo.ts b/packages/uni-app-plus/src/service/api/route/redirectTo.ts index f57f5eeb7..f4ea030d5 100644 --- a/packages/uni-app-plus/src/service/api/route/redirectTo.ts +++ b/packages/uni-app-plus/src/service/api/route/redirectTo.ts @@ -9,7 +9,7 @@ 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 } from './utils' +import { navigate, RouteOptions } from './utils' import { showWebview } from './webview' import { setStatusBarStyle } from '../../statusBar' import { ComponentPublicInstance } from 'vue' @@ -32,11 +32,7 @@ export const redirectTo = defineAsyncApi( RedirectToOptions ) -interface RedirectToOptions { - url: string - path: string - query: Record -} +interface RedirectToOptions extends RouteOptions {} function _redirectTo({ url, diff --git a/packages/uni-app-plus/src/service/api/route/utils.ts b/packages/uni-app-plus/src/service/api/route/utils.ts index 24699f8c3..b924166b3 100644 --- a/packages/uni-app-plus/src/service/api/route/utils.ts +++ b/packages/uni-app-plus/src/service/api/route/utils.ts @@ -6,6 +6,11 @@ import { preloadWebview, } from '../../framework/webview' +export interface RouteOptions { + url: string + path: string + query: Record +} interface PendingNavigator { path: string nvue?: boolean diff --git a/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts b/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts index 4a2af818f..a3a4c8347 100644 --- a/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts +++ b/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts @@ -8,6 +8,10 @@ export function addCurrentPage(page: ComponentPublicInstance) { pages.push(page) } +export function getAllPages() { + return pages +} + export function getCurrentPages() { const curPages: ComponentPublicInstance[] = [] pages.forEach((page) => { -- GitLab