From 1e05d2bd548b93fcfaaf225430cc7db8f0a32ea3 Mon Sep 17 00:00:00 2001 From: lafay <2021211506@stu.hit.edu.cn> Date: Fri, 12 Jun 2026 23:42:09 +0800 Subject: [PATCH] refactor(navigation): consolidate navigation with href helpers and extract push device hook - Migrate all navigation calls from magic strings to centralized href helpers - Extract inline device registration logic into useRegisterPushDevice hook - Remove unused terms and privacy policy routes from profile stack - Add hrefTradeDetail helper for trade detail navigation - Restore routePayloadCache.stashSystemMessage for group request/invite handling - Change desktop shell tab navigation from replace to push --- app/(app)/(tabs)/_layout.tsx | 21 +- app/(app)/(tabs)/profile/_layout.tsx | 2 - app/(app)/(tabs)/profile/privacy.tsx | 5 - app/(app)/(tabs)/profile/terms.tsx | 5 - app/(app)/_layout.tsx | 71 +-- app/(app)/_layout.web.tsx | 3 +- app/_layout.tsx | 50 +- app/index.tsx | 5 +- package-lock.json | 527 ++++++++------------ package.json | 39 +- src/app-navigation/AppDesktopShell.tsx | 2 +- src/components/business/PostRefCard.tsx | 3 +- src/hooks/index.ts | 3 + src/hooks/useRegisterPushDevice.ts | 29 ++ src/navigation/hrefs.ts | 7 +- src/screens/home/HomeScreen.tsx | 4 +- src/screens/home/MarketView.tsx | 3 +- src/screens/home/SearchScreen.tsx | 2 +- src/screens/message/NotificationsScreen.tsx | 4 +- 19 files changed, 312 insertions(+), 473 deletions(-) delete mode 100644 app/(app)/(tabs)/profile/privacy.tsx delete mode 100644 app/(app)/(tabs)/profile/terms.tsx create mode 100644 src/hooks/useRegisterPushDevice.ts diff --git a/app/(app)/(tabs)/_layout.tsx b/app/(app)/(tabs)/_layout.tsx index d4e2844..5774588 100644 --- a/app/(app)/(tabs)/_layout.tsx +++ b/app/(app)/(tabs)/_layout.tsx @@ -1,6 +1,6 @@ import { useMemo, useCallback } from 'react'; import { Platform, Pressable, useWindowDimensions } from 'react-native'; -import { Tabs, usePathname } from 'expo-router'; +import { Tabs, usePathname, useRouter } from 'expo-router'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import type { PressableProps } from 'react-native'; @@ -8,6 +8,7 @@ import type { PressableProps } from 'react-native'; import { useAppColors, shadows } from '../../../src/theme'; import { BREAKPOINTS } from '../../../src/hooks'; import { useHomeTabBarVisibilityStore, useTotalUnreadCount, useHomeTabPressStore } from '../../../src/stores'; +import { hrefHome } from '../../../src/navigation/hrefs'; const TAB_BAR_HEIGHT = 56; const TAB_BAR_FLOATING_MARGIN = 12; @@ -28,6 +29,7 @@ export default function TabsLayout() { const { width } = useWindowDimensions(); const insets = useSafeAreaInsets(); const pathname = usePathname(); + const router = useRouter(); const unreadCount = useTotalUnreadCount(); const scrollHideTabBar = useHomeTabBarVisibilityStore((s) => s.bottomTabBarHiddenByScroll); const triggerHomeTabPress = useHomeTabPressStore((s) => s.triggerPress); @@ -35,11 +37,18 @@ export default function TabsLayout() { const isHomeStackRoute = pathname === '/home' || pathname.startsWith('/home/'); - const handleHomeTabPress = useCallback(() => { - if (pathname === '/home') { - triggerHomeTabPress(); - } - }, [pathname, triggerHomeTabPress]); + const handleHomeTabPress = useCallback( + (e: { preventDefault: () => void }) => { + if (!isHomeStackRoute) return; + e.preventDefault(); + if (pathname === '/home') { + triggerHomeTabPress(); + } else { + router.navigate(hrefHome()); + } + }, + [isHomeStackRoute, pathname, triggerHomeTabPress, router] + ); const tabBarStyle = useMemo(() => { if (hideTabBar) { diff --git a/app/(app)/(tabs)/profile/_layout.tsx b/app/(app)/(tabs)/profile/_layout.tsx index 59c4f68..6246b78 100644 --- a/app/(app)/(tabs)/profile/_layout.tsx +++ b/app/(app)/(tabs)/profile/_layout.tsx @@ -17,8 +17,6 @@ export default function ProfileStackLayout() { - - diff --git a/app/(app)/(tabs)/profile/privacy.tsx b/app/(app)/(tabs)/profile/privacy.tsx deleted file mode 100644 index 7ecc3f4..0000000 --- a/app/(app)/(tabs)/profile/privacy.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { PrivacyPolicyScreen } from '../../../../src/screens/profile/PrivacyPolicyScreen'; - -export default function PrivacyPolicyRoute() { - return ; -} diff --git a/app/(app)/(tabs)/profile/terms.tsx b/app/(app)/(tabs)/profile/terms.tsx deleted file mode 100644 index 11b97e8..0000000 --- a/app/(app)/(tabs)/profile/terms.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { TermsOfServiceScreen } from '../../../../src/screens/profile/TermsOfServiceScreen'; - -export default function TermsOfServiceRoute() { - return ; -} diff --git a/app/(app)/_layout.tsx b/app/(app)/_layout.tsx index 1178c13..45da32a 100644 --- a/app/(app)/_layout.tsx +++ b/app/(app)/_layout.tsx @@ -1,83 +1,24 @@ -import { useEffect, useRef } from 'react'; -import { Platform } from 'react-native'; +import { useEffect } from 'react'; import { Redirect } from 'expo-router'; import { AppRouteStack } from '../../src/app-navigation/AppRouteStack'; import { messageManager, useAuthStore } from '../../src/stores'; -import { jpushService } from '../../src/services/notification/jpushService'; - -function getDeviceType(): 'ios' | 'android' | 'web' { - switch (Platform.OS) { - case 'ios': return 'ios'; - case 'android': return 'android'; - default: return 'web'; - } -} - -async function getOrCreateDeviceID(): Promise { - try { - const AsyncStorage = require('@react-native-async-storage/async-storage').default; - const DEVICE_ID_KEY = 'withyou_device_id'; - let deviceId = await AsyncStorage.getItem(DEVICE_ID_KEY); - if (deviceId) return deviceId; - const timestamp = Date.now().toString(36); - const random = Math.random().toString(36).substring(2, 8); - deviceId = `${Platform.OS}_${timestamp}_${random}`; - await AsyncStorage.setItem(DEVICE_ID_KEY, deviceId); - return deviceId; - } catch { - return `${Platform.OS}_${Date.now()}`; - } -} +import { useRegisterPushDevice } from '../../src/hooks'; +import { hrefAuthLogin } from '../../src/navigation/hrefs'; export default function AppLayout() { const isAuthenticated = useAuthStore((s) => s.isAuthenticated); const userID = useAuthStore((s) => s.currentUser?.id); - const deviceRegistered = useRef(false); useEffect(() => { messageManager.initialize(); }, []); - useEffect(() => { - if (!isAuthenticated || !userID) return; - - if (!deviceRegistered.current) { - deviceRegistered.current = true; - - if (Platform.OS === 'web') { - // Web: register device without push_token (JPush not available on web) - getOrCreateDeviceID().then((deviceId) => { - const { pushService } = require('../../src/services/notification/pushService'); - pushService.registerDevice({ - device_id: deviceId, - device_type: 'web', - device_name: 'Web Browser', - }).catch((err: any) => { - console.warn('[Push] web device register failed:', err?.message); - }); - }); - } else { - // Mobile: JPush handles registration internally in initialize() - jpushService.initialize().then((ok) => { - if (ok && userID) { - jpushService.setAliasForUser(userID); - } - }); - } - } - - return () => { - if (!isAuthenticated) { - deviceRegistered.current = false; - jpushService.cleanup(); - } - }; - }, [isAuthenticated, userID]); + useRegisterPushDevice(isAuthenticated, userID); if (!isAuthenticated) { - return ; + return ; } return ; -} \ No newline at end of file +} diff --git a/app/(app)/_layout.web.tsx b/app/(app)/_layout.web.tsx index 374ffde..93122a5 100644 --- a/app/(app)/_layout.web.tsx +++ b/app/(app)/_layout.web.tsx @@ -6,6 +6,7 @@ import { AppDesktopShell } from '../../src/app-navigation/AppDesktopShell'; import { AppRouteStack } from '../../src/app-navigation/AppRouteStack'; import { BREAKPOINTS } from '../../src/hooks'; import { messageManager, useAuthStore } from '../../src/stores'; +import { hrefAuthLogin } from '../../src/navigation/hrefs'; export default function AppLayoutWeb() { const { width } = useWindowDimensions(); @@ -17,7 +18,7 @@ export default function AppLayoutWeb() { }, []); if (!isAuthenticated) { - return ; + return ; } if (useDesktopShell) { diff --git a/app/_layout.tsx b/app/_layout.tsx index 447dc3f..a7b5fc0 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -30,6 +30,7 @@ import { CallScreen, IncomingCallModal, FloatingCallWindow } from '../src/compon import { jpushService } from '@/services/notification/jpushService'; import { callKeepService } from '@/services/callkeep'; import { callStore } from '@/stores/call'; +import * as hrefs from '../src/navigation/hrefs'; registerNotificationPresentationHandler(); @@ -172,22 +173,21 @@ function NotificationBootstrap() { if (conversationId) { const isGroup = conversationType === 'group'; - const q = new URLSearchParams(); - if (isGroup) { - q.set('isGroupChat', '1'); - if (groupId) q.set('groupId', groupId); - if (groupName) q.set('groupName', groupName); - if (groupAvatar) q.set('groupAvatar', groupAvatar); - } else if (senderId) { - q.set('userId', senderId); - } - const qs = q.toString(); - router.push(`/chat/${encodeURIComponent(conversationId)}${qs ? `?${qs}` : ''}`); + router.push( + hrefs.hrefChat({ + conversationId, + userId: isGroup ? undefined : senderId, + isGroupChat: isGroup, + groupId: isGroup ? groupId : undefined, + groupName: isGroup ? groupName : undefined, + groupAvatar: isGroup ? groupAvatar : undefined, + }) + ); } else { - router.push('/messages/notifications'); + router.push(hrefs.hrefNotifications()); } } else { - router.push('/messages/notifications'); + router.push(hrefs.hrefNotifications()); } }); @@ -287,30 +287,6 @@ function ThemedStack() { - - - - diff --git a/app/index.tsx b/app/index.tsx index 9e2149f..59b3117 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,11 +1,12 @@ import { Redirect } from 'expo-router'; import { useAuthStore } from '../src/stores'; +import { hrefAuthWelcome, hrefHome } from '../src/navigation/hrefs'; export default function Index() { const isAuthenticated = useAuthStore((s) => s.isAuthenticated); if (isAuthenticated) { - return ; + return ; } - return ; + return ; } diff --git a/package-lock.json b/package-lock.json index 0d5f78f..3ab5379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,45 +7,45 @@ "": { "name": "with_you", "version": "0.0.2", - "hasInstallScript": true, "dependencies": { - "@expo/ui": "^56.0.15", + "@expo/ui": "~56.0.17", "@expo/vector-icons": "^15.1.1", "@livekit/react-native": "^2.11.0", "@livekit/react-native-webrtc": "^144.1.0", "@react-native-async-storage/async-storage": "^3.1.1", "@shopify/flash-list": "^2.3.1", "@tanstack/react-query": "^5.100.14", + "@types/react": "~19.2.14", "axios": "^1.16.1", "date-fns": "^4.4.0", - "expo": "^56.0.8", - "expo-background-task": "~56.0.16", - "expo-callkit-telecom": "^0.3.8", - "expo-camera": "~56.0.7", - "expo-constants": "~56.0.16", - "expo-dev-client": "~56.0.18", - "expo-file-system": "~56.0.7", - "expo-font": "~56.0.5", + "expo": "~56.0.11", + "expo-background-task": "~56.0.18", + "expo-callkit-telecom": "^0.3.9", + "expo-camera": "~56.0.8", + "expo-constants": "~56.0.18", + "expo-dev-client": "~56.0.20", + "expo-file-system": "~56.0.8", + "expo-font": "~56.0.6", "expo-haptics": "~56.0.3", "expo-image": "~56.0.6", - "expo-image-picker": "~56.0.15", + "expo-image-picker": "~56.0.17", "expo-intent-launcher": "~56.0.4", "expo-linear-gradient": "~56.0.4", - "expo-linking": "~56.0.13", - "expo-media-library": "~56.0.6", - "expo-notifications": "~56.0.15", - "expo-router": "~56.2.8", + "expo-linking": "~56.0.14", + "expo-media-library": "~56.0.7", + "expo-notifications": "~56.0.17", + "expo-router": "~56.2.10", "expo-splash-screen": "~56.0.10", - "expo-sqlite": "~56.0.4", + "expo-sqlite": "~56.0.5", "expo-status-bar": "~56.0.4", "expo-system-ui": "~56.0.5", - "expo-task-manager": "~56.0.16", - "expo-updates": "~56.0.17", - "expo-video": "~56.1.2", + "expo-task-manager": "~56.0.18", + "expo-updates": "~56.0.19", + "expo-video": "~56.1.3", "jcore-react-native": "^2.3.6", "jpush-react-native": "^3.2.7", "katex": "^0.17.0", - "livekit-client": "^2.19.0", + "livekit-client": "^2.19.2", "markdown-it": "^14.2.0", "pako": "^2.1.0", "prismjs": "^1.30.0", @@ -1351,15 +1351,15 @@ } }, "node_modules/@expo/expo-modules-macros-plugin": { - "version": "0.0.9", - "resolved": "https://registry.npmmirror.com/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.0.9.tgz", - "integrity": "sha512-odai6D7ng/gA7At8ukFcWcauNEeDdyVqzVPbQxDkyU2NTJ4kgphA4I5iigS5C4LXFicSIzEt2nzdlLM8sjsTdA==", + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.2.2.tgz", + "integrity": "sha512-4IMzPDIo/VOXREQjsJtliSfqYVZvfzU2SLFS/9sKMWF848S8CHx+e/E+Vf0TcMvpWCCKX5umyqxb13KJJ+YUzg==", "license": "MIT" }, "node_modules/@expo/fingerprint": { - "version": "0.19.3", - "resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.19.3.tgz", - "integrity": "sha512-w9Au2IVrtc0Ct+WRa05DVHGNHXYq6VyPZWuFP+5x055OeZ5q6k5Yg+aJ1gfShmjdOhDftRcsvmWmTdTZlWaTZw==", + "version": "0.19.4", + "resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.19.4.tgz", + "integrity": "sha512-PsowRlO8+S7JlO8go7yhNEXp7sqlsWDE2AlCwoss7zH0dcajXFo74Fy0KdXEc4UXK7kKoHD37oDgsZ8aHSLr7A==", "license": "MIT", "dependencies": { "@expo/env": "^2.3.0", @@ -1379,9 +1379,9 @@ } }, "node_modules/@expo/fingerprint/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1418,9 +1418,9 @@ } }, "node_modules/@expo/inline-modules": { - "version": "0.0.10", - "resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.10.tgz", - "integrity": "sha512-DKEfq877UTAmL/gOT5aFhlLNDg/EVmTSca7JQMKDGR6mjFSAcrmQf4GJNsi6ztiaqj6cTnIfoSz0hAYdnr6RJQ==", + "version": "0.0.11", + "resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.11.tgz", + "integrity": "sha512-ZlIfKL61DPnW8YUTdMEjMA31xrDDV6p7Xi8rWYyhd5qXBV8MwGwjuJ7vKeaVaMjRqxJk1N9lv7zlfyvQpRCNNw==", "license": "MIT", "dependencies": { "@expo/config-plugins": "~56.0.8" @@ -1447,9 +1447,9 @@ } }, "node_modules/@expo/log-box": { - "version": "56.0.12", - "resolved": "https://registry.npmmirror.com/@expo/log-box/-/log-box-56.0.12.tgz", - "integrity": "sha512-budE6AGmJbpOJfGSOz+JVP3+FevElT82IEIg+ukQ4gZpW/dGO7QX1unFjanKdSaYgudBwJ4FCFGMwWhW/1tXVQ==", + "version": "56.0.13", + "resolved": "https://registry.npmmirror.com/@expo/log-box/-/log-box-56.0.13.tgz", + "integrity": "sha512-QWRZSpWPyjkDLVQio4R7oAzg/Av2MOt/DciFkfjr8qQ3qxGVn1Rt1oHP/80hvcWDcHFV7N6PqpyxRXw6nbxzKQ==", "license": "MIT", "dependencies": { "@expo/dom-webview": "^56.0.5", @@ -1486,9 +1486,9 @@ } }, "node_modules/@expo/metro-config": { - "version": "56.0.13", - "resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-56.0.13.tgz", - "integrity": "sha512-OPyNYiex/6Ms8zT2POdIZsLhcAZYk7O+yJvpz5uG/4QRA7aiESfCy1I+0YHewMlR4P1YQeyxIrfTurs6m9xfZA==", + "version": "56.0.14", + "resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-56.0.14.tgz", + "integrity": "sha512-O3CIHruaTJhswPAf/nf3i8QQ3f2jl+mEwSea1eb3khuplabdy/wTQz+JvHN8VGUFyg7JKwUGU1QfO6T3JiSQqA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -1511,7 +1511,6 @@ "hermes-parser": "^0.33.3", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", - "msgpackr": "^2.0.1", "picomatch": "^4.0.4", "postcss": "^8.5.14", "resolve-from": "^5.0.0" @@ -1540,19 +1539,19 @@ } }, "node_modules/@expo/metro-runtime": { - "version": "56.0.13", - "resolved": "https://registry.npmmirror.com/@expo/metro-runtime/-/metro-runtime-56.0.13.tgz", - "integrity": "sha512-aMaFa/RPYm2iQoyYOB5q8AxDmWvf4E2yFbZ6rmBIQWaIPDdixGVUlLQeV8DlDAfZ/j+pNYO7l5M+774WbgkTgg==", + "version": "56.0.15", + "resolved": "https://registry.npmmirror.com/@expo/metro-runtime/-/metro-runtime-56.0.15.tgz", + "integrity": "sha512-WIWeVsL6kCSB57oYZdUA4MTkH7c67UFMIjdNoQzKXwxZYwBFE/xL2cGPDC3z8RWt0femzJTVxAVZUOW/hiqRzA==", "license": "MIT", "dependencies": { - "@expo/log-box": "^56.0.12", + "@expo/log-box": "^56.0.13", "anser": "^1.4.9", "pretty-format": "^29.7.0", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0" }, "peerDependencies": { - "@expo/log-box": "^56.0.12", + "@expo/log-box": "^56.0.13", "expo": "*", "react": "*", "react-dom": "*", @@ -1762,9 +1761,9 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "56.0.14", - "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.14.tgz", - "integrity": "sha512-JHdMqR7Mf5ApLC50ZwTL0Z86ezrHOMYwoSHcWT6Pha/+1TcC+/J+i7vjhP06wGXQ2Kvjt74p/3mKg2Pd12KjhQ==", + "version": "56.0.15", + "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.15.tgz", + "integrity": "sha512-6GC+QjdCkzp/5wjsqgfu/B2+2yf5MyZMtzf9szIPrLt9uKhzV2PdyM0vU0kvbj1YT8weHCtO7bsrzimman0sjA==", "license": "MIT", "dependencies": { "@expo/config": "~56.0.9", @@ -1774,15 +1773,15 @@ "@expo/json-file": "^10.2.0", "@react-native/normalize-colors": "0.85.3", "debug": "^4.3.1", - "expo-modules-autolinking": "~56.0.14", + "expo-modules-autolinking": "~56.0.15", "resolve-from": "^5.0.0", "semver": "^7.6.0" } }, "node_modules/@expo/prebuild-config/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1841,9 +1840,9 @@ "license": "MIT" }, "node_modules/@expo/ui": { - "version": "56.0.15", - "resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.15.tgz", - "integrity": "sha512-PFZBzztQGCp2bRFP8wIOb5ntP2ORH2GdQkJMSJcDOd4NldoWMe1pFqv7PdthjNlaaTHHTTHK+RsQrz+M6z6isw==", + "version": "56.0.17", + "resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.17.tgz", + "integrity": "sha512-Jos9oGzurMDngrSWJesX3LSykPRvkUdANxtq2sPKBc6bAjadtZJCkthAYMaE3P9L5xrzbNRFo+2O76cRP0iYPw==", "license": "MIT", "dependencies": { "sf-symbols-typescript": "^2.1.0", @@ -1884,12 +1883,6 @@ "react-native": "*" } }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "license": "MIT" - }, "node_modules/@expo/xcpretty": { "version": "4.4.4", "resolved": "https://registry.npmmirror.com/@expo/xcpretty/-/xcpretty-4.4.4.tgz", @@ -2181,84 +2174,6 @@ } } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", - "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", - "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", - "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", - "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", - "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", - "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@nodable/entities": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/@nodable/entities/-/entities-2.1.1.tgz", @@ -4048,9 +3963,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "56.0.14", - "resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-56.0.14.tgz", - "integrity": "sha512-+JKVMYf3HajO3tPRA9DlKd/VhZOPTHyTzUo2yZajfMAoQ3l5VEdGVxm2MzX4DXMNKXwsC8GOeTRx7CrO/5dBDA==", + "version": "56.0.15", + "resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-56.0.15.tgz", + "integrity": "sha512-0MqbQoM6nBUbKvgu2xJ4VixZnUTGTq3HB2WwvOikdO4CiPxbQ+wGA25fOoHHSni5iEFW39wy6y1ookTWlq3wVw==", "license": "MIT", "dependencies": { "@babel/generator": "^7.20.5", @@ -4099,7 +4014,7 @@ "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", - "expo-widgets": "^56.0.16", + "expo-widgets": "^56.0.18", "react-refresh": ">=0.14.0 <1.0.0" }, "peerDependenciesMeta": { @@ -5047,9 +4962,9 @@ "license": "MIT" }, "node_modules/dnssd-advertise": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz", - "integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==", + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/dnssd-advertise/-/dnssd-advertise-1.1.6.tgz", + "integrity": "sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==", "license": "MIT" }, "node_modules/dom-accessibility-api": { @@ -5419,31 +5334,31 @@ } }, "node_modules/expo": { - "version": "56.0.8", - "resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.8.tgz", - "integrity": "sha512-GzQi5450yrCk5JRSlm0epsmtURBErh0wS77uWLZImFdnPICuX912MaRWooR+Q1Sw/7aQjp9F+KXH+dvrqGxpeQ==", + "version": "56.0.11", + "resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.11.tgz", + "integrity": "sha512-YqF+q+JqfobDU5yFym3h1vQqzbl7rFiDB4wAJEyK6NK+KLeyf4pfzydQcNTyqLXQKcQBG1reBJExfDShoAYTzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "^56.1.13", + "@expo/cli": "^56.1.15", "@expo/config": "~56.0.9", "@expo/config-plugins": "~56.0.8", "@expo/devtools": "~56.0.2", "@expo/dom-webview": "~56.0.5", - "@expo/fingerprint": "^0.19.3", + "@expo/fingerprint": "^0.19.4", "@expo/local-build-cache-provider": "^56.0.8", - "@expo/log-box": "^56.0.12", + "@expo/log-box": "^56.0.13", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~56.0.13", + "@expo/metro-config": "~56.0.14", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~56.0.14", - "expo-asset": "~56.0.15", - "expo-constants": "~56.0.16", - "expo-file-system": "~56.0.7", - "expo-font": "~56.0.5", + "babel-preset-expo": "~56.0.15", + "expo-asset": "~56.0.17", + "expo-constants": "~56.0.18", + "expo-file-system": "~56.0.8", + "expo-font": "~56.0.6", "expo-keep-awake": "~56.0.3", - "expo-modules-autolinking": "~56.0.14", - "expo-modules-core": "~56.0.14", + "expo-modules-autolinking": "~56.0.15", + "expo-modules-core": "~56.0.16", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-minimum": "^0.1.2" @@ -5490,13 +5405,13 @@ } }, "node_modules/expo-asset": { - "version": "56.0.15", - "resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-56.0.15.tgz", - "integrity": "sha512-BHGi2IAOPQTcOelkUdcz1WIknfCTRjkcpYHX1azjMwgYenrVC+J5qcqJGaC8eUOWLCRtkRJWGnmFQRYtLU1nUQ==", + "version": "56.0.17", + "resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-56.0.17.tgz", + "integrity": "sha512-GFN5j+8SPkyv0nfsiFHewmdB/D0tL237TsBE/gSfFOFy/J3a52py7IulcSqkA3sQE/u/UlD5BmvP5ssS4//nUg==", "license": "MIT", "dependencies": { "@expo/image-utils": "^0.10.1", - "expo-constants": "~56.0.16" + "expo-constants": "~56.0.18" }, "peerDependencies": { "expo": "*", @@ -5505,21 +5420,21 @@ } }, "node_modules/expo-background-task": { - "version": "56.0.16", - "resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.16.tgz", - "integrity": "sha512-co1RmfOxBLvnkPx5J5d/wzGGjE/UnyEEH/9ZO4yauiYSy33BjD2dAynxtXfNnRwbkTBmvSiciVwDh8RdZIboyw==", + "version": "56.0.18", + "resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.18.tgz", + "integrity": "sha512-jfEvLq/hZUWkef+lOt0sbe/Jd8wnK0fMgqsZhD1ulWk1IKB0AWsjmJ0iCTDMD9L9MDztpvKf2g/ygzljmo2eGA==", "license": "MIT", "dependencies": { - "expo-task-manager": "~56.0.16" + "expo-task-manager": "~56.0.18" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-callkit-telecom": { - "version": "0.3.8", - "resolved": "https://registry.npmmirror.com/expo-callkit-telecom/-/expo-callkit-telecom-0.3.8.tgz", - "integrity": "sha512-Jh3tOMBD5JHCMF8EumOSqT/bQgWUhmCn9EwMZm9LT1mhWWmNQ7wKwAOYGdF7P4i4dtPDj0HG7u7fuljzt4bmQw==", + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/expo-callkit-telecom/-/expo-callkit-telecom-0.3.9.tgz", + "integrity": "sha512-dSV6mRp4LEtbseRR4ieVn/zLLJCAQrhbghgZHhe1fnbpwbFsB/iZ5/13ySN10PQKFSQTRU3w6+c/SEKWm7cxOA==", "license": "MIT", "peerDependencies": { "@livekit/react-native-webrtc": ">=144.0.0", @@ -5530,9 +5445,9 @@ } }, "node_modules/expo-camera": { - "version": "56.0.7", - "resolved": "https://registry.npmmirror.com/expo-camera/-/expo-camera-56.0.7.tgz", - "integrity": "sha512-c8z+UheidFintQyP9XLEDP43aK4PS/o9+TFLW0zEOjdqkYCBgoWq6Mw/Ps62kjBeftFY7xrp5ZLITbenNvbTaw==", + "version": "56.0.8", + "resolved": "https://registry.npmmirror.com/expo-camera/-/expo-camera-56.0.8.tgz", + "integrity": "sha512-UDOpUUMisFRmCv1XQV1MJCKGAH2CsIC1Rs6P9Bbc6JLVmbxEKAd5dK68y6cScOdWURxVfJ0PRcjYnSuc8ayyIQ==", "license": "MIT", "dependencies": { "barcode-detector": "^3.0.0" @@ -5550,9 +5465,9 @@ } }, "node_modules/expo-constants": { - "version": "56.0.16", - "resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-56.0.16.tgz", - "integrity": "sha512-6tsiN+gmTUPp/atyA+uY9Tg8VOdXdmb4s/3TVGolfn6A/oCAraw1pcPZX5XllyD+xUguxB6eBSFAT8494hZVMA==", + "version": "56.0.18", + "resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-56.0.18.tgz", + "integrity": "sha512-8AMtbDGl/WVPnWlmbpGmvcdnNCy9E4PFnwdVwj600vljkMDPSxcAcjw8GVXEPk3PpZ+ngTqsrkltWyj0UKYAxw==", "license": "MIT", "dependencies": { "@expo/env": "~2.3.0" @@ -5563,13 +5478,13 @@ } }, "node_modules/expo-dev-client": { - "version": "56.0.18", - "resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-56.0.18.tgz", - "integrity": "sha512-pTfDcYTOvrs4vCgAaM+vP2OEO93oGkczgGpTAzCY7ZTIvtPhpekJURHBxfOnKvfn97IF3Hk+8J9tMozsNDj0Gw==", + "version": "56.0.20", + "resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-56.0.20.tgz", + "integrity": "sha512-KebW4r8HhIiRrPzs6ZqVhp/so8buyglAO1h4No0Ibr5C2XRnlIoGWCN4zC6rW7IsI3iKUXcofLAQV9OjoxjiwQ==", "license": "MIT", "dependencies": { - "expo-dev-launcher": "~56.0.18", - "expo-dev-menu": "~56.0.16", + "expo-dev-launcher": "~56.0.20", + "expo-dev-menu": "~56.0.17", "expo-dev-menu-interface": "~56.0.0", "expo-manifests": "~56.0.4", "expo-updates-interface": "~56.0.1" @@ -5579,13 +5494,13 @@ } }, "node_modules/expo-dev-launcher": { - "version": "56.0.18", - "resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-56.0.18.tgz", - "integrity": "sha512-7acFJlkAbp3cMz7Uy787todMR/3A/Row2EOPD21RRoetvzJe4DTm9s7RwJ8PDtyNyued9rooD4+Q6rD8ijpTgw==", + "version": "56.0.20", + "resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-56.0.20.tgz", + "integrity": "sha512-cTuC3GkPl9CTwO3CKnVmEm9qoQ0WairhwvTh6qMlg+zr/QU/tdiU++uDBX67hf9+FuxQOkWGp5khFNosT+0cIg==", "license": "MIT", "dependencies": { "@expo/schema-utils": "^56.0.0", - "expo-dev-menu": "~56.0.16", + "expo-dev-menu": "~56.0.17", "expo-manifests": "~56.0.4" }, "peerDependencies": { @@ -5594,9 +5509,9 @@ } }, "node_modules/expo-dev-menu": { - "version": "56.0.16", - "resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-56.0.16.tgz", - "integrity": "sha512-aVgoe+YGhrQnpwiB5BRI7G+uQnGHMUij32bBnEVdc6eJrVZCStxQlV9NeFbbXxrDhLJt6OSqbCHbLR+XToWUUA==", + "version": "56.0.17", + "resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-56.0.17.tgz", + "integrity": "sha512-OofRkOOZnaDriSav3JDN4NP2lsLt2eOa/Ryptr5nMD62SwnFyK4R6n6PkPVaDU3LSsZqndAJHmN6inS+oziayQ==", "license": "MIT", "dependencies": { "expo-dev-menu-interface": "~56.0.0" @@ -5622,9 +5537,9 @@ "license": "MIT" }, "node_modules/expo-file-system": { - "version": "56.0.7", - "resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-56.0.7.tgz", - "integrity": "sha512-dcKzo8ShPloM7jgfnMcJStgQebhP8owVjCkNI/aX6NMFV1CYB8bxKGMdnzJ3mXk5nfaiW+F/lSKr2UIJ02WAUA==", + "version": "56.0.8", + "resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-56.0.8.tgz", + "integrity": "sha512-NrH41/8snGIBSbYicwVLB4txPdgCATd7ZYhMAGS3YJZ9GbnduhlAoV4/YCbGayjrbpE9bJb/6wegPL/zmvRMnQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5632,9 +5547,9 @@ } }, "node_modules/expo-font": { - "version": "56.0.5", - "resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.5.tgz", - "integrity": "sha512-WLoDu9hlEgPRKXJRR01HFLJ6Z2tFcORX/WFPRYBndmYc5kjQrFGH/j4BRaF3aBRPyYEAUXiUJybNLXkKCwEXQw==", + "version": "56.0.6", + "resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.6.tgz", + "integrity": "sha512-D4s72Aei844C2s8Vy61qMr6wLEjv6BMrXA1oyRQ0x8LJBbpm5gyogUohc0lABUURVLCqsnBIDdztegl3hktmmg==", "license": "MIT", "dependencies": { "fontfaceobserver": "^2.1.0" @@ -5695,9 +5610,9 @@ } }, "node_modules/expo-image-picker": { - "version": "56.0.15", - "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.15.tgz", - "integrity": "sha512-7zmrUcqiNKwGGGL114gC+1aaquhmMbaXCNSHjUcoINdBzvIEVMJDm+DNCxkpftEYeb17X3shqInI4lCgJNVO5g==", + "version": "56.0.17", + "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.17.tgz", + "integrity": "sha512-/RojW1ptyQNV89hEeDdaoHCkn38+546MqakMyB0acFf0HLh5ZI7wxQCHkxr16qjuQMy11M+96GlX9Z6vgXF7Nw==", "license": "MIT", "dependencies": { "expo-image-loader": "~56.0.3" @@ -5743,12 +5658,12 @@ } }, "node_modules/expo-linking": { - "version": "56.0.13", - "resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-56.0.13.tgz", - "integrity": "sha512-38YrpTh6xdiDxmYSDIUffDqev1hIcEggw2fZ3IZhNp2DVLF1xvqsbO6hJD1fuBKN8P34B3Ggc9Yy26fkqdfCOA==", + "version": "56.0.14", + "resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-56.0.14.tgz", + "integrity": "sha512-IvVQHWC+Cj4fK5qD3iEVYqpU2a4rLW0IpAAlGJ4MH+H1fyZiHh3eN6qg2WmoclOEPfYATSuEa+dQT6wfgVpXlQ==", "license": "MIT", "dependencies": { - "expo-constants": "~56.0.16", + "expo-constants": "~56.0.18", "invariant": "^2.2.4" }, "peerDependencies": { @@ -5769,9 +5684,9 @@ } }, "node_modules/expo-media-library": { - "version": "56.0.6", - "resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-56.0.6.tgz", - "integrity": "sha512-UsyVcxP7Op9ErFFLW1xImjoKFgKi7XSw8hrCfzf2yIG+OgVb9dsQth0mVRPgfRxdELagsUslXc1QXTiW8dpbaQ==", + "version": "56.0.7", + "resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-56.0.7.tgz", + "integrity": "sha512-lVsXsagjDYuySr+WWvc6BfRHTXttnWeVX4qMP2ls7JyAVSECQOAQpqz47uZiJsEohtpCoDTLRL2mcn/XY8fLoQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5779,9 +5694,9 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "56.0.14", - "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.14.tgz", - "integrity": "sha512-9ugtZkheNPYDkW4DZopY1rH2BCbUICaafUEPxRgbLDR5UNRF5K3cdHMIMEt8pxZPq2+eX4wCm+6pbSvdY/DPHg==", + "version": "56.0.15", + "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.15.tgz", + "integrity": "sha512-WqpBFwLzn7DsrUkWltIjVmAjwuI1VdQ2jRMlvk1nh2kVadwdJBkSjUBQWRifsEePNhiMT/rFOovBolUU/ARt5w==", "license": "MIT", "dependencies": { "@expo/require-utils": "^56.1.3", @@ -5803,13 +5718,13 @@ } }, "node_modules/expo-modules-core": { - "version": "56.0.14", - "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.14.tgz", - "integrity": "sha512-dl1TlYRm1k7xk9QeAyDoMfFE2p6rNyzHUcH5ArcGwUzO8YKku+Z2tQ8+kG7zLe3OhfMoJcFR/czrFy7vGSVI6w==", + "version": "56.0.16", + "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.16.tgz", + "integrity": "sha512-IVdT0CnqOpQCPdemA5rb50CPbbhWeJePnvuH0yUmOmyMkNky8WVOdRQtVicoIv4CCG5hDrzPIxULD4YOHZ5CHg==", "license": "MIT", "dependencies": { - "@expo/expo-modules-macros-plugin": "~0.0.9", - "expo-modules-jsi": "~56.0.7", + "@expo/expo-modules-macros-plugin": "0.2.2", + "expo-modules-jsi": "~56.0.9", "invariant": "^2.2.4" }, "peerDependencies": { @@ -5824,25 +5739,25 @@ } }, "node_modules/expo-modules-jsi": { - "version": "56.0.7", - "resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.7.tgz", - "integrity": "sha512-iBAj4Xeh/8HT201VVxFlmf+VBfmtQV1ZUoJdLQQENm0+j9gnD2QswZLJyNo3CmNNXl46esJeLR5lpGpYZts/zA==", + "version": "56.0.9", + "resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.9.tgz", + "integrity": "sha512-2lfDkRcsP/Qh2upS+nu0MS0tfGsghc6ehTivzbgM5nJz0MGYhAJxCJSeendWM+aOQutQAwzsoxrNT0nW8lRAwA==", "license": "MIT", "peerDependencies": { "react-native": "*" } }, "node_modules/expo-notifications": { - "version": "56.0.15", - "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.15.tgz", - "integrity": "sha512-F+OasAePiVnHaPNKI9JAYV8fg8bdBwo7Mh9R3ydBp8S21fRQyxKOSgJvj8fX/HoPFFIC6V2B+y1LJbG5Ovh/Fg==", + "version": "56.0.17", + "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.17.tgz", + "integrity": "sha512-Yn6JUKmoBDkQeznbuUn4cHF2u44r1ErJTneW65MBFt7NLG8U8/VGQ4bBVwswm5nPH1/V92UoXPgvCssScPFRDg==", "license": "MIT", "dependencies": { "@expo/image-utils": "^0.10.1", "abort-controller": "^3.0.0", "badgin": "^1.1.5", "expo-application": "~56.0.3", - "expo-constants": "~56.0.16" + "expo-constants": "~56.0.18" }, "peerDependencies": { "expo": "*", @@ -5851,15 +5766,15 @@ } }, "node_modules/expo-router": { - "version": "56.2.8", - "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.8.tgz", - "integrity": "sha512-l387I/ddPY/5SS+Rfpp1SrRV9gBKevxtPuZod7igMjR6L674QrxEwGiAILRq6AKCSbrP2I0ufKj7e5xz8JqA4Q==", + "version": "56.2.10", + "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.10.tgz", + "integrity": "sha512-u7WcdsFAjSrQS7Bdb1VbNPE3xNcd/BZ6qXSS31UAJKhaYIb+ik3jJSy/W5kY3qKipwbwlo3CSb1WnZ2XYs7F+Q==", "license": "MIT", "dependencies": { - "@expo/log-box": "^56.0.12", - "@expo/metro-runtime": "^56.0.13", + "@expo/log-box": "^56.0.13", + "@expo/metro-runtime": "^56.0.15", "@expo/schema-utils": "^56.0.0", - "@expo/ui": "^56.0.15", + "@expo/ui": "^56.0.17", "@radix-ui/react-slot": "^1.2.0", "@radix-ui/react-tabs": "^1.1.12", "@react-native-masked-view/masked-view": "^0.3.2", @@ -5870,8 +5785,8 @@ "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "expo-glass-effect": "^56.0.4", - "expo-server": "^56.0.4", - "expo-symbols": "^56.0.5", + "expo-server": "^56.0.5", + "expo-symbols": "^56.0.6", "fast-deep-equal": "^3.1.3", "invariant": "^2.2.4", "nanoid": "^3.3.8", @@ -5883,15 +5798,16 @@ "server-only": "^0.0.1", "sf-symbols-typescript": "^2.1.0", "shallowequal": "^1.1.0", + "standard-navigation": "^0.0.5", "vaul": "^1.1.2" }, "peerDependencies": { - "@expo/log-box": "^56.0.12", - "@expo/metro-runtime": "^56.0.13", + "@expo/log-box": "^56.0.13", + "@expo/metro-runtime": "^56.0.15", "@testing-library/react-native": ">= 13.2.0", "expo": "*", - "expo-constants": "^56.0.16", - "expo-linking": "^56.0.13", + "expo-constants": "^56.0.18", + "expo-linking": "^56.0.14", "react": "*", "react-dom": "*", "react-native": "*", @@ -5924,9 +5840,9 @@ } }, "node_modules/expo-server": { - "version": "56.0.4", - "resolved": "https://registry.npmmirror.com/expo-server/-/expo-server-56.0.4.tgz", - "integrity": "sha512-4dJ57KuAwDl7eQGD6aG9kTzBIftWAfHH1+6Zxy7NcPCBrKYis3/H5enGUz1asH8HHhONXfJ5BdJqfEWAEAgWxA==", + "version": "56.0.5", + "resolved": "https://registry.npmmirror.com/expo-server/-/expo-server-56.0.5.tgz", + "integrity": "sha512-SmM2p2g3Jrktpiazcst+OxhjSzOHXKAY4BPURHYHXvApzzoybMmrNF4IEZ8DKZ145BhSe4ydAmlEFCRTsdtgUQ==", "license": "MIT", "engines": { "node": ">=20.16.0" @@ -5947,9 +5863,9 @@ } }, "node_modules/expo-sqlite": { - "version": "56.0.4", - "resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-56.0.4.tgz", - "integrity": "sha512-Ak8TUyrvK7C/J4BHBfcb8BacFrH8I+b+zqeSTKg5B02Z13lxljvuqI8UvKbRNa5BKprlxrqabZickGwacRkM9g==", + "version": "56.0.5", + "resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-56.0.5.tgz", + "integrity": "sha512-wHYRVLS5nUFEtli45wHaO+RjlRY8sQXyOSgENVk6I4zq7+FgySqjOk3YOYW6IKIMwhj5XzjMJO+pY8xKUy73Kw==", "license": "MIT", "dependencies": { "await-lock": "^2.2.2" @@ -5978,9 +5894,9 @@ "license": "MIT" }, "node_modules/expo-symbols": { - "version": "56.0.5", - "resolved": "https://registry.npmmirror.com/expo-symbols/-/expo-symbols-56.0.5.tgz", - "integrity": "sha512-RIukH0Xo80C7RU8qreipL2SPy2Py+Km8JFPbCmbPQpHkM3DW9Znlmg6VfhzbtUOlO5EuNSF0lAJ3l2VJi6qYrw==", + "version": "56.0.6", + "resolved": "https://registry.npmmirror.com/expo-symbols/-/expo-symbols-56.0.6.tgz", + "integrity": "sha512-BrA81DjcNafdj7gXVhdrExb9LtUiSVyOf/NavyMmDAHgHMY1GqeR5cnn1PSAZeYKnSgQhee/H89XUpAxtog5hg==", "license": "MIT", "dependencies": { "@expo-google-fonts/material-symbols": "^0.4.1", @@ -6014,9 +5930,9 @@ } }, "node_modules/expo-task-manager": { - "version": "56.0.16", - "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.16.tgz", - "integrity": "sha512-wh5DOzUkQfpXs2fmm9QYlPoNiJRgnCI926m2hoVDFYD8yENnDYYXQEON8uYgnepYmActr/KAMBxmw6BOmTky/Q==", + "version": "56.0.18", + "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.18.tgz", + "integrity": "sha512-abTKDhlZ572wSwNuZ9HkDw6rl+kKLq0TkqheIEbGoRkMQVEGV3D5GYYY0gg84TO/HvAqiipdcBFQH8+9uHj70Q==", "license": "MIT", "dependencies": { "unimodules-app-loader": "~56.0.0" @@ -6027,9 +5943,9 @@ } }, "node_modules/expo-updates": { - "version": "56.0.17", - "resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-56.0.17.tgz", - "integrity": "sha512-4005IRQQ7Vpwb01X3NSG0SwY61HTJzT2pZ0OrkeZ6guQE1WKiRfUKisekRgYXTI8sPbxSHUc9aOpIx6yC49XZQ==", + "version": "56.0.19", + "resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-56.0.19.tgz", + "integrity": "sha512-tTSPYO5h8wDA6a+wQ2v/SRdnOdz29x0npGHCv+4Ev31Fz5r05Ii1Wgfh3BlTXNz8mikMReDsZCf6YN71YeQKpw==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", @@ -6079,9 +5995,9 @@ "license": "MIT" }, "node_modules/expo-video": { - "version": "56.1.2", - "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.2.tgz", - "integrity": "sha512-NPdbwcPfPd7lgOcgTFi7m7Dqp1+3OSXJHrUDU4tXA/Ly4vuNpe35eZNA21F/OJtJqk/nw3r6PDZnSqw5XY0p6w==", + "version": "56.1.3", + "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.3.tgz", + "integrity": "sha512-Ht2BMdx11RnGKxILL/P4t/hl4kqWXq1vLaoOrLZlDed+IXgf8hdDI9jmtEEgsIHwf3jaHFXblJCRVuS9mIxKAw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -6090,9 +6006,9 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "56.1.13", - "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.13.tgz", - "integrity": "sha512-7n5VzlBr7TKW0BgWgpEopWy+v8buPhMvbSEsuXD+bI1YIJBopkfWAub0qTvlc357E8wWOvV5MJXYyoeRvoOjoQ==", + "version": "56.1.15", + "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.15.tgz", + "integrity": "sha512-ik6++YzURB2d/mSEfYwbuNa19uOWZwVHy9THCQ/pPr6mzplKl4w9I4nlYF9lx7oluNC3NvxsSZ8/rgpVKEOJTA==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", @@ -6101,21 +6017,21 @@ "@expo/devcert": "^1.2.1", "@expo/env": "~2.3.0", "@expo/image-utils": "^0.10.1", - "@expo/inline-modules": "^0.0.10", + "@expo/inline-modules": "^0.0.11", "@expo/json-file": "^10.2.0", - "@expo/log-box": "^56.0.12", + "@expo/log-box": "^56.0.13", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~56.0.13", + "@expo/metro-config": "~56.0.14", "@expo/metro-file-map": "^56.0.3", "@expo/osascript": "^2.6.0", "@expo/package-manager": "^1.12.1", "@expo/plist": "^0.7.0", - "@expo/prebuild-config": "^56.0.14", + "@expo/prebuild-config": "^56.0.15", "@expo/require-utils": "^56.1.3", - "@expo/router-server": "^56.0.12", + "@expo/router-server": "^56.0.13", "@expo/schema-utils": "^56.0.0", "@expo/spawn-async": "^1.8.0", - "@expo/ws-tunnel": "^1.0.1", + "@expo/ws-tunnel": "^2.0.0", "@expo/xcpretty": "^4.4.4", "@react-native/dev-middleware": "0.85.3", "accepts": "^1.3.8", @@ -6128,7 +6044,7 @@ "connect": "^3.7.0", "debug": "^4.3.4", "dnssd-advertise": "^1.1.4", - "expo-server": "^56.0.4", + "expo-server": "^56.0.5", "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -6171,20 +6087,20 @@ } }, "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { - "version": "56.0.12", - "resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-56.0.12.tgz", - "integrity": "sha512-RqKV2/Z8BH/z8l0ngSpG6//5xxJPaF5dTQvSfPQ0nrvCjikGMeIvyj3B9BeLnmZZhxb3gBtXqrj3irAoiIp2aQ==", + "version": "56.0.14", + "resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-56.0.14.tgz", + "integrity": "sha512-2UCTtZfcq1ZPgp3wk8/+sq9DvFI9UxrPr1jcEKMAF2DGAJLosnpc8GWNNg2hkjt6SHUOdFHIPxujWPYyho2y3A==", "license": "MIT", "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { - "@expo/metro-runtime": "^56.0.13", + "@expo/metro-runtime": "^56.0.15", "expo": "*", - "expo-constants": "^56.0.16", - "expo-font": "^56.0.5", + "expo-constants": "^56.0.18", + "expo-font": "^56.0.6", "expo-router": "*", - "expo-server": "^56.0.4", + "expo-server": "^56.0.5", "react": "*", "react-dom": "*", "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" @@ -6204,6 +6120,15 @@ } } }, + "node_modules/expo/node_modules/@expo/ws-tunnel": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz", + "integrity": "sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==", + "license": "MIT", + "peerDependencies": { + "ws": "^8.0.0" + } + }, "node_modules/expo/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -6368,9 +6293,9 @@ } }, "node_modules/expo/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -8382,9 +8307,9 @@ } }, "node_modules/livekit-client": { - "version": "2.19.1", - "resolved": "https://registry.npmmirror.com/livekit-client/-/livekit-client-2.19.1.tgz", - "integrity": "sha512-knwEuozt3d7optuUMvw+0PGrV/68GWXrTdAefezOM51Dk8QLb28qOm73UMSSQET58gUqelxqU1afchd2YyPKnQ==", + "version": "2.19.2", + "resolved": "https://registry.npmmirror.com/livekit-client/-/livekit-client-2.19.2.tgz", + "integrity": "sha512-Kvk07QYDWRAbmYNLRll04ZIuxMQobW/oLPYnmR1kCy8GGHpU0gqyHf704Rz+29zfy8IJZRjKqeVbzGSKn9sumw==", "license": "Apache-2.0", "dependencies": { "@livekit/mutex": "1.1.1", @@ -9252,37 +9177,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/msgpackr": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/msgpackr/-/msgpackr-2.0.2.tgz", - "integrity": "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ==", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.4" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", - "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" - } - }, "node_modules/multitars": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/multitars/-/multitars-1.0.0.tgz", @@ -9355,21 +9249,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", @@ -9415,9 +9294,9 @@ } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11405,6 +11284,12 @@ "node": ">=6" } }, + "node_modules/standard-navigation": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/standard-navigation/-/standard-navigation-0.0.5.tgz", + "integrity": "sha512-YAmzwAiiQVocZxO/VGPFiQHcu5pKiz09QIGC0MK6aRMoa3E0QkoTQgcqJr7ZZ3OMiNhu4DkaGElFI5htjOIDbw==", + "license": "MIT" + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", diff --git a/package.json b/package.json index 366ece3..92824d9 100644 --- a/package.json +++ b/package.json @@ -14,43 +14,44 @@ "ios:submit": "eas submit --platform ios --profile production" }, "dependencies": { - "@expo/ui": "^56.0.15", + "@expo/ui": "~56.0.17", "@expo/vector-icons": "^15.1.1", "@livekit/react-native": "^2.11.0", "@livekit/react-native-webrtc": "^144.1.0", "@react-native-async-storage/async-storage": "^3.1.1", "@shopify/flash-list": "^2.3.1", "@tanstack/react-query": "^5.100.14", + "@types/react": "~19.2.14", "axios": "^1.16.1", "date-fns": "^4.4.0", - "expo": "^56.0.8", - "expo-background-task": "~56.0.16", - "expo-callkit-telecom": "^0.3.8", - "expo-camera": "~56.0.7", - "expo-constants": "~56.0.16", - "expo-dev-client": "~56.0.18", - "expo-file-system": "~56.0.7", - "expo-font": "~56.0.5", + "expo": "~56.0.11", + "expo-background-task": "~56.0.18", + "expo-callkit-telecom": "^0.3.9", + "expo-camera": "~56.0.8", + "expo-constants": "~56.0.18", + "expo-dev-client": "~56.0.20", + "expo-file-system": "~56.0.8", + "expo-font": "~56.0.6", "expo-haptics": "~56.0.3", "expo-image": "~56.0.6", - "expo-image-picker": "~56.0.15", + "expo-image-picker": "~56.0.17", "expo-intent-launcher": "~56.0.4", "expo-linear-gradient": "~56.0.4", - "expo-linking": "~56.0.13", - "expo-media-library": "~56.0.6", - "expo-notifications": "~56.0.15", - "expo-router": "~56.2.8", + "expo-linking": "~56.0.14", + "expo-media-library": "~56.0.7", + "expo-notifications": "~56.0.17", + "expo-router": "~56.2.10", "expo-splash-screen": "~56.0.10", - "expo-sqlite": "~56.0.4", + "expo-sqlite": "~56.0.5", "expo-status-bar": "~56.0.4", "expo-system-ui": "~56.0.5", - "expo-task-manager": "~56.0.16", - "expo-updates": "~56.0.17", - "expo-video": "~56.1.2", + "expo-task-manager": "~56.0.18", + "expo-updates": "~56.0.19", + "expo-video": "~56.1.3", "jcore-react-native": "^2.3.6", "jpush-react-native": "^3.2.7", "katex": "^0.17.0", - "livekit-client": "^2.19.0", + "livekit-client": "^2.19.2", "markdown-it": "^14.2.0", "pako": "^2.1.0", "prismjs": "^1.30.0", diff --git a/src/app-navigation/AppDesktopShell.tsx b/src/app-navigation/AppDesktopShell.tsx index 300c5ba..7e0e4b1 100644 --- a/src/app-navigation/AppDesktopShell.tsx +++ b/src/app-navigation/AppDesktopShell.tsx @@ -172,7 +172,7 @@ export function AppDesktopShell() { const handleTabChange = useCallback( (href: string) => { - router.replace(href); + router.push(href); }, [router] ); diff --git a/src/components/business/PostRefCard.tsx b/src/components/business/PostRefCard.tsx index bc812cf..bf5be81 100644 --- a/src/components/business/PostRefCard.tsx +++ b/src/components/business/PostRefCard.tsx @@ -6,6 +6,7 @@ import { useRouter } from 'expo-router'; import Text from '../common/Text'; import { useAppColors, spacing, borderRadius } from '../../theme'; import type { PostRefSegmentData } from '../../types'; +import * as hrefs from '../../navigation/hrefs'; interface PostRefCardProps { data: PostRefSegmentData; @@ -21,7 +22,7 @@ const PostRefCard: React.FC = ({ data, compact = false, onPres if (onPress) { onPress(data.post_id); } else { - router.push(`/post/${data.post_id}` as any); + router.push(hrefs.hrefPostDetail(data.post_id)); } }, [data.post_id, onPress, router]); diff --git a/src/hooks/index.ts b/src/hooks/index.ts index b2232fe..5564a1f 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -70,6 +70,9 @@ export { useMediaCache } from './useMediaCache'; export type { UseMediaCacheReturn } from './useMediaCache'; +// ==================== 推送设备注册 Hook ==================== +export { useRegisterPushDevice } from './useRegisterPushDevice'; + // ==================== 差异更新 Hooks ==================== export { useDifferentialMessages } from './useDifferentialMessages'; diff --git a/src/hooks/useRegisterPushDevice.ts b/src/hooks/useRegisterPushDevice.ts new file mode 100644 index 0000000..05c8cd6 --- /dev/null +++ b/src/hooks/useRegisterPushDevice.ts @@ -0,0 +1,29 @@ +import { useEffect, useRef } from 'react'; +import { Platform } from 'react-native'; + +import { jpushService } from '../services/notification/jpushService'; + +export function useRegisterPushDevice(isAuthenticated: boolean, userID?: string) { + const deviceRegistered = useRef(false); + + useEffect(() => { + if (Platform.OS === 'web' || !isAuthenticated || !userID) return; + + if (!deviceRegistered.current) { + deviceRegistered.current = true; + + jpushService.initialize().then((ok) => { + if (ok && userID) { + jpushService.setAliasForUser(userID); + } + }); + } + + return () => { + if (!isAuthenticated) { + deviceRegistered.current = false; + jpushService.cleanup(); + } + }; + }, [isAuthenticated, userID]); +} diff --git a/src/navigation/hrefs.ts b/src/navigation/hrefs.ts index 1a11461..342e6eb 100644 --- a/src/navigation/hrefs.ts +++ b/src/navigation/hrefs.ts @@ -2,13 +2,16 @@ * Expo Router 路径构建(单一事实来源,避免魔法字符串散落) */ import type { SystemMessageResponse } from '../types/dto'; -import { routePayloadCache } from '../stores'; export function hrefPostDetail(postId: string, scrollToComments?: boolean): string { const q = scrollToComments ? '?scrollToComments=1' : ''; return `/post/${encodeURIComponent(postId)}${q}`; } +export function hrefTradeDetail(tradeId: string): string { + return `/trade/${encodeURIComponent(tradeId)}`; +} + export function hrefUserProfile(userId: string): string { return `/user/${encodeURIComponent(userId)}`; } @@ -124,12 +127,10 @@ export function hrefGroupMembers(groupId: string): string { } export function hrefGroupRequestDetail(message: SystemMessageResponse): string { - routePayloadCache.stashSystemMessage(message); return `/group/request?messageId=${encodeURIComponent(message.id)}`; } export function hrefGroupInviteDetail(message: SystemMessageResponse): string { - routePayloadCache.stashSystemMessage(message); return `/group/invite?messageId=${encodeURIComponent(message.id)}`; } diff --git a/src/screens/home/HomeScreen.tsx b/src/screens/home/HomeScreen.tsx index ba0cfe4..8b4ebf4 100644 --- a/src/screens/home/HomeScreen.tsx +++ b/src/screens/home/HomeScreen.tsx @@ -716,7 +716,7 @@ export const HomeScreen: React.FC = () => { // 跳转到发帖页面(使用 Modal 方式) const handleCreatePost = () => { if (!isAuthenticated) { - router.push('/login'); + router.push(hrefs.hrefAuthLogin()); return; } if (!isVerified) { @@ -1052,7 +1052,7 @@ export const HomeScreen: React.FC = () => { floatingButtonBottom !== undefined && { bottom: floatingButtonBottom }, ]} onPress={homeTab === 'market' ? () => { - if (!isAuthenticated) { router.push('/login'); return; } + if (!isAuthenticated) { router.push(hrefs.hrefAuthLogin()); return; } if (!isVerified) { router.push(hrefs.hrefVerificationGuide()); return; } setShowCreateTrade(true); } : handleCreatePost} diff --git a/src/screens/home/MarketView.tsx b/src/screens/home/MarketView.tsx index 1dfb4c5..5734f96 100644 --- a/src/screens/home/MarketView.tsx +++ b/src/screens/home/MarketView.tsx @@ -14,6 +14,7 @@ import type { } from '../../types/trade'; import { useRouter } from 'expo-router'; import { useResponsive, useResponsiveSpacing } from '../../hooks'; +import * as hrefs from '../../navigation/hrefs'; type TradeFilterType = 'all' | 'sell' | 'buy'; @@ -137,7 +138,7 @@ export function MarketView({ }, [isLoadingMore, hasMore, cursor, filterType, selectedCategory]); const handlePressItem = useCallback((id: string) => { - router.push(`/trade/${id}` as any); + router.push(hrefs.hrefTradeDetail(id)); }, [router]); const handleFavorite = useCallback(async (id: string) => { diff --git a/src/screens/home/SearchScreen.tsx b/src/screens/home/SearchScreen.tsx index aee243c..81b41aa 100644 --- a/src/screens/home/SearchScreen.tsx +++ b/src/screens/home/SearchScreen.tsx @@ -472,7 +472,7 @@ export const SearchScreen: React.FC = ({ onBack, homeTab = 's router.push(`/trade/${id}` as any)} + onPress={(id) => router.push(hrefs.hrefTradeDetail(id))} /> )} diff --git a/src/screens/message/NotificationsScreen.tsx b/src/screens/message/NotificationsScreen.tsx index be8d6a2..ff98fa9 100644 --- a/src/screens/message/NotificationsScreen.tsx +++ b/src/screens/message/NotificationsScreen.tsx @@ -38,7 +38,7 @@ import { SystemMessageItem } from '../../components/business'; import { Text, ResponsiveContainer, AppBackButton } from '../../components/common'; import { useCursorPagination } from '../../hooks/useCursorPagination'; import * as hrefs from '../../navigation/hrefs'; -import { useMessageManagerSystemUnreadCount } from '../../stores'; +import { useMessageManagerSystemUnreadCount, routePayloadCache } from '../../stores'; import { messageManager } from '../../stores/message'; const MESSAGE_TYPES = [ @@ -331,8 +331,10 @@ export const NotificationsScreen: React.FC<{ onBack?: () => void }> = ({ onBack router.push(hrefs.hrefUserProfile(extra_data.actor_id_str)); } } else if (system_type === 'group_join_apply') { + routePayloadCache.stashSystemMessage(message); router.push(hrefs.hrefGroupRequestDetail(message)); } else if (system_type === 'group_invite') { + routePayloadCache.stashSystemMessage(message); router.push(hrefs.hrefGroupInviteDetail(message)); } // 其他类型暂不处理跳转