From c74fd4147b57e6b11c22dffdf6355568a763f30a Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 12 Oct 2020 11:32:28 -0400 Subject: [PATCH] fix(vue): improve swipe to go back reliability (#22288) resolves #22237 --- .../vue/src/components/IonRouterOutlet.ts | 36 ++++++++-- packages/vue/test-app/package-lock.json | 20 +++--- packages/vue/test-app/package.json | 4 +- packages/vue/test-app/src/views/Tabs.vue | 2 +- .../test-app/tests/e2e/specs/navigation.js | 40 ++++++----- packages/vue/test-app/tests/e2e/specs/tabs.js | 68 +++++++++++++++++++ .../test-app/tests/e2e/support/commands.js | 19 ++++-- 7 files changed, 149 insertions(+), 40 deletions(-) diff --git a/packages/vue/src/components/IonRouterOutlet.ts b/packages/vue/src/components/IonRouterOutlet.ts index 9d5835ea9d..3eed64fab8 100644 --- a/packages/vue/src/components/IonRouterOutlet.ts +++ b/packages/vue/src/components/IonRouterOutlet.ts @@ -10,14 +10,13 @@ import { InjectionKey } from 'vue'; import { AnimationBuilder } from '@ionic/core'; -import { useRoute, useRouter } from 'vue-router'; +import { useRoute } from 'vue-router'; import { fireLifecycle, generateId, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE } from '../utils'; let viewDepthKey: InjectionKey<0> = Symbol(0); export const IonRouterOutlet = defineComponent({ name: 'IonRouterOutlet', setup(_, { attrs }) { - const vueRouter = useRouter(); const route = useRoute(); const depth = inject(viewDepthKey, 0); @@ -57,13 +56,22 @@ export const IonRouterOutlet = defineComponent({ const canStart = () => { const stack = viewStacks.getViewStack(id); - return stack && stack.length > 1; + if (!stack || stack.length <= 1) return false; + + /** + * We only want to outlet of the entering view + * to respond to this gesture, so check + * to make sure the view is in the outlet we want. + */ + const routeInfo = ionRouter.getCurrentRouteInfo(); + const enteringViewItem = viewStacks.findViewItemByRouteInfo({ pathname: routeInfo.pushedByRoute }, id); + + return !!enteringViewItem; } const onStart = async () => { const routeInfo = ionRouter.getCurrentRouteInfo(); const { routerAnimation } = routeInfo; - const items = viewStacks.getViewStack(id); - const enteringViewItem = items[items.length - 2]; + const enteringViewItem = viewStacks.findViewItemByRouteInfo({ pathname: routeInfo.pushedByRoute }, id); const leavingViewItem = viewStacks.findViewItemByRouteInfo(routeInfo, id); if (leavingViewItem) { @@ -105,7 +113,23 @@ export const IonRouterOutlet = defineComponent({ const onEnd = (shouldContinue: boolean) => { if (shouldContinue) { skipTransition = true; - vueRouter.back(); + + /** + * Use the same logic as clicking + * ion-back-button to determine where + * to go back to. + */ + ionRouter.handleNavigateBack(); + } else { + /** + * In the event that the swipe + * gesture was aborted, we should + * re-hide the page that was going to enter. + */ + const routeInfo = ionRouter.getCurrentRouteInfo(); + const enteringViewItem = viewStacks.findViewItemByRouteInfo({ pathname: routeInfo.pushedByRoute }, id); + enteringViewItem.ionPageElement.setAttribute('aria-hidden', 'true'); + enteringViewItem.ionPageElement.classList.add('ion-page-hidden'); } } diff --git a/packages/vue/test-app/package-lock.json b/packages/vue/test-app/package-lock.json index df98533907..581180c179 100644 --- a/packages/vue/test-app/package-lock.json +++ b/packages/vue/test-app/package-lock.json @@ -1306,27 +1306,27 @@ } }, "@ionic/core": { - "version": "5.4.0-dev.202010081632.d371af4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.4.0-dev.202010081632.d371af4.tgz", - "integrity": "sha512-Umy3OIbolByO9a4ZpETLxQ904TmaxD8grUnF3j7sfRFji4jXnzHAaVz6FteogWeZHjUa4hxJwrD3oBMh3OPKJQ==", + "version": "5.4.0-dev.202010091911.bfc0b25", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.4.0-dev.202010091911.bfc0b25.tgz", + "integrity": "sha512-gDWwMcgV+kPeTfBToZ8oLoSI7FygkRYEgi/DEAIHye3W8T/Z/NmqrxaNqXrXU0J0RKvfzrIlrw6uB67Xz1xRcw==", "requires": { "ionicons": "^5.1.2", "tslib": "^1.10.0" } }, "@ionic/vue": { - "version": "5.4.0-dev.202010081632.d371af4", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-5.4.0-dev.202010081632.d371af4.tgz", - "integrity": "sha512-fPvnbWLxrP4wCSFlQepH/J++IkOE0wDvZlPAjl+B/xXGW8jEp0cr8HVY+cXevgPGiUbE0eUexBlOtmYLZ2yIEQ==", + "version": "5.4.0-dev.202010091911.bfc0b25", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-5.4.0-dev.202010091911.bfc0b25.tgz", + "integrity": "sha512-zrF/u3sMq4k3mLMtlA/VcS+RFeWEXrhOnzJAo8uPuDGT4ZcttJv0sVIFJMqZF7zM+6+xxep5B5mMoB1cigwG3A==", "requires": { - "@ionic/core": "5.4.0-dev.202010081632.d371af4", + "@ionic/core": "5.4.0-dev.202010091911.bfc0b25", "ionicons": "^5.1.2" } }, "@ionic/vue-router": { - "version": "5.4.0-dev.202010081632.d371af4", - "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-5.4.0-dev.202010081632.d371af4.tgz", - "integrity": "sha512-/ZrfEppL1UeA3Eb+QSa4D05AjPPwcloevpPOoXW8tkJ0q8A9yb7n/29IlsnPdp0m/zSJKyJAFlO2cxy5RVQSRw==" + "version": "5.4.0-dev.202010091911.bfc0b25", + "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-5.4.0-dev.202010091911.bfc0b25.tgz", + "integrity": "sha512-moa388WPxJjHBcIVILoijS+xrTcS7jaK4T/rP3U9Lri1bSYrDpYNWmd/0sktGt80m3gaa8VXS5E995zDiyLAfQ==" }, "@jest/console": { "version": "24.9.0", diff --git a/packages/vue/test-app/package.json b/packages/vue/test-app/package.json index 8fea822057..cb1fde34db 100644 --- a/packages/vue/test-app/package.json +++ b/packages/vue/test-app/package.json @@ -11,8 +11,8 @@ "cypress": "node_modules/.bin/cypress run --headless --browser chrome" }, "dependencies": { - "@ionic/vue": "5.4.0-dev.202010081632.d371af4", - "@ionic/vue-router": "5.4.0-dev.202010081632.d371af4", + "@ionic/vue": "5.4.0-dev.202010091911.bfc0b25", + "@ionic/vue-router": "5.4.0-dev.202010091911.bfc0b25", "core-js": "^3.6.5", "vue": "^3.0.0-0", "vue-router": "^4.0.0-0" diff --git a/packages/vue/test-app/src/views/Tabs.vue b/packages/vue/test-app/src/views/Tabs.vue index 16497a81c7..5b91e6716f 100644 --- a/packages/vue/test-app/src/views/Tabs.vue +++ b/packages/vue/test-app/src/views/Tabs.vue @@ -1,7 +1,7 @@