Browse Source

fix:修复 精选推荐 PC端展开的问题

version/1.2.14
leiyuee 3 days ago
parent
commit
75d4081102
  1. 84
      src/pages/Explore/ExploreFeatured/ExploreFeatured.tsx

84
src/pages/Explore/ExploreFeatured/ExploreFeatured.tsx

@ -21,6 +21,7 @@ import "./ExploreFeatured.scss";
const FEATURED_IMAGE_SUB_TYPE = 103; const FEATURED_IMAGE_SUB_TYPE = 103;
const FEATURED_VIDEO_SUB_TYPE = 202; const FEATURED_VIDEO_SUB_TYPE = 202;
const DEFAULT_ACTIVE_FEATURED_INDEX = 1; const DEFAULT_ACTIVE_FEATURED_INDEX = 1;
const FEATURED_CAROUSEL_MEDIA_QUERY = "(max-width: 720px)";
export interface RecommendBannerItem { export interface RecommendBannerItem {
id?: number; id?: number;
@ -41,6 +42,34 @@ type AppDownloadDialogState = {
type FeaturedCardInteractionMode = "grid" | "carousel"; type FeaturedCardInteractionMode = "grid" | "carousel";
function getIsFeaturedCarouselEnabled(): boolean {
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
return false;
}
return window.matchMedia(FEATURED_CAROUSEL_MEDIA_QUERY).matches;
}
function useIsFeaturedCarouselEnabled(): boolean {
const [isEnabled, setIsEnabled] = useState(getIsFeaturedCarouselEnabled);
useEffect(() => {
const mediaQueryList = window.matchMedia(FEATURED_CAROUSEL_MEDIA_QUERY);
const sync = () => {
setIsEnabled(mediaQueryList.matches);
};
sync();
mediaQueryList.addEventListener("change", sync);
return () => {
mediaQueryList.removeEventListener("change", sync);
};
}, []);
return isEnabled;
}
function normalizeBannerUrlList(urlList?: string[]) { function normalizeBannerUrlList(urlList?: string[]) {
if (!Array.isArray(urlList)) return []; if (!Array.isArray(urlList)) return [];
return [...new Set(urlList.map((item) => item.trim()).filter(Boolean))]; return [...new Set(urlList.map((item) => item.trim()).filter(Boolean))];
@ -84,6 +113,7 @@ export default function ExploreFeatured() {
const requestApplyMedia = useGlobalPromptImageStore((s) => s.requestApplyMedia); const requestApplyMedia = useGlobalPromptImageStore((s) => s.requestApplyMedia);
const requestComposerExpand = useComposerStore((s) => s.requestComposerExpand); const requestComposerExpand = useComposerStore((s) => s.requestComposerExpand);
const isSkeletonPreviewing = useExploreSkeletonPreview(); const isSkeletonPreviewing = useExploreSkeletonPreview();
const isFeaturedCarouselEnabled = useIsFeaturedCarouselEnabled();
const featuredSwiperRef = useRef<SwiperInstance | null>(null); const featuredSwiperRef = useRef<SwiperInstance | null>(null);
const [recommendBannerList, setRecommendBannerList] = useState<RecommendBannerItem[]>([]); const [recommendBannerList, setRecommendBannerList] = useState<RecommendBannerItem[]>([]);
@ -91,6 +121,12 @@ export default function ExploreFeatured() {
const [activeFeaturedIndex, setActiveFeaturedIndex] = useState(DEFAULT_ACTIVE_FEATURED_INDEX); const [activeFeaturedIndex, setActiveFeaturedIndex] = useState(DEFAULT_ACTIVE_FEATURED_INDEX);
const [appDownloadDialog, setAppDownloadDialog] = useState<AppDownloadDialogState | null>(null); const [appDownloadDialog, setAppDownloadDialog] = useState<AppDownloadDialogState | null>(null);
useEffect(() => {
if (!isFeaturedCarouselEnabled) {
featuredSwiperRef.current = null;
}
}, [isFeaturedCarouselEnabled]);
useEffect(() => { useEffect(() => {
let isActive = true; let isActive = true;
@ -175,7 +211,7 @@ export default function ExploreFeatured() {
); );
const renderFeaturedCard = (config: (typeof EXPLORE_FEATURED_ITEMS)[number], index: number, mode: FeaturedCardInteractionMode) => { const renderFeaturedCard = (config: (typeof EXPLORE_FEATURED_ITEMS)[number], index: number, mode: FeaturedCardInteractionMode) => {
const banner = recommendBannerList[index]; const banner = index < recommendBannerList.length ? recommendBannerList[index] : undefined;
const urlList = normalizeBannerUrlList(banner?.urlList); const urlList = normalizeBannerUrlList(banner?.urlList);
const collapsedCover = getBannerCover(banner); const collapsedCover = getBannerCover(banner);
const expandedCover = urlList[0] ?? collapsedCover; const expandedCover = urlList[0] ?? collapsedCover;
@ -236,28 +272,30 @@ export default function ExploreFeatured() {
<> <>
<div className="explorePage__featuredGrid">{EXPLORE_FEATURED_ITEMS.map((config, index) => renderFeaturedCard(config, index, "grid"))}</div> <div className="explorePage__featuredGrid">{EXPLORE_FEATURED_ITEMS.map((config, index) => renderFeaturedCard(config, index, "grid"))}</div>
<Swiper {isFeaturedCarouselEnabled ? (
className="explorePage__featuredCarousel" <Swiper
modules={[EffectCoverflow]} className="explorePage__featuredCarousel"
effect="coverflow" modules={[EffectCoverflow]}
centeredSlides={true} effect="coverflow"
slidesPerView="auto" centeredSlides={true}
initialSlide={DEFAULT_ACTIVE_FEATURED_INDEX} slidesPerView="auto"
loop={EXPLORE_FEATURED_ITEMS.length > 3} initialSlide={activeFeaturedIndex}
coverflowEffect={{ rotate: 0, stretch: -28, depth: 60, modifier: 1, slideShadows: false }} loop={EXPLORE_FEATURED_ITEMS.length > 3}
onSwiper={(swiper) => { coverflowEffect={{ rotate: 0, stretch: -28, depth: 60, modifier: 1, slideShadows: false }}
featuredSwiperRef.current = swiper; onSwiper={(swiper) => {
}} featuredSwiperRef.current = swiper;
onSlideChange={(swiper) => { }}
setActiveFeaturedIndex(swiper.realIndex); onSlideChange={(swiper) => {
}} setActiveFeaturedIndex(swiper.realIndex);
> }}
{EXPLORE_FEATURED_ITEMS.map((config, index) => ( >
<SwiperSlide className="explorePage__featuredCarouselSlide" key={config.id}> {EXPLORE_FEATURED_ITEMS.map((config, index) => (
{renderFeaturedCard(config, index, "carousel")} <SwiperSlide className="explorePage__featuredCarouselSlide" key={config.id}>
</SwiperSlide> {renderFeaturedCard(config, index, "carousel")}
))} </SwiperSlide>
</Swiper> ))}
</Swiper>
) : null}
</> </>
)} )}

Loading…
Cancel
Save