"use client"; import React, { useEffect, useRef, useState, useImperativeHandle, forwardRef, } from "react"; import { Tabs, Swiper, Toast, List, InfiniteScroll } from "antd-mobile"; import PostItem from "@/components/PostItem"; import "./index.css"; import Link from "next/link"; import Empty from "@/components/Empty"; import { useRouter } from "next/navigation"; import PostItemSkeleton from "@/components/skeletons/PostItemSkeleton"; import SpaceItemSkeleton from "@/components/skeletons/SpaceItemSkeleton"; import requireAPI from "@/utils/requireAPI"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faRefresh } from "@fortawesome/free-solid-svg-icons"; import InfiniteScrollContent from "@/components/InfiniteScrollContent"; import OwnIcon from "@/components/OwnIcon"; import OwnImage from "@/components/OwnImage"; const tabItems = [ { key: "space", title: "空间" }, { key: "post", title: "动态" }, ]; // const scrollHeight = 700; // const scrollHeight = window.innerHeight-126 export default function Space() { const swiperRef = useRef(null); const [activeIndex, setActiveIndex] = useState(0); // const [spacePost, setSpacePost] = useState([]); const [scrollHeight, setScrollHeight] = useState(0); const [offset, setOffset] = useState(0); const [loading, setLoading] = useState(false); const spaceRef = useRef(); const spacePostRef = useRef(); // 获取屏幕高度 // const scrollHeight = 600; useEffect(() => { setScrollHeight(window.innerHeight - 57 - 44); // const handleResize = () => { // setScrollHeight(window.innerHeight - 126); // }; // window.addEventListener("resize", handleResize); // return () => { // // window.removeEventListener("resize", handleResize); // }; }, []); const childrenFunc = async () => { setLoading(true); if (!activeIndex) { await spaceRef.current?.doRefresh(); setLoading(false); } else { await spacePostRef.current?.doRefresh(); setLoading(false); } }; return (
{ const index = tabItems.findIndex((item) => item.key === key); setActiveIndex(index); swiperRef.current?.swipeTo(index); }} > {tabItems.map((item) => ( ))}
{} null} ref={swiperRef} defaultIndex={activeIndex} allowTouchMove={false} onIndexChange={(index) => { setActiveIndex(index); }} > {!activeIndex && ( )} {!!activeIndex && ( )}
{ // scrollRef.current?.scrollTo(0, 0); window.scrollTo({ top: 0, left: 0, behavior: "smooth", // 可选,平滑滚动效果 }); childrenFunc(); // firstRequest(); }} />
); } const VisitingCard = ({ data }) => { const router = useRouter(); return (
router.push("/space/" + data?.streamer_ext?.mid)} > {data?.is_unread_zone_moment_exist === 1 && ( )}
{data?.streamer_ext?.name}
    {data?.admission_price !== 0 && (
  • 付费
  • )} {data.visitor_role === 3 && (
  • 创建者
  • )}
); }; const SpacesList = forwardRef(({ scrollHeight }, ref) => { const router = useRouter(); const [loading, setLoading] = useState(false); const [hasMore, setHasMore] = useState(true); const [offset, setOffset] = useState(0); const [spacesList, setSpacesList] = useState([]); useEffect(() => { // getSpaceList(2).then((res) => { // setSpacesList(res); // setHasMore(true) // }); }, []); useImperativeHandle( ref, () => { return { doRefresh }; }, [] ); async function doRefresh() { // await sleep(1000); // Toast.show({ // icon: "fail", // content: "刷新失败", // }); // throw new Error("刷新失败"); window.scrollTo({ top: 0, left: 0, behavior: "smooth", // 可选,平滑滚动效果 }); const list = await getSpaceList(1); setSpacesList(list); setHasMore(true); return true; } async function loadMore() { // debugger const list = await getSpaceList(!spacesList.length ? 2 : 0); if (list.length == 0) { setHasMore(false); } setSpacesList((prev) => [...prev, ...list]); } const getSpaceList = async (type = 2) => { setLoading(true); try { const data = await requireAPI( "POST", "/api/zone/list_by_visitor_mid_v2", { body: { offset, limit: 4 }, } ); setOffset(data.data.offset); setHasMore(data.data.more); setLoading(false); if (data.ret == -1) { // Toast.show({ // icon: "fail", // content: data.msg, // position: "top", // }); return []; } else { return data.data.list; } } catch (error) { setLoading(false); } }; return ( //
{loading && !spacesList.length && (
)} {/* {!!spacesList?.length && ( )} */}
); }); const SpacePostList = forwardRef(({ scrollHeight }, ref) => { const [loading, setLoading] = useState(false); const [hasMore, setHasMore] = useState(false); const [spacePostList, setSpacePostList] = useState([]); const [currentTime, setCurrentTime] = useState(); const [offset, setOffset] = useState(0); const ids = useRef(null); useEffect(() => { getFollowIds().then((res) => { ids.current = res; getSpacePostList(res, 0); }); }, []); useImperativeHandle( ref, () => { return { doRefresh }; }, [] ); async function doRefresh() { // await sleep(1000); // Toast.show({ // icon: "fail", // content: "刷新失败", // }); // throw new Error("刷新失败"); // getRecommPostList(1); window.scrollTo({ top: 0, left: 0, behavior: "smooth", // 可选,平滑滚动效果 }); // setSpacePostList([]); await getSpacePostList(ids.current, 0); return true; } async function loadMore() { await getSpacePostList(ids.current, offset); // const newList = [...spacePostList, ...list]; // setSpacePostList(newList); } const getFollowIds = async () => { setLoading(true); setCurrentTime(Math.floor(new Date().getTime() / 1000)); const data = await requireAPI( "POST", "/api/account_relation/list_follow", { body: { offset, limit: 4 }, }, true ); return data; }; const getSpacePostList = async (data, offset) => { if (data.data.list.length > 0) { //查关注主播展示资料 const postsResponse = await requireAPI( "POST", "/api/zone_moment/list_by_visitor_mid", { body: { offset, limit: 4, }, } ); // debugger; // console.log("offset", postsResponse.data.offset); setOffset(postsResponse.data.offset); setHasMore(postsResponse.data.more); setLoading(false); if (data.ret == -1) { // Toast.show({ // icon: "fail", // content: data.msg, // position: "top", // }); } else { setSpacePostList((old) => { if (!offset) { return postsResponse.data.list; } else { return [...old, ...postsResponse.data.list]; } }); } } else { setLoading(false); } }; return (
{/* */} {loading && !spacePostList.length && (
)} {spacePostList?.map((item, index) => ( ))} {!spacePostList?.length && (
)}
{!!spacePostList?.length && ( )} {/*
*/}
); });