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
This commit is contained in:
lafay
2026-06-12 23:42:09 +08:00
parent 1f7e25349f
commit 1e05d2bd54
19 changed files with 312 additions and 473 deletions

View File

@@ -1,6 +1,6 @@
import { useMemo, useCallback } from 'react'; import { useMemo, useCallback } from 'react';
import { Platform, Pressable, useWindowDimensions } from 'react-native'; 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 { MaterialCommunityIcons } from '@expo/vector-icons';
import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSafeAreaInsets } from 'react-native-safe-area-context';
import type { PressableProps } from 'react-native'; import type { PressableProps } from 'react-native';
@@ -8,6 +8,7 @@ import type { PressableProps } from 'react-native';
import { useAppColors, shadows } from '../../../src/theme'; import { useAppColors, shadows } from '../../../src/theme';
import { BREAKPOINTS } from '../../../src/hooks'; import { BREAKPOINTS } from '../../../src/hooks';
import { useHomeTabBarVisibilityStore, useTotalUnreadCount, useHomeTabPressStore } from '../../../src/stores'; import { useHomeTabBarVisibilityStore, useTotalUnreadCount, useHomeTabPressStore } from '../../../src/stores';
import { hrefHome } from '../../../src/navigation/hrefs';
const TAB_BAR_HEIGHT = 56; const TAB_BAR_HEIGHT = 56;
const TAB_BAR_FLOATING_MARGIN = 12; const TAB_BAR_FLOATING_MARGIN = 12;
@@ -28,6 +29,7 @@ export default function TabsLayout() {
const { width } = useWindowDimensions(); const { width } = useWindowDimensions();
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
const pathname = usePathname(); const pathname = usePathname();
const router = useRouter();
const unreadCount = useTotalUnreadCount(); const unreadCount = useTotalUnreadCount();
const scrollHideTabBar = useHomeTabBarVisibilityStore((s) => s.bottomTabBarHiddenByScroll); const scrollHideTabBar = useHomeTabBarVisibilityStore((s) => s.bottomTabBarHiddenByScroll);
const triggerHomeTabPress = useHomeTabPressStore((s) => s.triggerPress); const triggerHomeTabPress = useHomeTabPressStore((s) => s.triggerPress);
@@ -35,11 +37,18 @@ export default function TabsLayout() {
const isHomeStackRoute = pathname === '/home' || pathname.startsWith('/home/'); const isHomeStackRoute = pathname === '/home' || pathname.startsWith('/home/');
const handleHomeTabPress = useCallback(() => { const handleHomeTabPress = useCallback(
if (pathname === '/home') { (e: { preventDefault: () => void }) => {
triggerHomeTabPress(); if (!isHomeStackRoute) return;
} e.preventDefault();
}, [pathname, triggerHomeTabPress]); if (pathname === '/home') {
triggerHomeTabPress();
} else {
router.navigate(hrefHome());
}
},
[isHomeStackRoute, pathname, triggerHomeTabPress, router]
);
const tabBarStyle = useMemo(() => { const tabBarStyle = useMemo(() => {
if (hideTabBar) { if (hideTabBar) {

View File

@@ -17,8 +17,6 @@ export default function ProfileStackLayout() {
<Stack.Screen name="blocked-users" /> <Stack.Screen name="blocked-users" />
<Stack.Screen name="chat-settings" /> <Stack.Screen name="chat-settings" />
<Stack.Screen name="about" /> <Stack.Screen name="about" />
<Stack.Screen name="terms" />
<Stack.Screen name="privacy" />
<Stack.Screen name="verification" /> <Stack.Screen name="verification" />
<Stack.Screen name="data-storage" /> <Stack.Screen name="data-storage" />
<Stack.Screen name="privacy-settings" /> <Stack.Screen name="privacy-settings" />

View File

@@ -1,5 +0,0 @@
import { PrivacyPolicyScreen } from '../../../../src/screens/profile/PrivacyPolicyScreen';
export default function PrivacyPolicyRoute() {
return <PrivacyPolicyScreen />;
}

View File

@@ -1,5 +0,0 @@
import { TermsOfServiceScreen } from '../../../../src/screens/profile/TermsOfServiceScreen';
export default function TermsOfServiceRoute() {
return <TermsOfServiceScreen />;
}

View File

@@ -1,82 +1,23 @@
import { useEffect, useRef } from 'react'; import { useEffect } from 'react';
import { Platform } from 'react-native';
import { Redirect } from 'expo-router'; import { Redirect } from 'expo-router';
import { AppRouteStack } from '../../src/app-navigation/AppRouteStack'; import { AppRouteStack } from '../../src/app-navigation/AppRouteStack';
import { messageManager, useAuthStore } from '../../src/stores'; import { messageManager, useAuthStore } from '../../src/stores';
import { jpushService } from '../../src/services/notification/jpushService'; import { useRegisterPushDevice } from '../../src/hooks';
import { hrefAuthLogin } from '../../src/navigation/hrefs';
function getDeviceType(): 'ios' | 'android' | 'web' {
switch (Platform.OS) {
case 'ios': return 'ios';
case 'android': return 'android';
default: return 'web';
}
}
async function getOrCreateDeviceID(): Promise<string> {
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()}`;
}
}
export default function AppLayout() { export default function AppLayout() {
const isAuthenticated = useAuthStore((s) => s.isAuthenticated); const isAuthenticated = useAuthStore((s) => s.isAuthenticated);
const userID = useAuthStore((s) => s.currentUser?.id); const userID = useAuthStore((s) => s.currentUser?.id);
const deviceRegistered = useRef(false);
useEffect(() => { useEffect(() => {
messageManager.initialize(); messageManager.initialize();
}, []); }, []);
useEffect(() => { useRegisterPushDevice(isAuthenticated, userID);
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]);
if (!isAuthenticated) { if (!isAuthenticated) {
return <Redirect href="/login" />; return <Redirect href={hrefAuthLogin()} />;
} }
return <AppRouteStack />; return <AppRouteStack />;

View File

@@ -6,6 +6,7 @@ import { AppDesktopShell } from '../../src/app-navigation/AppDesktopShell';
import { AppRouteStack } from '../../src/app-navigation/AppRouteStack'; import { AppRouteStack } from '../../src/app-navigation/AppRouteStack';
import { BREAKPOINTS } from '../../src/hooks'; import { BREAKPOINTS } from '../../src/hooks';
import { messageManager, useAuthStore } from '../../src/stores'; import { messageManager, useAuthStore } from '../../src/stores';
import { hrefAuthLogin } from '../../src/navigation/hrefs';
export default function AppLayoutWeb() { export default function AppLayoutWeb() {
const { width } = useWindowDimensions(); const { width } = useWindowDimensions();
@@ -17,7 +18,7 @@ export default function AppLayoutWeb() {
}, []); }, []);
if (!isAuthenticated) { if (!isAuthenticated) {
return <Redirect href="/login" />; return <Redirect href={hrefAuthLogin()} />;
} }
if (useDesktopShell) { if (useDesktopShell) {

View File

@@ -30,6 +30,7 @@ import { CallScreen, IncomingCallModal, FloatingCallWindow } from '../src/compon
import { jpushService } from '@/services/notification/jpushService'; import { jpushService } from '@/services/notification/jpushService';
import { callKeepService } from '@/services/callkeep'; import { callKeepService } from '@/services/callkeep';
import { callStore } from '@/stores/call'; import { callStore } from '@/stores/call';
import * as hrefs from '../src/navigation/hrefs';
registerNotificationPresentationHandler(); registerNotificationPresentationHandler();
@@ -172,22 +173,21 @@ function NotificationBootstrap() {
if (conversationId) { if (conversationId) {
const isGroup = conversationType === 'group'; const isGroup = conversationType === 'group';
const q = new URLSearchParams(); router.push(
if (isGroup) { hrefs.hrefChat({
q.set('isGroupChat', '1'); conversationId,
if (groupId) q.set('groupId', groupId); userId: isGroup ? undefined : senderId,
if (groupName) q.set('groupName', groupName); isGroupChat: isGroup,
if (groupAvatar) q.set('groupAvatar', groupAvatar); groupId: isGroup ? groupId : undefined,
} else if (senderId) { groupName: isGroup ? groupName : undefined,
q.set('userId', senderId); groupAvatar: isGroup ? groupAvatar : undefined,
} })
const qs = q.toString(); );
router.push(`/chat/${encodeURIComponent(conversationId)}${qs ? `?${qs}` : ''}`);
} else { } else {
router.push('/messages/notifications'); router.push(hrefs.hrefNotifications());
} }
} else { } else {
router.push('/messages/notifications'); router.push(hrefs.hrefNotifications());
} }
}); });
@@ -287,30 +287,6 @@ function ThemedStack() {
<Stack.Screen name="index" options={{ headerShown: false }} /> <Stack.Screen name="index" options={{ headerShown: false }} />
<Stack.Screen name="(auth)" options={{ headerShown: false }} /> <Stack.Screen name="(auth)" options={{ headerShown: false }} />
<Stack.Screen name="(app)" options={{ headerShown: false }} /> <Stack.Screen name="(app)" options={{ headerShown: false }} />
<Stack.Screen
name="terms"
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="privacy"
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="post/[postId]"
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="user/[userId]"
options={{
headerShown: false,
}}
/>
</Stack> </Stack>
</SessionGate> </SessionGate>
</> </>

View File

@@ -1,11 +1,12 @@
import { Redirect } from 'expo-router'; import { Redirect } from 'expo-router';
import { useAuthStore } from '../src/stores'; import { useAuthStore } from '../src/stores';
import { hrefAuthWelcome, hrefHome } from '../src/navigation/hrefs';
export default function Index() { export default function Index() {
const isAuthenticated = useAuthStore((s) => s.isAuthenticated); const isAuthenticated = useAuthStore((s) => s.isAuthenticated);
if (isAuthenticated) { if (isAuthenticated) {
return <Redirect href="/home" />; return <Redirect href={hrefHome()} />;
} }
return <Redirect href="/welcome" />; return <Redirect href={hrefAuthWelcome()} />;
} }

527
package-lock.json generated
View File

@@ -7,45 +7,45 @@
"": { "": {
"name": "with_you", "name": "with_you",
"version": "0.0.2", "version": "0.0.2",
"hasInstallScript": true,
"dependencies": { "dependencies": {
"@expo/ui": "^56.0.15", "@expo/ui": "~56.0.17",
"@expo/vector-icons": "^15.1.1", "@expo/vector-icons": "^15.1.1",
"@livekit/react-native": "^2.11.0", "@livekit/react-native": "^2.11.0",
"@livekit/react-native-webrtc": "^144.1.0", "@livekit/react-native-webrtc": "^144.1.0",
"@react-native-async-storage/async-storage": "^3.1.1", "@react-native-async-storage/async-storage": "^3.1.1",
"@shopify/flash-list": "^2.3.1", "@shopify/flash-list": "^2.3.1",
"@tanstack/react-query": "^5.100.14", "@tanstack/react-query": "^5.100.14",
"@types/react": "~19.2.14",
"axios": "^1.16.1", "axios": "^1.16.1",
"date-fns": "^4.4.0", "date-fns": "^4.4.0",
"expo": "^56.0.8", "expo": "~56.0.11",
"expo-background-task": "~56.0.16", "expo-background-task": "~56.0.18",
"expo-callkit-telecom": "^0.3.8", "expo-callkit-telecom": "^0.3.9",
"expo-camera": "~56.0.7", "expo-camera": "~56.0.8",
"expo-constants": "~56.0.16", "expo-constants": "~56.0.18",
"expo-dev-client": "~56.0.18", "expo-dev-client": "~56.0.20",
"expo-file-system": "~56.0.7", "expo-file-system": "~56.0.8",
"expo-font": "~56.0.5", "expo-font": "~56.0.6",
"expo-haptics": "~56.0.3", "expo-haptics": "~56.0.3",
"expo-image": "~56.0.6", "expo-image": "~56.0.6",
"expo-image-picker": "~56.0.15", "expo-image-picker": "~56.0.17",
"expo-intent-launcher": "~56.0.4", "expo-intent-launcher": "~56.0.4",
"expo-linear-gradient": "~56.0.4", "expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.13", "expo-linking": "~56.0.14",
"expo-media-library": "~56.0.6", "expo-media-library": "~56.0.7",
"expo-notifications": "~56.0.15", "expo-notifications": "~56.0.17",
"expo-router": "~56.2.8", "expo-router": "~56.2.10",
"expo-splash-screen": "~56.0.10", "expo-splash-screen": "~56.0.10",
"expo-sqlite": "~56.0.4", "expo-sqlite": "~56.0.5",
"expo-status-bar": "~56.0.4", "expo-status-bar": "~56.0.4",
"expo-system-ui": "~56.0.5", "expo-system-ui": "~56.0.5",
"expo-task-manager": "~56.0.16", "expo-task-manager": "~56.0.18",
"expo-updates": "~56.0.17", "expo-updates": "~56.0.19",
"expo-video": "~56.1.2", "expo-video": "~56.1.3",
"jcore-react-native": "^2.3.6", "jcore-react-native": "^2.3.6",
"jpush-react-native": "^3.2.7", "jpush-react-native": "^3.2.7",
"katex": "^0.17.0", "katex": "^0.17.0",
"livekit-client": "^2.19.0", "livekit-client": "^2.19.2",
"markdown-it": "^14.2.0", "markdown-it": "^14.2.0",
"pako": "^2.1.0", "pako": "^2.1.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",
@@ -1351,15 +1351,15 @@
} }
}, },
"node_modules/@expo/expo-modules-macros-plugin": { "node_modules/@expo/expo-modules-macros-plugin": {
"version": "0.0.9", "version": "0.2.2",
"resolved": "https://registry.npmmirror.com/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.0.9.tgz", "resolved": "https://registry.npmmirror.com/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.2.2.tgz",
"integrity": "sha512-odai6D7ng/gA7At8ukFcWcauNEeDdyVqzVPbQxDkyU2NTJ4kgphA4I5iigS5C4LXFicSIzEt2nzdlLM8sjsTdA==", "integrity": "sha512-4IMzPDIo/VOXREQjsJtliSfqYVZvfzU2SLFS/9sKMWF848S8CHx+e/E+Vf0TcMvpWCCKX5umyqxb13KJJ+YUzg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@expo/fingerprint": { "node_modules/@expo/fingerprint": {
"version": "0.19.3", "version": "0.19.4",
"resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.19.3.tgz", "resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.19.4.tgz",
"integrity": "sha512-w9Au2IVrtc0Ct+WRa05DVHGNHXYq6VyPZWuFP+5x055OeZ5q6k5Yg+aJ1gfShmjdOhDftRcsvmWmTdTZlWaTZw==", "integrity": "sha512-PsowRlO8+S7JlO8go7yhNEXp7sqlsWDE2AlCwoss7zH0dcajXFo74Fy0KdXEc4UXK7kKoHD37oDgsZ8aHSLr7A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/env": "^2.3.0", "@expo/env": "^2.3.0",
@@ -1379,9 +1379,9 @@
} }
}, },
"node_modules/@expo/fingerprint/node_modules/semver": { "node_modules/@expo/fingerprint/node_modules/semver": {
"version": "7.8.1", "version": "7.8.4",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
"integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -1418,9 +1418,9 @@
} }
}, },
"node_modules/@expo/inline-modules": { "node_modules/@expo/inline-modules": {
"version": "0.0.10", "version": "0.0.11",
"resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.10.tgz", "resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.11.tgz",
"integrity": "sha512-DKEfq877UTAmL/gOT5aFhlLNDg/EVmTSca7JQMKDGR6mjFSAcrmQf4GJNsi6ztiaqj6cTnIfoSz0hAYdnr6RJQ==", "integrity": "sha512-ZlIfKL61DPnW8YUTdMEjMA31xrDDV6p7Xi8rWYyhd5qXBV8MwGwjuJ7vKeaVaMjRqxJk1N9lv7zlfyvQpRCNNw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/config-plugins": "~56.0.8" "@expo/config-plugins": "~56.0.8"
@@ -1447,9 +1447,9 @@
} }
}, },
"node_modules/@expo/log-box": { "node_modules/@expo/log-box": {
"version": "56.0.12", "version": "56.0.13",
"resolved": "https://registry.npmmirror.com/@expo/log-box/-/log-box-56.0.12.tgz", "resolved": "https://registry.npmmirror.com/@expo/log-box/-/log-box-56.0.13.tgz",
"integrity": "sha512-budE6AGmJbpOJfGSOz+JVP3+FevElT82IEIg+ukQ4gZpW/dGO7QX1unFjanKdSaYgudBwJ4FCFGMwWhW/1tXVQ==", "integrity": "sha512-QWRZSpWPyjkDLVQio4R7oAzg/Av2MOt/DciFkfjr8qQ3qxGVn1Rt1oHP/80hvcWDcHFV7N6PqpyxRXw6nbxzKQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/dom-webview": "^56.0.5", "@expo/dom-webview": "^56.0.5",
@@ -1486,9 +1486,9 @@
} }
}, },
"node_modules/@expo/metro-config": { "node_modules/@expo/metro-config": {
"version": "56.0.13", "version": "56.0.14",
"resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-56.0.13.tgz", "resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-56.0.14.tgz",
"integrity": "sha512-OPyNYiex/6Ms8zT2POdIZsLhcAZYk7O+yJvpz5uG/4QRA7aiESfCy1I+0YHewMlR4P1YQeyxIrfTurs6m9xfZA==", "integrity": "sha512-O3CIHruaTJhswPAf/nf3i8QQ3f2jl+mEwSea1eb3khuplabdy/wTQz+JvHN8VGUFyg7JKwUGU1QfO6T3JiSQqA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.20.0", "@babel/code-frame": "^7.20.0",
@@ -1511,7 +1511,6 @@
"hermes-parser": "^0.33.3", "hermes-parser": "^0.33.3",
"jsc-safe-url": "^0.2.4", "jsc-safe-url": "^0.2.4",
"lightningcss": "^1.30.1", "lightningcss": "^1.30.1",
"msgpackr": "^2.0.1",
"picomatch": "^4.0.4", "picomatch": "^4.0.4",
"postcss": "^8.5.14", "postcss": "^8.5.14",
"resolve-from": "^5.0.0" "resolve-from": "^5.0.0"
@@ -1540,19 +1539,19 @@
} }
}, },
"node_modules/@expo/metro-runtime": { "node_modules/@expo/metro-runtime": {
"version": "56.0.13", "version": "56.0.15",
"resolved": "https://registry.npmmirror.com/@expo/metro-runtime/-/metro-runtime-56.0.13.tgz", "resolved": "https://registry.npmmirror.com/@expo/metro-runtime/-/metro-runtime-56.0.15.tgz",
"integrity": "sha512-aMaFa/RPYm2iQoyYOB5q8AxDmWvf4E2yFbZ6rmBIQWaIPDdixGVUlLQeV8DlDAfZ/j+pNYO7l5M+774WbgkTgg==", "integrity": "sha512-WIWeVsL6kCSB57oYZdUA4MTkH7c67UFMIjdNoQzKXwxZYwBFE/xL2cGPDC3z8RWt0femzJTVxAVZUOW/hiqRzA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/log-box": "^56.0.12", "@expo/log-box": "^56.0.13",
"anser": "^1.4.9", "anser": "^1.4.9",
"pretty-format": "^29.7.0", "pretty-format": "^29.7.0",
"stacktrace-parser": "^0.1.10", "stacktrace-parser": "^0.1.10",
"whatwg-fetch": "^3.0.0" "whatwg-fetch": "^3.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@expo/log-box": "^56.0.12", "@expo/log-box": "^56.0.13",
"expo": "*", "expo": "*",
"react": "*", "react": "*",
"react-dom": "*", "react-dom": "*",
@@ -1762,9 +1761,9 @@
} }
}, },
"node_modules/@expo/prebuild-config": { "node_modules/@expo/prebuild-config": {
"version": "56.0.14", "version": "56.0.15",
"resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.14.tgz", "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.15.tgz",
"integrity": "sha512-JHdMqR7Mf5ApLC50ZwTL0Z86ezrHOMYwoSHcWT6Pha/+1TcC+/J+i7vjhP06wGXQ2Kvjt74p/3mKg2Pd12KjhQ==", "integrity": "sha512-6GC+QjdCkzp/5wjsqgfu/B2+2yf5MyZMtzf9szIPrLt9uKhzV2PdyM0vU0kvbj1YT8weHCtO7bsrzimman0sjA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/config": "~56.0.9", "@expo/config": "~56.0.9",
@@ -1774,15 +1773,15 @@
"@expo/json-file": "^10.2.0", "@expo/json-file": "^10.2.0",
"@react-native/normalize-colors": "0.85.3", "@react-native/normalize-colors": "0.85.3",
"debug": "^4.3.1", "debug": "^4.3.1",
"expo-modules-autolinking": "~56.0.14", "expo-modules-autolinking": "~56.0.15",
"resolve-from": "^5.0.0", "resolve-from": "^5.0.0",
"semver": "^7.6.0" "semver": "^7.6.0"
} }
}, },
"node_modules/@expo/prebuild-config/node_modules/semver": { "node_modules/@expo/prebuild-config/node_modules/semver": {
"version": "7.8.1", "version": "7.8.4",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
"integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -1841,9 +1840,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@expo/ui": { "node_modules/@expo/ui": {
"version": "56.0.15", "version": "56.0.17",
"resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.15.tgz", "resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.17.tgz",
"integrity": "sha512-PFZBzztQGCp2bRFP8wIOb5ntP2ORH2GdQkJMSJcDOd4NldoWMe1pFqv7PdthjNlaaTHHTTHK+RsQrz+M6z6isw==", "integrity": "sha512-Jos9oGzurMDngrSWJesX3LSykPRvkUdANxtq2sPKBc6bAjadtZJCkthAYMaE3P9L5xrzbNRFo+2O76cRP0iYPw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"sf-symbols-typescript": "^2.1.0", "sf-symbols-typescript": "^2.1.0",
@@ -1884,12 +1883,6 @@
"react-native": "*" "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": { "node_modules/@expo/xcpretty": {
"version": "4.4.4", "version": "4.4.4",
"resolved": "https://registry.npmmirror.com/@expo/xcpretty/-/xcpretty-4.4.4.tgz", "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": { "node_modules/@nodable/entities": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmmirror.com/@nodable/entities/-/entities-2.1.1.tgz", "resolved": "https://registry.npmmirror.com/@nodable/entities/-/entities-2.1.1.tgz",
@@ -4048,9 +3963,9 @@
} }
}, },
"node_modules/babel-preset-expo": { "node_modules/babel-preset-expo": {
"version": "56.0.14", "version": "56.0.15",
"resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-56.0.14.tgz", "resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-56.0.15.tgz",
"integrity": "sha512-+JKVMYf3HajO3tPRA9DlKd/VhZOPTHyTzUo2yZajfMAoQ3l5VEdGVxm2MzX4DXMNKXwsC8GOeTRx7CrO/5dBDA==", "integrity": "sha512-0MqbQoM6nBUbKvgu2xJ4VixZnUTGTq3HB2WwvOikdO4CiPxbQ+wGA25fOoHHSni5iEFW39wy6y1ookTWlq3wVw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/generator": "^7.20.5", "@babel/generator": "^7.20.5",
@@ -4099,7 +4014,7 @@
"peerDependencies": { "peerDependencies": {
"@babel/runtime": "^7.20.0", "@babel/runtime": "^7.20.0",
"expo": "*", "expo": "*",
"expo-widgets": "^56.0.16", "expo-widgets": "^56.0.18",
"react-refresh": ">=0.14.0 <1.0.0" "react-refresh": ">=0.14.0 <1.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
@@ -5047,9 +4962,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/dnssd-advertise": { "node_modules/dnssd-advertise": {
"version": "1.1.4", "version": "1.1.6",
"resolved": "https://registry.npmmirror.com/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz", "resolved": "https://registry.npmmirror.com/dnssd-advertise/-/dnssd-advertise-1.1.6.tgz",
"integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==", "integrity": "sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/dom-accessibility-api": { "node_modules/dom-accessibility-api": {
@@ -5419,31 +5334,31 @@
} }
}, },
"node_modules/expo": { "node_modules/expo": {
"version": "56.0.8", "version": "56.0.11",
"resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.8.tgz", "resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.11.tgz",
"integrity": "sha512-GzQi5450yrCk5JRSlm0epsmtURBErh0wS77uWLZImFdnPICuX912MaRWooR+Q1Sw/7aQjp9F+KXH+dvrqGxpeQ==", "integrity": "sha512-YqF+q+JqfobDU5yFym3h1vQqzbl7rFiDB4wAJEyK6NK+KLeyf4pfzydQcNTyqLXQKcQBG1reBJExfDShoAYTzw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.0", "@babel/runtime": "^7.20.0",
"@expo/cli": "^56.1.13", "@expo/cli": "^56.1.15",
"@expo/config": "~56.0.9", "@expo/config": "~56.0.9",
"@expo/config-plugins": "~56.0.8", "@expo/config-plugins": "~56.0.8",
"@expo/devtools": "~56.0.2", "@expo/devtools": "~56.0.2",
"@expo/dom-webview": "~56.0.5", "@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/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": "~56.0.0",
"@expo/metro-config": "~56.0.13", "@expo/metro-config": "~56.0.14",
"@ungap/structured-clone": "^1.3.0", "@ungap/structured-clone": "^1.3.0",
"babel-preset-expo": "~56.0.14", "babel-preset-expo": "~56.0.15",
"expo-asset": "~56.0.15", "expo-asset": "~56.0.17",
"expo-constants": "~56.0.16", "expo-constants": "~56.0.18",
"expo-file-system": "~56.0.7", "expo-file-system": "~56.0.8",
"expo-font": "~56.0.5", "expo-font": "~56.0.6",
"expo-keep-awake": "~56.0.3", "expo-keep-awake": "~56.0.3",
"expo-modules-autolinking": "~56.0.14", "expo-modules-autolinking": "~56.0.15",
"expo-modules-core": "~56.0.14", "expo-modules-core": "~56.0.16",
"pretty-format": "^29.7.0", "pretty-format": "^29.7.0",
"react-refresh": "^0.14.2", "react-refresh": "^0.14.2",
"whatwg-url-minimum": "^0.1.2" "whatwg-url-minimum": "^0.1.2"
@@ -5490,13 +5405,13 @@
} }
}, },
"node_modules/expo-asset": { "node_modules/expo-asset": {
"version": "56.0.15", "version": "56.0.17",
"resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-56.0.15.tgz", "resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-56.0.17.tgz",
"integrity": "sha512-BHGi2IAOPQTcOelkUdcz1WIknfCTRjkcpYHX1azjMwgYenrVC+J5qcqJGaC8eUOWLCRtkRJWGnmFQRYtLU1nUQ==", "integrity": "sha512-GFN5j+8SPkyv0nfsiFHewmdB/D0tL237TsBE/gSfFOFy/J3a52py7IulcSqkA3sQE/u/UlD5BmvP5ssS4//nUg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/image-utils": "^0.10.1", "@expo/image-utils": "^0.10.1",
"expo-constants": "~56.0.16" "expo-constants": "~56.0.18"
}, },
"peerDependencies": { "peerDependencies": {
"expo": "*", "expo": "*",
@@ -5505,21 +5420,21 @@
} }
}, },
"node_modules/expo-background-task": { "node_modules/expo-background-task": {
"version": "56.0.16", "version": "56.0.18",
"resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.16.tgz", "resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.18.tgz",
"integrity": "sha512-co1RmfOxBLvnkPx5J5d/wzGGjE/UnyEEH/9ZO4yauiYSy33BjD2dAynxtXfNnRwbkTBmvSiciVwDh8RdZIboyw==", "integrity": "sha512-jfEvLq/hZUWkef+lOt0sbe/Jd8wnK0fMgqsZhD1ulWk1IKB0AWsjmJ0iCTDMD9L9MDztpvKf2g/ygzljmo2eGA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"expo-task-manager": "~56.0.16" "expo-task-manager": "~56.0.18"
}, },
"peerDependencies": { "peerDependencies": {
"expo": "*" "expo": "*"
} }
}, },
"node_modules/expo-callkit-telecom": { "node_modules/expo-callkit-telecom": {
"version": "0.3.8", "version": "0.3.9",
"resolved": "https://registry.npmmirror.com/expo-callkit-telecom/-/expo-callkit-telecom-0.3.8.tgz", "resolved": "https://registry.npmmirror.com/expo-callkit-telecom/-/expo-callkit-telecom-0.3.9.tgz",
"integrity": "sha512-Jh3tOMBD5JHCMF8EumOSqT/bQgWUhmCn9EwMZm9LT1mhWWmNQ7wKwAOYGdF7P4i4dtPDj0HG7u7fuljzt4bmQw==", "integrity": "sha512-dSV6mRp4LEtbseRR4ieVn/zLLJCAQrhbghgZHhe1fnbpwbFsB/iZ5/13ySN10PQKFSQTRU3w6+c/SEKWm7cxOA==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@livekit/react-native-webrtc": ">=144.0.0", "@livekit/react-native-webrtc": ">=144.0.0",
@@ -5530,9 +5445,9 @@
} }
}, },
"node_modules/expo-camera": { "node_modules/expo-camera": {
"version": "56.0.7", "version": "56.0.8",
"resolved": "https://registry.npmmirror.com/expo-camera/-/expo-camera-56.0.7.tgz", "resolved": "https://registry.npmmirror.com/expo-camera/-/expo-camera-56.0.8.tgz",
"integrity": "sha512-c8z+UheidFintQyP9XLEDP43aK4PS/o9+TFLW0zEOjdqkYCBgoWq6Mw/Ps62kjBeftFY7xrp5ZLITbenNvbTaw==", "integrity": "sha512-UDOpUUMisFRmCv1XQV1MJCKGAH2CsIC1Rs6P9Bbc6JLVmbxEKAd5dK68y6cScOdWURxVfJ0PRcjYnSuc8ayyIQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"barcode-detector": "^3.0.0" "barcode-detector": "^3.0.0"
@@ -5550,9 +5465,9 @@
} }
}, },
"node_modules/expo-constants": { "node_modules/expo-constants": {
"version": "56.0.16", "version": "56.0.18",
"resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-56.0.16.tgz", "resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-56.0.18.tgz",
"integrity": "sha512-6tsiN+gmTUPp/atyA+uY9Tg8VOdXdmb4s/3TVGolfn6A/oCAraw1pcPZX5XllyD+xUguxB6eBSFAT8494hZVMA==", "integrity": "sha512-8AMtbDGl/WVPnWlmbpGmvcdnNCy9E4PFnwdVwj600vljkMDPSxcAcjw8GVXEPk3PpZ+ngTqsrkltWyj0UKYAxw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/env": "~2.3.0" "@expo/env": "~2.3.0"
@@ -5563,13 +5478,13 @@
} }
}, },
"node_modules/expo-dev-client": { "node_modules/expo-dev-client": {
"version": "56.0.18", "version": "56.0.20",
"resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-56.0.18.tgz", "resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-56.0.20.tgz",
"integrity": "sha512-pTfDcYTOvrs4vCgAaM+vP2OEO93oGkczgGpTAzCY7ZTIvtPhpekJURHBxfOnKvfn97IF3Hk+8J9tMozsNDj0Gw==", "integrity": "sha512-KebW4r8HhIiRrPzs6ZqVhp/so8buyglAO1h4No0Ibr5C2XRnlIoGWCN4zC6rW7IsI3iKUXcofLAQV9OjoxjiwQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"expo-dev-launcher": "~56.0.18", "expo-dev-launcher": "~56.0.20",
"expo-dev-menu": "~56.0.16", "expo-dev-menu": "~56.0.17",
"expo-dev-menu-interface": "~56.0.0", "expo-dev-menu-interface": "~56.0.0",
"expo-manifests": "~56.0.4", "expo-manifests": "~56.0.4",
"expo-updates-interface": "~56.0.1" "expo-updates-interface": "~56.0.1"
@@ -5579,13 +5494,13 @@
} }
}, },
"node_modules/expo-dev-launcher": { "node_modules/expo-dev-launcher": {
"version": "56.0.18", "version": "56.0.20",
"resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-56.0.18.tgz", "resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-56.0.20.tgz",
"integrity": "sha512-7acFJlkAbp3cMz7Uy787todMR/3A/Row2EOPD21RRoetvzJe4DTm9s7RwJ8PDtyNyued9rooD4+Q6rD8ijpTgw==", "integrity": "sha512-cTuC3GkPl9CTwO3CKnVmEm9qoQ0WairhwvTh6qMlg+zr/QU/tdiU++uDBX67hf9+FuxQOkWGp5khFNosT+0cIg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/schema-utils": "^56.0.0", "@expo/schema-utils": "^56.0.0",
"expo-dev-menu": "~56.0.16", "expo-dev-menu": "~56.0.17",
"expo-manifests": "~56.0.4" "expo-manifests": "~56.0.4"
}, },
"peerDependencies": { "peerDependencies": {
@@ -5594,9 +5509,9 @@
} }
}, },
"node_modules/expo-dev-menu": { "node_modules/expo-dev-menu": {
"version": "56.0.16", "version": "56.0.17",
"resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-56.0.16.tgz", "resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-56.0.17.tgz",
"integrity": "sha512-aVgoe+YGhrQnpwiB5BRI7G+uQnGHMUij32bBnEVdc6eJrVZCStxQlV9NeFbbXxrDhLJt6OSqbCHbLR+XToWUUA==", "integrity": "sha512-OofRkOOZnaDriSav3JDN4NP2lsLt2eOa/Ryptr5nMD62SwnFyK4R6n6PkPVaDU3LSsZqndAJHmN6inS+oziayQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"expo-dev-menu-interface": "~56.0.0" "expo-dev-menu-interface": "~56.0.0"
@@ -5622,9 +5537,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/expo-file-system": { "node_modules/expo-file-system": {
"version": "56.0.7", "version": "56.0.8",
"resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-56.0.7.tgz", "resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-56.0.8.tgz",
"integrity": "sha512-dcKzo8ShPloM7jgfnMcJStgQebhP8owVjCkNI/aX6NMFV1CYB8bxKGMdnzJ3mXk5nfaiW+F/lSKr2UIJ02WAUA==", "integrity": "sha512-NrH41/8snGIBSbYicwVLB4txPdgCATd7ZYhMAGS3YJZ9GbnduhlAoV4/YCbGayjrbpE9bJb/6wegPL/zmvRMnQ==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"expo": "*", "expo": "*",
@@ -5632,9 +5547,9 @@
} }
}, },
"node_modules/expo-font": { "node_modules/expo-font": {
"version": "56.0.5", "version": "56.0.6",
"resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.5.tgz", "resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.6.tgz",
"integrity": "sha512-WLoDu9hlEgPRKXJRR01HFLJ6Z2tFcORX/WFPRYBndmYc5kjQrFGH/j4BRaF3aBRPyYEAUXiUJybNLXkKCwEXQw==", "integrity": "sha512-D4s72Aei844C2s8Vy61qMr6wLEjv6BMrXA1oyRQ0x8LJBbpm5gyogUohc0lABUURVLCqsnBIDdztegl3hktmmg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fontfaceobserver": "^2.1.0" "fontfaceobserver": "^2.1.0"
@@ -5695,9 +5610,9 @@
} }
}, },
"node_modules/expo-image-picker": { "node_modules/expo-image-picker": {
"version": "56.0.15", "version": "56.0.17",
"resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.15.tgz", "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.17.tgz",
"integrity": "sha512-7zmrUcqiNKwGGGL114gC+1aaquhmMbaXCNSHjUcoINdBzvIEVMJDm+DNCxkpftEYeb17X3shqInI4lCgJNVO5g==", "integrity": "sha512-/RojW1ptyQNV89hEeDdaoHCkn38+546MqakMyB0acFf0HLh5ZI7wxQCHkxr16qjuQMy11M+96GlX9Z6vgXF7Nw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"expo-image-loader": "~56.0.3" "expo-image-loader": "~56.0.3"
@@ -5743,12 +5658,12 @@
} }
}, },
"node_modules/expo-linking": { "node_modules/expo-linking": {
"version": "56.0.13", "version": "56.0.14",
"resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-56.0.13.tgz", "resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-56.0.14.tgz",
"integrity": "sha512-38YrpTh6xdiDxmYSDIUffDqev1hIcEggw2fZ3IZhNp2DVLF1xvqsbO6hJD1fuBKN8P34B3Ggc9Yy26fkqdfCOA==", "integrity": "sha512-IvVQHWC+Cj4fK5qD3iEVYqpU2a4rLW0IpAAlGJ4MH+H1fyZiHh3eN6qg2WmoclOEPfYATSuEa+dQT6wfgVpXlQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"expo-constants": "~56.0.16", "expo-constants": "~56.0.18",
"invariant": "^2.2.4" "invariant": "^2.2.4"
}, },
"peerDependencies": { "peerDependencies": {
@@ -5769,9 +5684,9 @@
} }
}, },
"node_modules/expo-media-library": { "node_modules/expo-media-library": {
"version": "56.0.6", "version": "56.0.7",
"resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-56.0.6.tgz", "resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-56.0.7.tgz",
"integrity": "sha512-UsyVcxP7Op9ErFFLW1xImjoKFgKi7XSw8hrCfzf2yIG+OgVb9dsQth0mVRPgfRxdELagsUslXc1QXTiW8dpbaQ==", "integrity": "sha512-lVsXsagjDYuySr+WWvc6BfRHTXttnWeVX4qMP2ls7JyAVSECQOAQpqz47uZiJsEohtpCoDTLRL2mcn/XY8fLoQ==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"expo": "*", "expo": "*",
@@ -5779,9 +5694,9 @@
} }
}, },
"node_modules/expo-modules-autolinking": { "node_modules/expo-modules-autolinking": {
"version": "56.0.14", "version": "56.0.15",
"resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.14.tgz", "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.15.tgz",
"integrity": "sha512-9ugtZkheNPYDkW4DZopY1rH2BCbUICaafUEPxRgbLDR5UNRF5K3cdHMIMEt8pxZPq2+eX4wCm+6pbSvdY/DPHg==", "integrity": "sha512-WqpBFwLzn7DsrUkWltIjVmAjwuI1VdQ2jRMlvk1nh2kVadwdJBkSjUBQWRifsEePNhiMT/rFOovBolUU/ARt5w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/require-utils": "^56.1.3", "@expo/require-utils": "^56.1.3",
@@ -5803,13 +5718,13 @@
} }
}, },
"node_modules/expo-modules-core": { "node_modules/expo-modules-core": {
"version": "56.0.14", "version": "56.0.16",
"resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.14.tgz", "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.16.tgz",
"integrity": "sha512-dl1TlYRm1k7xk9QeAyDoMfFE2p6rNyzHUcH5ArcGwUzO8YKku+Z2tQ8+kG7zLe3OhfMoJcFR/czrFy7vGSVI6w==", "integrity": "sha512-IVdT0CnqOpQCPdemA5rb50CPbbhWeJePnvuH0yUmOmyMkNky8WVOdRQtVicoIv4CCG5hDrzPIxULD4YOHZ5CHg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/expo-modules-macros-plugin": "~0.0.9", "@expo/expo-modules-macros-plugin": "0.2.2",
"expo-modules-jsi": "~56.0.7", "expo-modules-jsi": "~56.0.9",
"invariant": "^2.2.4" "invariant": "^2.2.4"
}, },
"peerDependencies": { "peerDependencies": {
@@ -5824,25 +5739,25 @@
} }
}, },
"node_modules/expo-modules-jsi": { "node_modules/expo-modules-jsi": {
"version": "56.0.7", "version": "56.0.9",
"resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.7.tgz", "resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.9.tgz",
"integrity": "sha512-iBAj4Xeh/8HT201VVxFlmf+VBfmtQV1ZUoJdLQQENm0+j9gnD2QswZLJyNo3CmNNXl46esJeLR5lpGpYZts/zA==", "integrity": "sha512-2lfDkRcsP/Qh2upS+nu0MS0tfGsghc6ehTivzbgM5nJz0MGYhAJxCJSeendWM+aOQutQAwzsoxrNT0nW8lRAwA==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"react-native": "*" "react-native": "*"
} }
}, },
"node_modules/expo-notifications": { "node_modules/expo-notifications": {
"version": "56.0.15", "version": "56.0.17",
"resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.15.tgz", "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.17.tgz",
"integrity": "sha512-F+OasAePiVnHaPNKI9JAYV8fg8bdBwo7Mh9R3ydBp8S21fRQyxKOSgJvj8fX/HoPFFIC6V2B+y1LJbG5Ovh/Fg==", "integrity": "sha512-Yn6JUKmoBDkQeznbuUn4cHF2u44r1ErJTneW65MBFt7NLG8U8/VGQ4bBVwswm5nPH1/V92UoXPgvCssScPFRDg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/image-utils": "^0.10.1", "@expo/image-utils": "^0.10.1",
"abort-controller": "^3.0.0", "abort-controller": "^3.0.0",
"badgin": "^1.1.5", "badgin": "^1.1.5",
"expo-application": "~56.0.3", "expo-application": "~56.0.3",
"expo-constants": "~56.0.16" "expo-constants": "~56.0.18"
}, },
"peerDependencies": { "peerDependencies": {
"expo": "*", "expo": "*",
@@ -5851,15 +5766,15 @@
} }
}, },
"node_modules/expo-router": { "node_modules/expo-router": {
"version": "56.2.8", "version": "56.2.10",
"resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.8.tgz", "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.10.tgz",
"integrity": "sha512-l387I/ddPY/5SS+Rfpp1SrRV9gBKevxtPuZod7igMjR6L674QrxEwGiAILRq6AKCSbrP2I0ufKj7e5xz8JqA4Q==", "integrity": "sha512-u7WcdsFAjSrQS7Bdb1VbNPE3xNcd/BZ6qXSS31UAJKhaYIb+ik3jJSy/W5kY3qKipwbwlo3CSb1WnZ2XYs7F+Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/log-box": "^56.0.12", "@expo/log-box": "^56.0.13",
"@expo/metro-runtime": "^56.0.13", "@expo/metro-runtime": "^56.0.15",
"@expo/schema-utils": "^56.0.0", "@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-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.12", "@radix-ui/react-tabs": "^1.1.12",
"@react-native-masked-view/masked-view": "^0.3.2", "@react-native-masked-view/masked-view": "^0.3.2",
@@ -5870,8 +5785,8 @@
"debug": "^4.3.4", "debug": "^4.3.4",
"escape-string-regexp": "^4.0.0", "escape-string-regexp": "^4.0.0",
"expo-glass-effect": "^56.0.4", "expo-glass-effect": "^56.0.4",
"expo-server": "^56.0.4", "expo-server": "^56.0.5",
"expo-symbols": "^56.0.5", "expo-symbols": "^56.0.6",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"invariant": "^2.2.4", "invariant": "^2.2.4",
"nanoid": "^3.3.8", "nanoid": "^3.3.8",
@@ -5883,15 +5798,16 @@
"server-only": "^0.0.1", "server-only": "^0.0.1",
"sf-symbols-typescript": "^2.1.0", "sf-symbols-typescript": "^2.1.0",
"shallowequal": "^1.1.0", "shallowequal": "^1.1.0",
"standard-navigation": "^0.0.5",
"vaul": "^1.1.2" "vaul": "^1.1.2"
}, },
"peerDependencies": { "peerDependencies": {
"@expo/log-box": "^56.0.12", "@expo/log-box": "^56.0.13",
"@expo/metro-runtime": "^56.0.13", "@expo/metro-runtime": "^56.0.15",
"@testing-library/react-native": ">= 13.2.0", "@testing-library/react-native": ">= 13.2.0",
"expo": "*", "expo": "*",
"expo-constants": "^56.0.16", "expo-constants": "^56.0.18",
"expo-linking": "^56.0.13", "expo-linking": "^56.0.14",
"react": "*", "react": "*",
"react-dom": "*", "react-dom": "*",
"react-native": "*", "react-native": "*",
@@ -5924,9 +5840,9 @@
} }
}, },
"node_modules/expo-server": { "node_modules/expo-server": {
"version": "56.0.4", "version": "56.0.5",
"resolved": "https://registry.npmmirror.com/expo-server/-/expo-server-56.0.4.tgz", "resolved": "https://registry.npmmirror.com/expo-server/-/expo-server-56.0.5.tgz",
"integrity": "sha512-4dJ57KuAwDl7eQGD6aG9kTzBIftWAfHH1+6Zxy7NcPCBrKYis3/H5enGUz1asH8HHhONXfJ5BdJqfEWAEAgWxA==", "integrity": "sha512-SmM2p2g3Jrktpiazcst+OxhjSzOHXKAY4BPURHYHXvApzzoybMmrNF4IEZ8DKZ145BhSe4ydAmlEFCRTsdtgUQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=20.16.0" "node": ">=20.16.0"
@@ -5947,9 +5863,9 @@
} }
}, },
"node_modules/expo-sqlite": { "node_modules/expo-sqlite": {
"version": "56.0.4", "version": "56.0.5",
"resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-56.0.4.tgz", "resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-56.0.5.tgz",
"integrity": "sha512-Ak8TUyrvK7C/J4BHBfcb8BacFrH8I+b+zqeSTKg5B02Z13lxljvuqI8UvKbRNa5BKprlxrqabZickGwacRkM9g==", "integrity": "sha512-wHYRVLS5nUFEtli45wHaO+RjlRY8sQXyOSgENVk6I4zq7+FgySqjOk3YOYW6IKIMwhj5XzjMJO+pY8xKUy73Kw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"await-lock": "^2.2.2" "await-lock": "^2.2.2"
@@ -5978,9 +5894,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/expo-symbols": { "node_modules/expo-symbols": {
"version": "56.0.5", "version": "56.0.6",
"resolved": "https://registry.npmmirror.com/expo-symbols/-/expo-symbols-56.0.5.tgz", "resolved": "https://registry.npmmirror.com/expo-symbols/-/expo-symbols-56.0.6.tgz",
"integrity": "sha512-RIukH0Xo80C7RU8qreipL2SPy2Py+Km8JFPbCmbPQpHkM3DW9Znlmg6VfhzbtUOlO5EuNSF0lAJ3l2VJi6qYrw==", "integrity": "sha512-BrA81DjcNafdj7gXVhdrExb9LtUiSVyOf/NavyMmDAHgHMY1GqeR5cnn1PSAZeYKnSgQhee/H89XUpAxtog5hg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo-google-fonts/material-symbols": "^0.4.1", "@expo-google-fonts/material-symbols": "^0.4.1",
@@ -6014,9 +5930,9 @@
} }
}, },
"node_modules/expo-task-manager": { "node_modules/expo-task-manager": {
"version": "56.0.16", "version": "56.0.18",
"resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.16.tgz", "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.18.tgz",
"integrity": "sha512-wh5DOzUkQfpXs2fmm9QYlPoNiJRgnCI926m2hoVDFYD8yENnDYYXQEON8uYgnepYmActr/KAMBxmw6BOmTky/Q==", "integrity": "sha512-abTKDhlZ572wSwNuZ9HkDw6rl+kKLq0TkqheIEbGoRkMQVEGV3D5GYYY0gg84TO/HvAqiipdcBFQH8+9uHj70Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"unimodules-app-loader": "~56.0.0" "unimodules-app-loader": "~56.0.0"
@@ -6027,9 +5943,9 @@
} }
}, },
"node_modules/expo-updates": { "node_modules/expo-updates": {
"version": "56.0.17", "version": "56.0.19",
"resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-56.0.17.tgz", "resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-56.0.19.tgz",
"integrity": "sha512-4005IRQQ7Vpwb01X3NSG0SwY61HTJzT2pZ0OrkeZ6guQE1WKiRfUKisekRgYXTI8sPbxSHUc9aOpIx6yC49XZQ==", "integrity": "sha512-tTSPYO5h8wDA6a+wQ2v/SRdnOdz29x0npGHCv+4Ev31Fz5r05Ii1Wgfh3BlTXNz8mikMReDsZCf6YN71YeQKpw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/code-signing-certificates": "^0.0.6", "@expo/code-signing-certificates": "^0.0.6",
@@ -6079,9 +5995,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/expo-video": { "node_modules/expo-video": {
"version": "56.1.2", "version": "56.1.3",
"resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.2.tgz", "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.3.tgz",
"integrity": "sha512-NPdbwcPfPd7lgOcgTFi7m7Dqp1+3OSXJHrUDU4tXA/Ly4vuNpe35eZNA21F/OJtJqk/nw3r6PDZnSqw5XY0p6w==", "integrity": "sha512-Ht2BMdx11RnGKxILL/P4t/hl4kqWXq1vLaoOrLZlDed+IXgf8hdDI9jmtEEgsIHwf3jaHFXblJCRVuS9mIxKAw==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"expo": "*", "expo": "*",
@@ -6090,9 +6006,9 @@
} }
}, },
"node_modules/expo/node_modules/@expo/cli": { "node_modules/expo/node_modules/@expo/cli": {
"version": "56.1.13", "version": "56.1.15",
"resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.13.tgz", "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.15.tgz",
"integrity": "sha512-7n5VzlBr7TKW0BgWgpEopWy+v8buPhMvbSEsuXD+bI1YIJBopkfWAub0qTvlc357E8wWOvV5MJXYyoeRvoOjoQ==", "integrity": "sha512-ik6++YzURB2d/mSEfYwbuNa19uOWZwVHy9THCQ/pPr6mzplKl4w9I4nlYF9lx7oluNC3NvxsSZ8/rgpVKEOJTA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@expo/code-signing-certificates": "^0.0.6", "@expo/code-signing-certificates": "^0.0.6",
@@ -6101,21 +6017,21 @@
"@expo/devcert": "^1.2.1", "@expo/devcert": "^1.2.1",
"@expo/env": "~2.3.0", "@expo/env": "~2.3.0",
"@expo/image-utils": "^0.10.1", "@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/json-file": "^10.2.0",
"@expo/log-box": "^56.0.12", "@expo/log-box": "^56.0.13",
"@expo/metro": "~56.0.0", "@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/metro-file-map": "^56.0.3",
"@expo/osascript": "^2.6.0", "@expo/osascript": "^2.6.0",
"@expo/package-manager": "^1.12.1", "@expo/package-manager": "^1.12.1",
"@expo/plist": "^0.7.0", "@expo/plist": "^0.7.0",
"@expo/prebuild-config": "^56.0.14", "@expo/prebuild-config": "^56.0.15",
"@expo/require-utils": "^56.1.3", "@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/schema-utils": "^56.0.0",
"@expo/spawn-async": "^1.8.0", "@expo/spawn-async": "^1.8.0",
"@expo/ws-tunnel": "^1.0.1", "@expo/ws-tunnel": "^2.0.0",
"@expo/xcpretty": "^4.4.4", "@expo/xcpretty": "^4.4.4",
"@react-native/dev-middleware": "0.85.3", "@react-native/dev-middleware": "0.85.3",
"accepts": "^1.3.8", "accepts": "^1.3.8",
@@ -6128,7 +6044,7 @@
"connect": "^3.7.0", "connect": "^3.7.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"dnssd-advertise": "^1.1.4", "dnssd-advertise": "^1.1.4",
"expo-server": "^56.0.4", "expo-server": "^56.0.5",
"fetch-nodeshim": "^0.4.10", "fetch-nodeshim": "^0.4.10",
"getenv": "^2.0.0", "getenv": "^2.0.0",
"glob": "^13.0.0", "glob": "^13.0.0",
@@ -6171,20 +6087,20 @@
} }
}, },
"node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": {
"version": "56.0.12", "version": "56.0.14",
"resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-56.0.12.tgz", "resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-56.0.14.tgz",
"integrity": "sha512-RqKV2/Z8BH/z8l0ngSpG6//5xxJPaF5dTQvSfPQ0nrvCjikGMeIvyj3B9BeLnmZZhxb3gBtXqrj3irAoiIp2aQ==", "integrity": "sha512-2UCTtZfcq1ZPgp3wk8/+sq9DvFI9UxrPr1jcEKMAF2DGAJLosnpc8GWNNg2hkjt6SHUOdFHIPxujWPYyho2y3A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"peerDependencies": { "peerDependencies": {
"@expo/metro-runtime": "^56.0.13", "@expo/metro-runtime": "^56.0.15",
"expo": "*", "expo": "*",
"expo-constants": "^56.0.16", "expo-constants": "^56.0.18",
"expo-font": "^56.0.5", "expo-font": "^56.0.6",
"expo-router": "*", "expo-router": "*",
"expo-server": "^56.0.4", "expo-server": "^56.0.5",
"react": "*", "react": "*",
"react-dom": "*", "react-dom": "*",
"react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" "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": { "node_modules/expo/node_modules/ansi-styles": {
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -6368,9 +6293,9 @@
} }
}, },
"node_modules/expo/node_modules/semver": { "node_modules/expo/node_modules/semver": {
"version": "7.8.1", "version": "7.8.4",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
"integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -8382,9 +8307,9 @@
} }
}, },
"node_modules/livekit-client": { "node_modules/livekit-client": {
"version": "2.19.1", "version": "2.19.2",
"resolved": "https://registry.npmmirror.com/livekit-client/-/livekit-client-2.19.1.tgz", "resolved": "https://registry.npmmirror.com/livekit-client/-/livekit-client-2.19.2.tgz",
"integrity": "sha512-knwEuozt3d7optuUMvw+0PGrV/68GWXrTdAefezOM51Dk8QLb28qOm73UMSSQET58gUqelxqU1afchd2YyPKnQ==", "integrity": "sha512-Kvk07QYDWRAbmYNLRll04ZIuxMQobW/oLPYnmR1kCy8GGHpU0gqyHf704Rz+29zfy8IJZRjKqeVbzGSKn9sumw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@livekit/mutex": "1.1.1", "@livekit/mutex": "1.1.1",
@@ -9252,37 +9177,6 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT" "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": { "node_modules/multitars": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/multitars/-/multitars-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/multitars/-/multitars-1.0.0.tgz",
@@ -9355,21 +9249,6 @@
"node": ">= 6.13.0" "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": { "node_modules/node-int64": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", "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": { "node_modules/npm-package-arg/node_modules/semver": {
"version": "7.8.1", "version": "7.8.4",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
"integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -11405,6 +11284,12 @@
"node": ">=6" "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": { "node_modules/statuses": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",

View File

@@ -14,43 +14,44 @@
"ios:submit": "eas submit --platform ios --profile production" "ios:submit": "eas submit --platform ios --profile production"
}, },
"dependencies": { "dependencies": {
"@expo/ui": "^56.0.15", "@expo/ui": "~56.0.17",
"@expo/vector-icons": "^15.1.1", "@expo/vector-icons": "^15.1.1",
"@livekit/react-native": "^2.11.0", "@livekit/react-native": "^2.11.0",
"@livekit/react-native-webrtc": "^144.1.0", "@livekit/react-native-webrtc": "^144.1.0",
"@react-native-async-storage/async-storage": "^3.1.1", "@react-native-async-storage/async-storage": "^3.1.1",
"@shopify/flash-list": "^2.3.1", "@shopify/flash-list": "^2.3.1",
"@tanstack/react-query": "^5.100.14", "@tanstack/react-query": "^5.100.14",
"@types/react": "~19.2.14",
"axios": "^1.16.1", "axios": "^1.16.1",
"date-fns": "^4.4.0", "date-fns": "^4.4.0",
"expo": "^56.0.8", "expo": "~56.0.11",
"expo-background-task": "~56.0.16", "expo-background-task": "~56.0.18",
"expo-callkit-telecom": "^0.3.8", "expo-callkit-telecom": "^0.3.9",
"expo-camera": "~56.0.7", "expo-camera": "~56.0.8",
"expo-constants": "~56.0.16", "expo-constants": "~56.0.18",
"expo-dev-client": "~56.0.18", "expo-dev-client": "~56.0.20",
"expo-file-system": "~56.0.7", "expo-file-system": "~56.0.8",
"expo-font": "~56.0.5", "expo-font": "~56.0.6",
"expo-haptics": "~56.0.3", "expo-haptics": "~56.0.3",
"expo-image": "~56.0.6", "expo-image": "~56.0.6",
"expo-image-picker": "~56.0.15", "expo-image-picker": "~56.0.17",
"expo-intent-launcher": "~56.0.4", "expo-intent-launcher": "~56.0.4",
"expo-linear-gradient": "~56.0.4", "expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.13", "expo-linking": "~56.0.14",
"expo-media-library": "~56.0.6", "expo-media-library": "~56.0.7",
"expo-notifications": "~56.0.15", "expo-notifications": "~56.0.17",
"expo-router": "~56.2.8", "expo-router": "~56.2.10",
"expo-splash-screen": "~56.0.10", "expo-splash-screen": "~56.0.10",
"expo-sqlite": "~56.0.4", "expo-sqlite": "~56.0.5",
"expo-status-bar": "~56.0.4", "expo-status-bar": "~56.0.4",
"expo-system-ui": "~56.0.5", "expo-system-ui": "~56.0.5",
"expo-task-manager": "~56.0.16", "expo-task-manager": "~56.0.18",
"expo-updates": "~56.0.17", "expo-updates": "~56.0.19",
"expo-video": "~56.1.2", "expo-video": "~56.1.3",
"jcore-react-native": "^2.3.6", "jcore-react-native": "^2.3.6",
"jpush-react-native": "^3.2.7", "jpush-react-native": "^3.2.7",
"katex": "^0.17.0", "katex": "^0.17.0",
"livekit-client": "^2.19.0", "livekit-client": "^2.19.2",
"markdown-it": "^14.2.0", "markdown-it": "^14.2.0",
"pako": "^2.1.0", "pako": "^2.1.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",

View File

@@ -172,7 +172,7 @@ export function AppDesktopShell() {
const handleTabChange = useCallback( const handleTabChange = useCallback(
(href: string) => { (href: string) => {
router.replace(href); router.push(href);
}, },
[router] [router]
); );

View File

@@ -6,6 +6,7 @@ import { useRouter } from 'expo-router';
import Text from '../common/Text'; import Text from '../common/Text';
import { useAppColors, spacing, borderRadius } from '../../theme'; import { useAppColors, spacing, borderRadius } from '../../theme';
import type { PostRefSegmentData } from '../../types'; import type { PostRefSegmentData } from '../../types';
import * as hrefs from '../../navigation/hrefs';
interface PostRefCardProps { interface PostRefCardProps {
data: PostRefSegmentData; data: PostRefSegmentData;
@@ -21,7 +22,7 @@ const PostRefCard: React.FC<PostRefCardProps> = ({ data, compact = false, onPres
if (onPress) { if (onPress) {
onPress(data.post_id); onPress(data.post_id);
} else { } else {
router.push(`/post/${data.post_id}` as any); router.push(hrefs.hrefPostDetail(data.post_id));
} }
}, [data.post_id, onPress, router]); }, [data.post_id, onPress, router]);

View File

@@ -70,6 +70,9 @@ export { useMediaCache } from './useMediaCache';
export type { UseMediaCacheReturn } from './useMediaCache'; export type { UseMediaCacheReturn } from './useMediaCache';
// ==================== 推送设备注册 Hook ====================
export { useRegisterPushDevice } from './useRegisterPushDevice';
// ==================== 差异更新 Hooks ==================== // ==================== 差异更新 Hooks ====================
export { useDifferentialMessages } from './useDifferentialMessages'; export { useDifferentialMessages } from './useDifferentialMessages';

View File

@@ -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]);
}

View File

@@ -2,13 +2,16 @@
* Expo Router 路径构建(单一事实来源,避免魔法字符串散落) * Expo Router 路径构建(单一事实来源,避免魔法字符串散落)
*/ */
import type { SystemMessageResponse } from '../types/dto'; import type { SystemMessageResponse } from '../types/dto';
import { routePayloadCache } from '../stores';
export function hrefPostDetail(postId: string, scrollToComments?: boolean): string { export function hrefPostDetail(postId: string, scrollToComments?: boolean): string {
const q = scrollToComments ? '?scrollToComments=1' : ''; const q = scrollToComments ? '?scrollToComments=1' : '';
return `/post/${encodeURIComponent(postId)}${q}`; return `/post/${encodeURIComponent(postId)}${q}`;
} }
export function hrefTradeDetail(tradeId: string): string {
return `/trade/${encodeURIComponent(tradeId)}`;
}
export function hrefUserProfile(userId: string): string { export function hrefUserProfile(userId: string): string {
return `/user/${encodeURIComponent(userId)}`; return `/user/${encodeURIComponent(userId)}`;
} }
@@ -124,12 +127,10 @@ export function hrefGroupMembers(groupId: string): string {
} }
export function hrefGroupRequestDetail(message: SystemMessageResponse): string { export function hrefGroupRequestDetail(message: SystemMessageResponse): string {
routePayloadCache.stashSystemMessage(message);
return `/group/request?messageId=${encodeURIComponent(message.id)}`; return `/group/request?messageId=${encodeURIComponent(message.id)}`;
} }
export function hrefGroupInviteDetail(message: SystemMessageResponse): string { export function hrefGroupInviteDetail(message: SystemMessageResponse): string {
routePayloadCache.stashSystemMessage(message);
return `/group/invite?messageId=${encodeURIComponent(message.id)}`; return `/group/invite?messageId=${encodeURIComponent(message.id)}`;
} }

View File

@@ -716,7 +716,7 @@ export const HomeScreen: React.FC = () => {
// 跳转到发帖页面(使用 Modal 方式) // 跳转到发帖页面(使用 Modal 方式)
const handleCreatePost = () => { const handleCreatePost = () => {
if (!isAuthenticated) { if (!isAuthenticated) {
router.push('/login'); router.push(hrefs.hrefAuthLogin());
return; return;
} }
if (!isVerified) { if (!isVerified) {
@@ -1052,7 +1052,7 @@ export const HomeScreen: React.FC = () => {
floatingButtonBottom !== undefined && { bottom: floatingButtonBottom }, floatingButtonBottom !== undefined && { bottom: floatingButtonBottom },
]} ]}
onPress={homeTab === 'market' ? () => { onPress={homeTab === 'market' ? () => {
if (!isAuthenticated) { router.push('/login'); return; } if (!isAuthenticated) { router.push(hrefs.hrefAuthLogin()); return; }
if (!isVerified) { router.push(hrefs.hrefVerificationGuide()); return; } if (!isVerified) { router.push(hrefs.hrefVerificationGuide()); return; }
setShowCreateTrade(true); setShowCreateTrade(true);
} : handleCreatePost} } : handleCreatePost}

View File

@@ -14,6 +14,7 @@ import type {
} from '../../types/trade'; } from '../../types/trade';
import { useRouter } from 'expo-router'; import { useRouter } from 'expo-router';
import { useResponsive, useResponsiveSpacing } from '../../hooks'; import { useResponsive, useResponsiveSpacing } from '../../hooks';
import * as hrefs from '../../navigation/hrefs';
type TradeFilterType = 'all' | 'sell' | 'buy'; type TradeFilterType = 'all' | 'sell' | 'buy';
@@ -137,7 +138,7 @@ export function MarketView({
}, [isLoadingMore, hasMore, cursor, filterType, selectedCategory]); }, [isLoadingMore, hasMore, cursor, filterType, selectedCategory]);
const handlePressItem = useCallback((id: string) => { const handlePressItem = useCallback((id: string) => {
router.push(`/trade/${id}` as any); router.push(hrefs.hrefTradeDetail(id));
}, [router]); }, [router]);
const handleFavorite = useCallback(async (id: string) => { const handleFavorite = useCallback(async (id: string) => {

View File

@@ -472,7 +472,7 @@ export const SearchScreen: React.FC<SearchScreenProps> = ({ onBack, homeTab = 's
<TradeCard <TradeCard
item={item} item={item}
variant="list" variant="list"
onPress={(id) => router.push(`/trade/${id}` as any)} onPress={(id) => router.push(hrefs.hrefTradeDetail(id))}
/> />
</View> </View>
)} )}

View File

@@ -38,7 +38,7 @@ import { SystemMessageItem } from '../../components/business';
import { Text, ResponsiveContainer, AppBackButton } from '../../components/common'; import { Text, ResponsiveContainer, AppBackButton } from '../../components/common';
import { useCursorPagination } from '../../hooks/useCursorPagination'; import { useCursorPagination } from '../../hooks/useCursorPagination';
import * as hrefs from '../../navigation/hrefs'; import * as hrefs from '../../navigation/hrefs';
import { useMessageManagerSystemUnreadCount } from '../../stores'; import { useMessageManagerSystemUnreadCount, routePayloadCache } from '../../stores';
import { messageManager } from '../../stores/message'; import { messageManager } from '../../stores/message';
const MESSAGE_TYPES = [ const MESSAGE_TYPES = [
@@ -331,8 +331,10 @@ export const NotificationsScreen: React.FC<{ onBack?: () => void }> = ({ onBack
router.push(hrefs.hrefUserProfile(extra_data.actor_id_str)); router.push(hrefs.hrefUserProfile(extra_data.actor_id_str));
} }
} else if (system_type === 'group_join_apply') { } else if (system_type === 'group_join_apply') {
routePayloadCache.stashSystemMessage(message);
router.push(hrefs.hrefGroupRequestDetail(message)); router.push(hrefs.hrefGroupRequestDetail(message));
} else if (system_type === 'group_invite') { } else if (system_type === 'group_invite') {
routePayloadCache.stashSystemMessage(message);
router.push(hrefs.hrefGroupInviteDetail(message)); router.push(hrefs.hrefGroupInviteDetail(message));
} }
// 其他类型暂不处理跳转 // 其他类型暂不处理跳转