From 9bd9b18365c0ecfb17af80c07a60751f112055cb Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 17 May 2022 18:36:49 +0300 Subject: [PATCH] LoadRange action dispatched on scroll --- src/routes/Board/Board.js | 18 ++++++++++++++++-- src/routes/Board/useBoard.js | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/routes/Board/Board.js b/src/routes/Board/Board.js index 6280eb18d..80cb289e0 100644 --- a/src/routes/Board/Board.js +++ b/src/routes/Board/Board.js @@ -11,14 +11,28 @@ const styles = require('./styles'); const Board = () => { const profile = useProfile(); const streamingServer = useStreamingServer(); - const board = useBoard(); + const [board, loadBoardCatalogs] = useBoard(); const continueWatchingPreview = useContinueWatchingPreview(); const boardCatalogsOffset = continueWatchingPreview.libraryItems.length > 0 ? 1 : 0; const scrollContainerRef = React.useRef(); const virtualizer = useVirtual({ - size: board.catalogs.length + boardCatalogsOffset, parentRef: scrollContainerRef, + size: board.catalogs.length + boardCatalogsOffset, + overscan: 1 }); + React.useEffect(() => { + if (virtualizer.virtualItems.length === 0) { + return; + } + + const start = Math.max(0, virtualizer.virtualItems[0].index - boardCatalogsOffset); + const end = virtualizer.virtualItems[virtualizer.virtualItems.length - 1].index - boardCatalogsOffset; + if (end < start) { + return; + } + + loadBoardCatalogs(start, end); + }, [virtualizer.virtualItems, boardCatalogsOffset]); return (
diff --git a/src/routes/Board/useBoard.js b/src/routes/Board/useBoard.js index d0d78ed2c..7262d9fc6 100644 --- a/src/routes/Board/useBoard.js +++ b/src/routes/Board/useBoard.js @@ -1,6 +1,8 @@ // Copyright (C) 2017-2022 Smart code 203358507 const React = require('react'); +const debounce = require('lodash.debounce'); +const { useServices } = require('stremio/services'); const { useModelState } = require('stremio/common'); const init = () => ({ @@ -9,6 +11,7 @@ const init = () => ({ }); const useBoard = () => { + const { core } = useServices(); const action = React.useMemo(() => ({ action: 'Load', args: { @@ -16,7 +19,17 @@ const useBoard = () => { args: { extra: [] } } }), []); - return useModelState({ model: 'board', timeout: 1500, action, init }); + const loadRange = React.useCallback(debounce((start, end) => { + core.transport.dispatch({ + action: 'CatalogsWithExtra', + args: { + action: 'LoadRange', + args: { start, end } + } + }, 'board'); + }, 100), []); + const board = useModelState({ model: 'board', timeout: 1500, action, init }); + return [board, loadRange]; }; module.exports = useBoard;