import { Button, Divider, Empty, Flex, Pagination, Skeleton, Space, Switch, Typography } from "antd"; import type { IEventInfo } from "../types"; import { useCallback, useEffect, useMemo, useState } from "react"; import { EventCard } from "./EventCard"; import { useRequest } from "ahooks"; import { CalendarOutlined } from "@ant-design/icons"; import { STORE_PAGE_LIST_KEY } from "../utils/constants"; interface Props { clubId: string; } const getStorageKey = (clubId: string) => `events-page-${clubId}`; export const ClubEvenList = (props: Props) => { const [paginationControlVisible, setPaginationControlVisible] = useState(true); const [showFinishedEvents, setShowFinishedEvents] = useState(false); const requestEvents = useRequest<{data: IEventInfo[]; total: number; }, [string, number]>( async (clubId: string, page = 1) => { if (!clubId) return { data: [], total: 0 }; return fetch(`/api/club/${clubId}/events?page=${page}`).then(e => e.json()); }, { manual: true, refreshDeps: [] }); const [page, setPageState] = useState(1); const setPage = useCallback((page: number) => { const key = getStorageKey(props.clubId); sessionStorage.setItem(key, page.toString()); setPageState(page); }, [props.clubId]) const onPageChange = useCallback((page: number) => { setPage(page); requestEvents.runAsync(props.clubId, page); }, [props.clubId, setPage]); const pagination = useMemo(() => { return { page, onPageChange, total: requestEvents.data?.total ?? 0, } }, [requestEvents.data?.total, page]); const visibleEvents = useMemo(() => { const events = requestEvents.data?.data || []; if (showFinishedEvents) return events; return events.filter(e => !e.isFinished); }, [showFinishedEvents, requestEvents.data?.data]); const onPageInit = useCallback(async () => { const storePageKey = getStorageKey(props.clubId); const keys: string[] = JSON.parse(localStorage.getItem(STORE_PAGE_LIST_KEY) ?? '[]'); if (!keys.includes(storePageKey)) { keys.push(storePageKey); localStorage.setItem(STORE_PAGE_LIST_KEY, JSON.stringify(keys)); } const prePage = Number(sessionStorage.getItem(storePageKey)) || 1; const data = await requestEvents.runAsync(props.clubId, prePage).then(res => res.data); setPage(prePage); if (data.length) { const isAllFinishedOrAllNotFinished = data.every(e => e.isFinished) || data.every(e => !e.isFinished); setShowFinishedEvents(prePage !== 1 || isAllFinishedOrAllNotFinished); setPaginationControlVisible(prePage === 1 ? !isAllFinishedOrAllNotFinished : false); } }, [props.clubId]); useEffect(() => { const id = setTimeout(() => { onPageInit(); }, 300); return () => clearTimeout(id); }, [onPageInit]); const handleAddToCalendar = useCallback(() => { const url = `${window.location.origin}/api/club/${props.clubId}/calendar.ics`; const uri = url.replace(/^http(s)?/, 'webcal'); console.debug(uri); window.open(uri); }, [props.clubId, page]); return ( <> {paginationControlVisible ? ( 显示已结束的活动 setShowFinishedEvents(!showFinishedEvents)} unCheckedChildren="隐藏" checkedChildren="显示" /> ) : null} {showFinishedEvents ? ( ) : null} {requestEvents.loading ? ( ) : (<>{visibleEvents.length ? visibleEvents.map(e => { return (
); }) : })} {showFinishedEvents ? ( ) : null}
); }