import { createMemo, createSignal, For, onMount, Show } from 'solid-js' import Banner from '../Discours/Banner' import { NavTopics } from '../Nav/Topics' import { Row5 } from '../Feed/Row5' import { Row3 } from '../Feed/Row3' import { Row2 } from '../Feed/Row2' import { Row1 } from '../Feed/Row1' import Hero from '../Discours/Hero' import { Beside } from '../Feed/Beside' import RowShort from '../Feed/RowShort' import Slider from '../_shared/Slider' import Group from '../Feed/Group' import type { Shout, Topic } from '../../graphql/types.gen' import { useTopicsStore } from '../../stores/zine/topics' import { loadShouts, loadTopArticles, loadTopMonthArticles, useArticlesStore } from '../../stores/zine/articles' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { splitToPages } from '../../utils/splitToPages' import { ArticleCard } from '../Feed/ArticleCard' import { useLocalize } from '../../context/localize' type HomeProps = { randomTopics: Topic[] shouts: Shout[] } export const PRERENDERED_ARTICLES_COUNT = 5 export const RANDOM_TOPICS_COUNT = 12 const CLIENT_LOAD_ARTICLES_COUNT = 29 const LOAD_MORE_PAGE_SIZE = 16 // Row1 + Row3 + Row2 + Beside (3 + 1) + Row1 + Row 2 + Row3 export const HomeView = (props: HomeProps) => { const { sortedArticles, articlesByLayout, topArticles, topCommentedArticles, topMonthArticles, topViewedArticles } = useArticlesStore({ shouts: props.shouts }) const { randomTopics, topTopics } = useTopicsStore({ randomTopics: props.randomTopics }) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { topAuthors } = useTopAuthorsStore() const { t } = useLocalize() onMount(async () => { loadTopArticles() loadTopMonthArticles() if (sortedArticles().length < PRERENDERED_ARTICLES_COUNT + CLIENT_LOAD_ARTICLES_COUNT) { const { hasMore } = await loadShouts({ filters: { visibility: 'public' }, limit: CLIENT_LOAD_ARTICLES_COUNT, offset: sortedArticles().length }) setIsLoadMoreButtonVisible(hasMore) } }) const randomLayout = createMemo(() => { const filledLayouts = Object.keys(articlesByLayout()).filter( // FIXME: is 7 ok? or more complex logic needed? (layout) => articlesByLayout()[layout].length > 7 ) const selectedRandomLayout = filledLayouts.length > 0 ? filledLayouts[Math.floor(Math.random() * filledLayouts.length)] : '' return ( ) }) const loadMore = async () => { saveScrollPosition() const { hasMore } = await loadShouts({ filters: { visibility: 'public' }, limit: LOAD_MORE_PAGE_SIZE, offset: sortedArticles().length }) setIsLoadMoreButtonVisible(hasMore) restoreScrollPosition() } const pages = createMemo(() => splitToPages( sortedArticles(), PRERENDERED_ARTICLES_COUNT + CLIENT_LOAD_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE ) ) return ( 0}> PRERENDERED_ARTICLES_COUNT}> {(a: Shout) => ( )} {t('Top commented')}} nodate={true} /> {randomLayout()} {(a: Shout) => ( )} {(page) => ( <> )}

) }