refactor: 收口推荐流展示模型
This commit is contained in:
@@ -150,8 +150,10 @@ import {
|
||||
} from './rpgEntryProfileTaskViewModel';
|
||||
import {
|
||||
buildPlatformRankingEntries,
|
||||
buildPlatformRecommendFeedEntries,
|
||||
buildPublicCategoryGroups,
|
||||
buildPublicGalleryCardKey,
|
||||
dedupePlatformPublicGalleryEntries,
|
||||
filterPlatformWorkSearchResults,
|
||||
filterTodayPublishedEntries,
|
||||
getAllPlatformPublicEntries,
|
||||
@@ -167,6 +169,7 @@ import {
|
||||
type PlatformCategoryKindFilter,
|
||||
type PlatformCategorySortMode,
|
||||
type PlatformRankingTab,
|
||||
selectPlatformRecommendFeedWindow,
|
||||
sortPlatformCategoryEntries,
|
||||
} from './rpgEntryPublicGalleryViewModel';
|
||||
import {
|
||||
@@ -4742,14 +4745,11 @@ export function RpgEntryHomeView({
|
||||
featuredShelf.length > 0 ? featuredShelf : generalLatestEntries
|
||||
).slice(0, 5);
|
||||
// 网页端保留原有宽屏布局,只把模块数据同步到移动端首页频道语义。
|
||||
const desktopRecommendEntries = useMemo(() => {
|
||||
const entryMap = new Map<string, PlatformPublicGalleryCard>();
|
||||
[...featuredShelf, ...generalLatestEntries].forEach((entry) => {
|
||||
entryMap.set(buildPublicGalleryCardKey(entry), entry);
|
||||
});
|
||||
|
||||
return Array.from(entryMap.values());
|
||||
}, [featuredShelf, generalLatestEntries]);
|
||||
const recommendedFeedEntries = useMemo(
|
||||
() => buildPlatformRecommendFeedEntries(featuredShelf, generalLatestEntries),
|
||||
[featuredShelf, generalLatestEntries],
|
||||
);
|
||||
const desktopRecommendEntries = recommendedFeedEntries;
|
||||
const desktopTodayEntries = useMemo(
|
||||
() => filterTodayPublishedEntries(generalLatestEntries),
|
||||
[generalLatestEntries],
|
||||
@@ -4757,35 +4757,18 @@ export function RpgEntryHomeView({
|
||||
const desktopFeaturedGrid = desktopRecommendEntries.slice(0, 4);
|
||||
const desktopCategoryGrid = activeCategoryEntries.slice(0, 6);
|
||||
const desktopLibraryPreview = myEntries.slice(0, 2);
|
||||
const recommendedFeedEntries = useMemo(() => {
|
||||
const entryMap = new Map<string, PlatformPublicGalleryCard>();
|
||||
[...featuredShelf, ...generalLatestEntries].forEach((entry) => {
|
||||
entryMap.set(buildPublicGalleryCardKey(entry), entry);
|
||||
});
|
||||
|
||||
return Array.from(entryMap.values());
|
||||
}, [featuredShelf, generalLatestEntries]);
|
||||
const discoverFeedEntries = useMemo(() => {
|
||||
const entryMap = new Map<string, PlatformPublicGalleryCard>();
|
||||
const sourceEntries =
|
||||
discoverChannel === 'recommend'
|
||||
? recommendedFeedEntries
|
||||
: filterTodayPublishedEntries(generalLatestEntries);
|
||||
|
||||
sourceEntries.forEach((entry) => {
|
||||
entryMap.set(buildPublicGalleryCardKey(entry), entry);
|
||||
});
|
||||
|
||||
return Array.from(entryMap.values());
|
||||
return dedupePlatformPublicGalleryEntries(sourceEntries);
|
||||
}, [discoverChannel, generalLatestEntries, recommendedFeedEntries]);
|
||||
const edutainmentFeedEntries = useMemo(() => {
|
||||
const entryMap = new Map<string, PlatformPublicGalleryCard>();
|
||||
edutainmentEntries.forEach((entry) => {
|
||||
entryMap.set(buildPublicGalleryCardKey(entry), entry);
|
||||
});
|
||||
|
||||
return Array.from(entryMap.values());
|
||||
}, [edutainmentEntries]);
|
||||
const edutainmentFeedEntries = useMemo(
|
||||
() => dedupePlatformPublicGalleryEntries(edutainmentEntries),
|
||||
[edutainmentEntries],
|
||||
);
|
||||
const mobileFeedCarouselEnabled =
|
||||
!isDesktopLayout &&
|
||||
activeTab === 'category' &&
|
||||
@@ -4883,41 +4866,24 @@ export function RpgEntryHomeView({
|
||||
buildPlatformRankingEntries(publicEntries, activeRankingTab).slice(0, 30),
|
||||
[activeRankingTab, publicEntries],
|
||||
);
|
||||
const activeRecommendEntry =
|
||||
recommendedFeedEntries.find(
|
||||
(entry) => buildPublicGalleryCardKey(entry) === activeRecommendEntryKey,
|
||||
) ??
|
||||
recommendedFeedEntries[0] ??
|
||||
null;
|
||||
const activeRecommendIndex = activeRecommendEntry
|
||||
? recommendedFeedEntries.findIndex(
|
||||
(entry) =>
|
||||
buildPublicGalleryCardKey(entry) ===
|
||||
buildPublicGalleryCardKey(activeRecommendEntry),
|
||||
)
|
||||
: -1;
|
||||
const previousRecommendEntry =
|
||||
activeRecommendIndex >= 0 && recommendedFeedEntries.length > 1
|
||||
? recommendedFeedEntries[
|
||||
(activeRecommendIndex - 1 + recommendedFeedEntries.length) %
|
||||
recommendedFeedEntries.length
|
||||
]
|
||||
: null;
|
||||
const nextRecommendEntry =
|
||||
activeRecommendIndex >= 0 && recommendedFeedEntries.length > 1
|
||||
? recommendedFeedEntries[
|
||||
(activeRecommendIndex + 1) % recommendedFeedEntries.length
|
||||
]
|
||||
: null;
|
||||
const recommendFeedWindow = useMemo(
|
||||
() =>
|
||||
selectPlatformRecommendFeedWindow(
|
||||
recommendedFeedEntries,
|
||||
activeRecommendEntryKey,
|
||||
),
|
||||
[activeRecommendEntryKey, recommendedFeedEntries],
|
||||
);
|
||||
const activeRecommendEntry = recommendFeedWindow.activeEntry;
|
||||
const previousRecommendEntry = recommendFeedWindow.previousEntry;
|
||||
const nextRecommendEntry = recommendFeedWindow.nextEntry;
|
||||
const [recommendDragOffsetY, setRecommendDragOffsetY] = useState(0);
|
||||
const [recommendDragCommitDirection, setRecommendDragCommitDirection] =
|
||||
useState<1 | -1 | null>(null);
|
||||
const [recommendShareState, setRecommendShareState] = useState<
|
||||
'idle' | 'copied' | 'failed'
|
||||
>('idle');
|
||||
const activeRecommendEntryKeyForSelection = activeRecommendEntry
|
||||
? buildPublicGalleryCardKey(activeRecommendEntry)
|
||||
: null;
|
||||
const activeRecommendEntryKeyForSelection = recommendFeedWindow.activeEntryKey;
|
||||
const recommendShareResetTimerRef = useRef<number | null>(null);
|
||||
const recommendCardStageRef = useRef<HTMLDivElement | null>(null);
|
||||
const recommendDragStartRef = useRef<{
|
||||
|
||||
Reference in New Issue
Block a user