import { Shout, Topic } from '../../graphql/schema/core.gen' import { getPagePath } from '@nanostores/router' import { batch, createMemo, createSignal, For, onMount, Show } from 'solid-js' import { useLocalize } from '../../context/localize' import { router } from '../../stores/router' import { loadShouts, loadTopArticles, loadTopMonthArticles, useArticlesStore, } from '../../stores/zine/articles' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' import { useTopicsStore } from '../../stores/zine/topics' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { splitToPages } from '../../utils/splitToPages' import { Icon } from '../_shared/Icon' import { ArticleCardSwiper } from '../_shared/SolidSwiper/ArticleCardSwiper' import Banner from '../Discours/Banner' import Hero from '../Discours/Hero' import { Beside } from '../Feed/Beside' import Group from '../Feed/Group' import { Row1 } from '../Feed/Row1' import { Row2 } from '../Feed/Row2' import { Row3 } from '../Feed/Row3' import { Row5 } from '../Feed/Row5' import RowShort from '../Feed/RowShort' import { Topics } from '../Nav/Topics' import styles from './Home.module.scss' import { apiClient } from '../../graphql/client/core' type Props = { shouts: Shout[] } export const PRERENDERED_ARTICLES_COUNT = 5 export const RANDOM_TOPICS_COUNT = 12 export const RANDOM_TOPIC_SHOUTS_COUNT = 7 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: Props) => { const { sortedArticles, topArticles, topCommentedArticles, topMonthArticles, topViewedArticles } = useArticlesStore({ shouts: props.shouts, }) const { topTopics } = useTopicsStore() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { topAuthors } = useTopAuthorsStore() const { t } = useLocalize() const [randomTopic, setRandomTopic] = createSignal(null) const [randomTopicArticles, setRandomTopicArticles] = createSignal([]) onMount(async () => { loadTopArticles() loadTopMonthArticles() if (sortedArticles().length < PRERENDERED_ARTICLES_COUNT + CLIENT_LOAD_ARTICLES_COUNT) { const { hasMore } = await loadShouts({ filters: { published: true }, limit: CLIENT_LOAD_ARTICLES_COUNT, offset: sortedArticles().length, }) setIsLoadMoreButtonVisible(hasMore) } const result = await apiClient.getRandomTopicShouts(RANDOM_TOPIC_SHOUTS_COUNT) if (!result) console.warn('[apiClient.getRandomTopicShouts] failed') batch(() => { if (result?.topic) setRandomTopic(result.topic) if (result?.shouts) setRandomTopicArticles(result.shouts) }) }) const loadMore = async () => { saveScrollPosition() const { hasMore } = await loadShouts({ filters: { published: true }, 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}> {t('Top commented')}} nodate={true} />
{randomTopic().title}
} />
{(page) => ( <> )}

) }