import { PageWrap } from '../Wraps/PageWrap' import type { PageProps } from '../types' import { createMemo, createSignal, For, onCleanup, onMount, Show } from 'solid-js' import { resetSortedArticles } from '../../stores/zine/articles' import { useRouter } from '../../stores/router' import { LayoutType, loadRecentLayoutShouts, useLayoutsStore } from '../../stores/zine/layouts' import { Loading } from '../Loading' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import type { Shout } from '../../graphql/types.gen' import { splitToPages } from '../../utils/splitToPages' import clsx from 'clsx' import { t } from '../../utils/intl' import { Row3 } from '../Feed/Row3' import { Row2 } from '../Feed/Row2' import { Beside } from '../Feed/Beside' import Slider from '../Feed/Slider' import { Row1 } from '../Feed/Row1' import styles from '../../styles/Topic.module.scss' export const PRERENDERED_ARTICLES_COUNT = 21 const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3 export const LayoutShoutsPage = (props: PageProps) => { const layout = createMemo(() => { const { page: getPage } = useRouter() const page = getPage() if (page.route !== 'expo') throw new Error('ts guard') return page.params.layout as LayoutType }) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { sortedLayoutShouts } = useLayoutsStore(layout(), props.shouts) const sortedArticles = createMemo(() => sortedLayoutShouts().get(layout()) || []) const loadMoreLayout = async (kind: LayoutType) => { saveScrollPosition() const { hasMore } = await loadRecentLayoutShouts({ layout: kind, amount: LOAD_MORE_PAGE_SIZE, offset: sortedArticles().length }) setIsLoadMoreButtonVisible(hasMore) restoreScrollPosition() } onMount(async () => { if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) { loadMoreLayout(layout()) } }) const title = createMemo(() => { const l = layout() 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(sortedArticles())) onMount(async () => { if (!isLoaded()) { await loadRecentLayoutShouts({ layout: layout(), amount: PRERENDERED_ARTICLES_COUNT, offset: 0 }) } }) onCleanup(() => resetSortedArticles()) const ModeSwitcher = () => (
{`${t('Show')} `} {t('All posts')}
) return ( }>

{title()}

5}> {(page) => ( <> )}

) } // for lazy loading export default LayoutShoutsPage