From 0acdf6204323101dfe15b849123f4905e2495d96 Mon Sep 17 00:00:00 2001 From: CatsJuice Date: Wed, 25 Dec 2024 04:27:51 +0000 Subject: [PATCH] refactor(ios): disable navigation gesture with js (#9287) Do not toggle navigation gesture native to avoid unexpected behavior. close AF-1958, AF-1797 --- .../apps/ios/App/App/AffineViewController.swift | 3 +-- packages/frontend/apps/ios/package.json | 1 + packages/frontend/apps/ios/src/app.tsx | 8 ++++---- .../apps/ios/src/web-navigation-control.tsx | 13 +++++++++++++ .../providers/navigation-gesture.ts | 6 +++--- yarn.lock | 3 ++- 6 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 packages/frontend/apps/ios/src/web-navigation-control.tsx diff --git a/packages/frontend/apps/ios/App/App/AffineViewController.swift b/packages/frontend/apps/ios/App/App/AffineViewController.swift index 3f3e25d7b8..2e55195706 100644 --- a/packages/frontend/apps/ios/App/App/AffineViewController.swift +++ b/packages/frontend/apps/ios/App/App/AffineViewController.swift @@ -5,8 +5,7 @@ import UIKit class AFFiNEViewController: CAPBridgeViewController { override func viewDidLoad() { super.viewDidLoad() - // disable by default, enable manually when there is a "back" button in page-header - webView?.allowsBackForwardNavigationGestures = false + webView?.allowsBackForwardNavigationGestures = true navigationController?.navigationBar.isHidden = true extendedLayoutIncludesOpaqueBars = false edgesForExtendedLayout = [] diff --git a/packages/frontend/apps/ios/package.json b/packages/frontend/apps/ios/package.json index b38796097f..05a338c95b 100644 --- a/packages/frontend/apps/ios/package.json +++ b/packages/frontend/apps/ios/package.json @@ -23,6 +23,7 @@ "@capacitor/ios": "^6.2.0", "@capacitor/keyboard": "^6.0.3", "@sentry/react": "^8.44.0", + "@toeverything/infra": "workspace:^", "next-themes": "^0.4.4", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/packages/frontend/apps/ios/src/app.tsx b/packages/frontend/apps/ios/src/app.tsx index d55672618a..abb3dd8f95 100644 --- a/packages/frontend/apps/ios/src/app.tsx +++ b/packages/frontend/apps/ios/src/app.tsx @@ -49,7 +49,7 @@ import { ModalConfigProvider } from './modal-config'; import { Cookie } from './plugins/cookie'; import { Hashcash } from './plugins/hashcash'; import { Intelligents } from './plugins/intelligents'; -import { NavigationGesture } from './plugins/navigation-gesture'; +import { enableNavigationGesture$ } from './web-navigation-control'; const future = { v7_startTransition: true, @@ -107,9 +107,9 @@ framework.impl(VirtualKeyboardProvider, { }, }); framework.impl(NavigationGestureProvider, { - isEnabled: () => NavigationGesture.isEnabled(), - enable: () => NavigationGesture.enable(), - disable: () => NavigationGesture.disable(), + isEnabled: () => enableNavigationGesture$.value, + enable: () => enableNavigationGesture$.next(true), + disable: () => enableNavigationGesture$.next(false), }); framework.impl(HapticProvider, { impact: options => Haptics.impact(options as any), diff --git a/packages/frontend/apps/ios/src/web-navigation-control.tsx b/packages/frontend/apps/ios/src/web-navigation-control.tsx new file mode 100644 index 0000000000..0a91182394 --- /dev/null +++ b/packages/frontend/apps/ios/src/web-navigation-control.tsx @@ -0,0 +1,13 @@ +import { LiveData } from '@toeverything/infra'; + +export const enableNavigationGesture$ = new LiveData(false); + +const onTouchStart = (e: TouchEvent) => { + if (enableNavigationGesture$.value) return; + + const clientX = e.changedTouches[0].clientX; + if (clientX <= 25) { + e.preventDefault(); + } +}; +document.body.addEventListener('touchstart', onTouchStart, { passive: false }); diff --git a/packages/frontend/core/src/mobile/modules/navigation-gesture/providers/navigation-gesture.ts b/packages/frontend/core/src/mobile/modules/navigation-gesture/providers/navigation-gesture.ts index 4906c19877..cd34ecd6d3 100644 --- a/packages/frontend/core/src/mobile/modules/navigation-gesture/providers/navigation-gesture.ts +++ b/packages/frontend/core/src/mobile/modules/navigation-gesture/providers/navigation-gesture.ts @@ -1,9 +1,9 @@ import { createIdentifier } from '@toeverything/infra'; export interface NavigationGestureProvider { - isEnabled: () => Promise; - enable: () => Promise; - disable: () => Promise; + isEnabled: () => boolean; + enable: () => void; + disable: () => void; } export const NavigationGestureProvider = diff --git a/yarn.lock b/yarn.lock index 857b9eb226..b19ccbca25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -587,6 +587,7 @@ __metadata: "@capacitor/ios": "npm:^6.2.0" "@capacitor/keyboard": "npm:^6.0.3" "@sentry/react": "npm:^8.44.0" + "@toeverything/infra": "workspace:^" "@types/react": "npm:^19.0.1" "@types/react-dom": "npm:^19.0.2" cross-env: "npm:^7.0.3" @@ -13718,7 +13719,7 @@ __metadata: languageName: node linkType: hard -"@toeverything/infra@workspace:*, @toeverything/infra@workspace:packages/common/infra": +"@toeverything/infra@workspace:*, @toeverything/infra@workspace:^, @toeverything/infra@workspace:packages/common/infra": version: 0.0.0-use.local resolution: "@toeverything/infra@workspace:packages/common/infra" dependencies: