/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import React, { useEffect, useLayoutEffect, useRef, useState, } from 'react'; import Grid from '@mui/material/Grid'; import EmptyView from 'components/util/EmptyView'; import LoadingPlaceholder from 'components/util/LoadingPlaceholder'; import { Typography } from '@mui/material'; import { Box } from '@mui/system'; import MangaCard from './MangaCard'; export interface IMangaGridProps{ mangas: IMangaCard[] isLoading: boolean message?: string messageExtra?: JSX.Element hasNextPage: boolean lastPageNum: number setLastPageNum: (lastPageNum: number) => void gridLayout?: number | undefined horisontal?: boolean | undefined noFaces?: boolean | undefined } export default function MangaGrid(props: IMangaGridProps) { const { mangas, isLoading, message, messageExtra, hasNextPage, lastPageNum, setLastPageNum, gridLayout, horisontal, noFaces, } = props; let mapped; const lastManga = useRef(null); const scrollHandler = () => { if (lastManga.current) { const rect = lastManga.current.getBoundingClientRect(); if (((rect.y + rect.height) / window.innerHeight < 2) && hasNextPage) { setLastPageNum(lastPageNum + 1); } } }; useEffect(() => { window.addEventListener('scroll', scrollHandler, true); return () => { window.removeEventListener('scroll', scrollHandler, true); }; }, [hasNextPage, mangas]); const [dimensions, setDimensions] = useState(1); const gridRef = useRef(null); const TestDimensions = () => { setDimensions(gridRef.current ? gridRef.current.offsetWidth : 0); }; useLayoutEffect(TestDimensions, []); let movementTimer: NodeJS.Timeout; window.addEventListener('resize', () => { clearInterval(movementTimer); movementTimer = setTimeout(TestDimensions, 100); }); if (mangas.length === 0) { if (isLoading) { mapped = ( ); } else { mapped = noFaces ? ( {message} {messageExtra} ) : ( ); } } else { mapped = mangas.map((it, idx) => { if (idx === mangas.length - 1) { return ( ); } return ( ); }); } return (
{mapped}
); } MangaGrid.defaultProps = { message: '', messageExtra: undefined, };