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

@@ -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() {
<Stack.Screen name="index" options={{ headerShown: false }} />
<Stack.Screen name="(auth)" 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>
</SessionGate>
</>