diff --git a/packages/frontend/apps/ios/App/App/AffineViewController.swift b/packages/frontend/apps/ios/App/App/AffineViewController.swift index 3f3e25d7b8cc6..2e55195706be6 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 b38796097f4cc..05a338c95b44a 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 d55672618a565..abb3dd8f9510d 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 0000000000000..0a91182394e04 --- /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 4906c19877e29..cd34ecd6d316a 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 857b9eb226b8a..b19ccbca25070 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: