|
| 1 | +import { observer } from 'mobx-react'; |
| 2 | +import { Pager, PagerProps } from 'mobx-restful-table'; |
| 3 | +import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next'; |
| 4 | +import { FC, useContext } from 'react'; |
| 5 | +import { Container } from 'react-bootstrap'; |
| 6 | + |
| 7 | +import { UpcomingEvents } from '../../components/Home/UpcomingEvents'; |
| 8 | +import { PageHead } from '../../components/Layout/PageHead'; |
| 9 | +import { isServer } from '../../models/configuration'; |
| 10 | +import { I18nContext } from '../../models/Translation'; |
| 11 | +import { ArticleMeta, getMarkdownListSortedByDate } from '../api/core'; |
| 12 | + |
| 13 | +const ITEMS_PER_PAGE = 10; |
| 14 | + |
| 15 | +interface ActivityPageProps extends Pick<PagerProps, 'pageIndex' | 'pageCount'> { |
| 16 | + activities: ArticleMeta[]; |
| 17 | +} |
| 18 | + |
| 19 | +export const getStaticPaths: GetStaticPaths = async () => { |
| 20 | + const activities = await getMarkdownListSortedByDate('/article/Wiki/_posts/Activity'); |
| 21 | + const totalPages = Math.ceil(activities.length / ITEMS_PER_PAGE); |
| 22 | + |
| 23 | + const paths = [ |
| 24 | + { params: { page: [] } }, |
| 25 | + ...Array.from({ length: totalPages }, (_, i) => ({ |
| 26 | + params: { page: [i + 1 + ''] }, |
| 27 | + })), |
| 28 | + ]; |
| 29 | + |
| 30 | + return { paths, fallback: false }; |
| 31 | +}; |
| 32 | + |
| 33 | +export const getStaticProps: GetStaticProps<ActivityPageProps> = async ({ params }) => { |
| 34 | + const pageIndex = Number(params?.page?.[0]) || 1; |
| 35 | + const activities = await getMarkdownListSortedByDate('/article/Wiki/_posts/Activity'); |
| 36 | + |
| 37 | + const startIndex = (pageIndex - 1) * ITEMS_PER_PAGE; |
| 38 | + const endIndex = startIndex + ITEMS_PER_PAGE; |
| 39 | + const paginatedActivities = activities.slice(startIndex, endIndex); |
| 40 | + const pageCount = Math.ceil(activities.length / ITEMS_PER_PAGE); |
| 41 | + |
| 42 | + return { |
| 43 | + props: { activities: paginatedActivities, pageIndex, pageCount }, |
| 44 | + revalidate: 3600, |
| 45 | + }; |
| 46 | +}; |
| 47 | + |
| 48 | +const ActivityPage: FC<InferGetStaticPropsType<typeof getStaticProps>> = observer( |
| 49 | + ({ activities, pageIndex, pageCount }) => { |
| 50 | + const { t } = useContext(I18nContext); |
| 51 | + |
| 52 | + return ( |
| 53 | + <Container className="py-5 mt-5"> |
| 54 | + <PageHead title={t('activity_calendar')} /> |
| 55 | + |
| 56 | + <hgroup className="d-flex flex-column align-items-center gap-4"> |
| 57 | + <h1>{t('activity_calendar')}</h1> |
| 58 | + <p className="lead">{t('activity_calendar_description')}</p> |
| 59 | + </hgroup> |
| 60 | + |
| 61 | + <section className="d-flex flex-column align-items-center gap-3"> |
| 62 | + <h2>{t('activity_calendar')}</h2> |
| 63 | + <iframe |
| 64 | + src="https://open-source-bazaar.feishu.cn/share/base/view/shrcn6jNjSKvE9MKPqk56SeSd7p" |
| 65 | + className="w-100 vh-100 border-0" |
| 66 | + allowFullScreen |
| 67 | + /> |
| 68 | + </section> |
| 69 | + |
| 70 | + {activities.length > 0 && ( |
| 71 | + <div className="py-5 bg-white"> |
| 72 | + <UpcomingEvents events={activities} /> |
| 73 | + </div> |
| 74 | + )} |
| 75 | + {pageCount > 1 && !isServer() && ( |
| 76 | + <div className="d-flex justify-content-center mt-4"> |
| 77 | + <Pager {...{ pageIndex, pageCount }} pageSize={ITEMS_PER_PAGE} /> |
| 78 | + </div> |
| 79 | + )} |
| 80 | + </Container> |
| 81 | + ); |
| 82 | + }, |
| 83 | +); |
| 84 | +export default ActivityPage; |
0 commit comments