"use client"; import useEmblaCarousel from "embla-carousel-react" import { useCallback, useEffect, useState } from "react" import Link from "next/link" import { RankType } from "@/types/global" import { useHomeData } from "../../context/HomeDataContext" import MostChatItem from "./MostChatItem" import MostChatSkeleton from "./MostChatSkeleton" import { IconButton } from "@/components/ui/button"; const MostChat = () => { // 从 Context 获取数据 const { data: homeData, isLoading } = useHomeData() // 只取前20条数据 const displayData = homeData?.mostChat?.slice(0, 20) || [] // 根据屏幕宽度计算每次滑动的卡片数量 const getSlidesToScroll = () => { if (typeof window === 'undefined') return 3 const width = window.innerWidth if (width < 640) return 1 // 移动端: 1列 if (width < 1024) return 2 // sm-lg: 2列 if (width < 1280) return 2 // lg-xl: 2列 return 3 // xl+: 3列 } const [slidesToScroll, setSlidesToScroll] = useState(getSlidesToScroll()) const [emblaRef, emblaApi] = useEmblaCarousel({ align: "start", containScroll: "trimSnaps", slidesToScroll: slidesToScroll, skipSnaps: false }) const [canScrollPrev, setCanScrollPrev] = useState(false) const [canScrollNext, setCanScrollNext] = useState(false) const scrollPrev = useCallback(() => { if (emblaApi) emblaApi.scrollPrev() }, [emblaApi]) const scrollNext = useCallback(() => { if (emblaApi) emblaApi.scrollNext() }, [emblaApi]) const onSelect = useCallback(() => { if (!emblaApi) return setCanScrollPrev(emblaApi.canScrollPrev()) setCanScrollNext(emblaApi.canScrollNext()) }, [emblaApi]) useEffect(() => { if (!emblaApi) return onSelect() emblaApi.on("select", onSelect) emblaApi.on("reInit", onSelect) return () => { emblaApi.off("select", onSelect) emblaApi.off("reInit", onSelect) } }, [emblaApi, onSelect]) // 监听窗口大小变化,动态调整 slidesToScroll useEffect(() => { const handleResize = () => { const newSlidesToScroll = getSlidesToScroll() if (newSlidesToScroll !== slidesToScroll) { setSlidesToScroll(newSlidesToScroll) // 重新初始化 Embla if (emblaApi) { emblaApi.reInit() } } } window.addEventListener('resize', handleResize) return () => window.removeEventListener('resize', handleResize) }, [slidesToScroll, emblaApi]) return (