import { PageLayout } from '../components/_shared/PageLayout' import type { LayoutType, PageProps } from './types' import { createEffect, createMemo, createSignal, For, onCleanup, onMount, Show } from 'solid-js' import { loadShouts, resetSortedArticles, useArticlesStore } from '../stores/zine/articles' import { router, useRouter } from '../stores/router' import { Loading } from '../components/_shared/Loading' import { restoreScrollPosition, saveScrollPosition } from '../utils/scroll' import type { Shout } from '../graphql/types.gen' import { splitToPages } from '../utils/splitToPages' import { clsx } from 'clsx' import { Row3 } from '../components/Feed/Row3' import { Row2 } from '../components/Feed/Row2' import { Beside } from '../components/Feed/Beside' import { Slider } from '../components/_shared/Slider' import { Row1 } from '../components/Feed/Row1' import styles from '../styles/Topic.module.scss' import { ArticleCard } from '../components/Feed/ArticleCard' import { useLocalize } from '../context/localize' import { getPagePath } from '@nanostores/router' import { Title } from '@solidjs/meta' export const PRERENDERED_ARTICLES_COUNT = 27 const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3 export const LayoutShoutsPage = (props: PageProps) => { const { t } = useLocalize() const { page: getPage } = useRouter() const getLayout = createMemo(() => { const layout = getPage().params['layout'] return layout as LayoutType }) const { sortedArticles } = useArticlesStore({ shouts: props.layoutShouts }) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const loadMore = async (count) => { saveScrollPosition() const { hasMore } = await loadShouts({ filters: { layout: getLayout() }, limit: count, offset: sortedArticles().length }) setIsLoadMoreButtonVisible(hasMore) restoreScrollPosition() } const title = createMemo(() => { const l = getLayout() if (l === 'audio') return t('Audio') if (l === 'video') return t('Video') if (l === 'image') return t('Artworks') return t('Literature') }) const pages = createMemo(() => splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE) ) const isLoaded = createMemo(() => Boolean(props.layoutShouts)) onMount(() => { if (isLoaded()) { return } loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE) }) onMount(() => { if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) { loadMore(LOAD_MORE_PAGE_SIZE) } }) createEffect((prevLayout) => { if (prevLayout !== getLayout()) { resetSortedArticles() loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE) } return getLayout() }, getLayout()) onCleanup(() => { resetSortedArticles() }) const handleLoadMoreClick = () => { loadMore(LOAD_MORE_PAGE_SIZE) } return ( {title()} }>

{title()}

0} fallback={}> {(article) => ( )} 5}> {(page) => ( <> )}

) } export const Page = LayoutShoutsPage