fix:APP-push点击文案显示home页
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
Text,
|
||||
Pressable,
|
||||
PanResponder,
|
||||
AppState,
|
||||
Animated as RNAnimated,
|
||||
ImageBackground,
|
||||
Platform,
|
||||
@@ -29,6 +30,8 @@ import {
|
||||
getUserProfile,
|
||||
setReaction,
|
||||
setThemeMode,
|
||||
clearPendingHomePushMessage,
|
||||
getPendingHomePushMessage,
|
||||
getRecoFeedCache,
|
||||
setRecoFeedCache,
|
||||
getUserProfileScoring,
|
||||
@@ -41,6 +44,7 @@ import {
|
||||
} from '@/src/storage/appStorage';
|
||||
|
||||
import { fetchRecoFeed } from '@/src/services/recoApi';
|
||||
import { subscribeHomePushMessage } from '@/src/services/pushNotificationRoute';
|
||||
import { toBackendLocaleFromLanguageTag } from '@/src/i18n/locale';
|
||||
|
||||
import ProfileModal from '@/components/home/ProfileModal';
|
||||
@@ -109,6 +113,7 @@ export default function HomeScreen() {
|
||||
const [busy, setBusy] = useState(false);
|
||||
const [likeFilled, setLikeFilled] = useState(false);
|
||||
const [feedItems, setFeedItems] = useState<FeedItem[]>([]);
|
||||
const [pendingPushItem, setPendingPushItem] = useState<FeedItem | null>(null);
|
||||
const [isFetching, setIsFetching] = useState(false);
|
||||
const [cardWidth, setCardWidth] = useState<number | null>(null);
|
||||
const [wrappedText, setWrappedText] = useState<string>('');
|
||||
@@ -119,6 +124,24 @@ export default function HomeScreen() {
|
||||
const likedIdsRef = useRef<Set<string>>(new Set());
|
||||
const likeInFlightRef = useRef(false);
|
||||
|
||||
const applyPendingPushItem = useCallback(async (message: { notification_id: string; content_id?: number; text: string }) => {
|
||||
const nextItem: FeedItem = {
|
||||
content_id: message.content_id != null ? String(message.content_id) : `push:${message.notification_id}`,
|
||||
text: message.text,
|
||||
};
|
||||
setPendingPushItem(nextItem);
|
||||
indexRef.current = 0;
|
||||
setIndex(0);
|
||||
setLikeFilled(likedIdsRef.current.has(String(nextItem.content_id)));
|
||||
await clearPendingHomePushMessage();
|
||||
}, []);
|
||||
|
||||
const consumePendingPushItem = useCallback(async () => {
|
||||
const pendingMessage = await getPendingHomePushMessage();
|
||||
if (!pendingMessage?.text) return;
|
||||
await applyPendingPushItem(pendingMessage);
|
||||
}, [applyPendingPushItem]);
|
||||
|
||||
useEffect(() => {
|
||||
busyRef.current = busy;
|
||||
}, [busy]);
|
||||
@@ -187,14 +210,25 @@ export default function HomeScreen() {
|
||||
|
||||
// 统一文案对象结构
|
||||
const currentFeed = useMemo(() => {
|
||||
if (feedItems.length > 0) {
|
||||
return feedItems;
|
||||
const baseFeed =
|
||||
feedItems.length > 0
|
||||
? feedItems
|
||||
: MOCK_CONTENT.map(item => ({
|
||||
content_id: item.id,
|
||||
text: t(item.textKey)
|
||||
}));
|
||||
|
||||
if (!pendingPushItem) {
|
||||
return baseFeed;
|
||||
}
|
||||
return MOCK_CONTENT.map(item => ({
|
||||
content_id: item.id,
|
||||
text: t(item.textKey)
|
||||
}));
|
||||
}, [feedItems, t]);
|
||||
|
||||
return [
|
||||
pendingPushItem,
|
||||
...baseFeed.filter((entry) => (
|
||||
String(entry.content_id) !== String(pendingPushItem.content_id) && entry.text !== pendingPushItem.text
|
||||
)),
|
||||
];
|
||||
}, [feedItems, pendingPushItem, t]);
|
||||
useEffect(() => {
|
||||
currentFeedRef.current = currentFeed;
|
||||
}, [currentFeed]);
|
||||
@@ -381,13 +415,20 @@ export default function HomeScreen() {
|
||||
useCallback(() => {
|
||||
let cancelled = false;
|
||||
(async () => {
|
||||
const mode = await getThemeMode();
|
||||
const profile = await getUserProfile();
|
||||
const cache = await getRecoFeedCache();
|
||||
const [mode, profile, cache, pendingMessage] = await Promise.all([
|
||||
getThemeMode(),
|
||||
getUserProfile(),
|
||||
getRecoFeedCache(),
|
||||
getPendingHomePushMessage(),
|
||||
]);
|
||||
|
||||
if (cancelled) return;
|
||||
setThemeModeState(mode);
|
||||
setProfileName(profile.name);
|
||||
if (pendingMessage?.text) {
|
||||
await applyPendingPushItem(pendingMessage);
|
||||
if (cancelled) return;
|
||||
}
|
||||
|
||||
// 随心:若当前主题为随心,进入 Home 时确保状态就绪(仅冷启动会话重算)
|
||||
if (mode === 'suixin') {
|
||||
@@ -415,9 +456,24 @@ export default function HomeScreen() {
|
||||
return () => {
|
||||
cancelled = true;
|
||||
};
|
||||
}, [fetchNewFeed, recoLang, ensureSuixinReady])
|
||||
}, [applyPendingPushItem, fetchNewFeed, recoLang, ensureSuixinReady])
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const unsubscribe = subscribeHomePushMessage((message) => {
|
||||
void applyPendingPushItem(message);
|
||||
});
|
||||
return unsubscribe;
|
||||
}, [applyPendingPushItem]);
|
||||
|
||||
useEffect(() => {
|
||||
const sub = AppState.addEventListener('change', (state) => {
|
||||
if (state !== 'active') return;
|
||||
void consumePendingPushItem();
|
||||
});
|
||||
return () => sub.remove();
|
||||
}, [consumePendingPushItem]);
|
||||
|
||||
const backgroundColor = useMemo(() => {
|
||||
if (themeMode === 'suixin') {
|
||||
return suixinBgColor;
|
||||
|
||||
Reference in New Issue
Block a user