diff --git a/components/Pager.tsx b/components/Pager.tsx index d72b586..0a2090f 100644 --- a/components/Pager.tsx +++ b/components/Pager.tsx @@ -8,6 +8,7 @@ import { } from "../contexts/LoadingContext"; import removeEmpty from "../lib/removeEmpty"; import { UrlObject } from "url"; +import { actualMaxPageNumber } from "../lib/pager"; type Url = string | UrlObject; @@ -42,33 +43,17 @@ const PagerButton: FC<PagerButtonProps> = ({ href, children }) => { const Pager = () => { const options = useSearchGlobalState(); - const loading = useLoadingGlobalState(); - const [, setMaxPages] = useState(1); const [hasPrevPrevPage, setHasPrevPrevPage] = useState(false); const [hasPrevPage, setHasPrevPage] = useState(false); const [hasNextPage, setHasNextPage] = useState(false); const [hasNextNextPage, setHasNextNextPage] = useState(false); - const LIMIT = 100; - const calcPageNumber = () => { - const { count } = options; - if (count === 0) { - return 0; - } - return Math.ceil(count / LIMIT); - }; - useEffect(() => { - const pageNumber = calcPageNumber(); - setMaxPages(pageNumber); + const actualMaxPageNum = actualMaxPageNumber(options.per, options.count); setHasPrevPrevPage(options.page > 2); setHasPrevPage(options.page > 1); - setHasNextPage( - pageNumber > options.page && 1600 / options.per >= options.page - ); - setHasNextNextPage( - pageNumber > options.page + 1 && 1600 / options.per >= options.page + 1 - ); + setHasNextPage(actualMaxPageNum > options.page); + setHasNextNextPage(actualMaxPageNum > options.page + 1); }, [options]); return ( diff --git a/lib/pager.ts b/lib/pager.ts new file mode 100644 index 0000000..f426d95 --- /dev/null +++ b/lib/pager.ts @@ -0,0 +1,15 @@ +export const MAX_OFFSET = 1600; + +export const maxPageNumber = (per: number): number => { + return Math.ceil(MAX_OFFSET / per) + 1; +}; + +export const calcPageNumber = (per: number, count: number) => { + if (count === 0) { + return 0; + } + return Math.ceil(count / per); +}; + +export const actualMaxPageNumber = (per: number, count: number) => + Math.min(maxPageNumber(per), calcPageNumber(per, count)); diff --git a/pages/search.tsx b/pages/search.tsx index 9301293..19742be 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -27,6 +27,8 @@ import { format } from "date-fns"; import * as Sentry from "@sentry/node"; import { AxiosError } from "axios"; +import { actualMaxPageNumber, MAX_OFFSET } from "../lib/pager"; + export default function Search({ videos, searchOptions, @@ -90,9 +92,6 @@ const calcOffset = (page?: number, per: number = 100): number => { page = 1; } let offset = (page - 1) * per; - if (offset > 1600) { - return 1600; - } return offset; }; @@ -288,6 +287,10 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { > => { if (shouldExecCall(searchOptions)) { const searchQuery = getSearchQuery(searchOptions); + if (searchQuery._offset > MAX_OFFSET) { + searchQuery._offset = 0; + searchQuery._limit = 0; + } const response = ( await client.search(searchQuery, usedFields).catch((e: AxiosError) => { Sentry.captureException(e); @@ -316,6 +319,15 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { }; } + const actualMaxPageNum = actualMaxPageNumber( + searchOptions.per, + response.meta.totalCount + ); + + if (actualMaxPageNum < searchOptions.page) { + searchOptions.page = actualMaxPageNum + 1; + } + return { props: { videos: response.data,