From 1c94638ce8fee4a7173e2a250d0da10af7353c1f Mon Sep 17 00:00:00 2001 From: Ilya Y <75578537+ilya-bkv@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:55:34 +0300 Subject: [PATCH] Add pagination on Expo (#441) * Add pagination on Expo * update Expo load articles method --- src/components/Views/Expo/Expo.tsx | 51 +++++++++++------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/src/components/Views/Expo/Expo.tsx b/src/components/Views/Expo/Expo.tsx index 82e43dfe..8506bf24 100644 --- a/src/components/Views/Expo/Expo.tsx +++ b/src/components/Views/Expo/Expo.tsx @@ -1,16 +1,14 @@ import { getPagePath } from '@nanostores/router' import { clsx } from 'clsx' -import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js' +import { For, Show, createEffect, createSignal, on, onCleanup, onMount } from 'solid-js' import { useLocalize } from '../../../context/localize' import { apiClient } from '../../../graphql/client/core' import { LoadShoutsFilters, LoadShoutsOptions, Shout } from '../../../graphql/schema/core.gen' import { LayoutType } from '../../../pages/types' import { router } from '../../../stores/router' -import { loadShouts, resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles' import { getUnixtime } from '../../../utils/getServerDate' import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll' -import { splitToPages } from '../../../utils/splitToPages' import { ArticleCard } from '../../Feed/ArticleCard' import { Button } from '../../_shared/Button' import { ConditionalWrapper } from '../../_shared/ConditionalWrapper' @@ -28,19 +26,12 @@ export const PRERENDERED_ARTICLES_COUNT = 36 const LOAD_MORE_PAGE_SIZE = 12 export const Expo = (props: Props) => { - const [isLoaded, setIsLoaded] = createSignal(Boolean(props.shouts)) + const { t } = useLocalize() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) - const [favoriteTopArticles, setFavoriteTopArticles] = createSignal([]) const [reactedTopMonthArticles, setReactedTopMonthArticles] = createSignal([]) - - const { t } = useLocalize() - - const { sortedArticles } = useArticlesStore({ - shouts: isLoaded() ? props.shouts : [], - layout: props.layout, - }) - + const [articlesEndPage, setArticlesEndPage] = createSignal(PRERENDERED_ARTICLES_COUNT) + const [expoShouts, setExpoShouts] = createSignal([]) const getLoadShoutsFilters = (additionalFilters: LoadShoutsFilters = {}): LoadShoutsFilters => { const filters = { ...additionalFilters } @@ -58,15 +49,18 @@ export const Expo = (props: Props) => { const options: LoadShoutsOptions = { filters: getLoadShoutsFilters(), limit: count, - offset: sortedArticles().length, + offset: expoShouts().length, } options.filters = props.layout ? { layouts: [props.layout] } : { layouts: ['audio', 'video', 'image', 'literature'] } - const { hasMore } = await loadShouts(options) + const newShouts = await apiClient.getShouts(options) + const hasMore = newShouts?.length !== options.limit + 1 && newShouts?.length !== 0 setIsLoadMoreButtonVisible(hasMore) + + setExpoShouts((prev) => [...prev, ...newShouts]) } const loadMoreWithoutScrolling = async (count: number) => { @@ -100,19 +94,7 @@ export const Expo = (props: Props) => { } onMount(() => { - if (isLoaded()) { - return - } - loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE) - setIsLoaded(true) - }) - - onMount(() => { - if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) { - loadMore(LOAD_MORE_PAGE_SIZE) - } - loadRandomTopArticles() loadRandomTopMonthArticles() }) @@ -121,9 +103,11 @@ export const Expo = (props: Props) => { on( () => props.layout, () => { - resetSortedArticles() + setExpoShouts([]) + setIsLoadMoreButtonVisible(false) setFavoriteTopArticles([]) setReactedTopMonthArticles([]) + setArticlesEndPage(PRERENDERED_ARTICLES_COUNT) loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE) loadRandomTopArticles() loadRandomTopMonthArticles() @@ -132,16 +116,17 @@ export const Expo = (props: Props) => { ) onCleanup(() => { - resetSortedArticles() + setExpoShouts([]) }) const handleLoadMoreClick = () => { loadMoreWithoutScrolling(LOAD_MORE_PAGE_SIZE) + setArticlesEndPage((prev) => prev + LOAD_MORE_PAGE_SIZE) } return (
- 0} fallback={}> + 0} fallback={}>
  • @@ -194,7 +179,7 @@ export const Expo = (props: Props) => {
- + {(shout) => (
{ 0} keyed={true}> - + {(shout) => (
{ 0} keyed={true}> - + {(shout) => (