mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-21 11:42:05 +00:00
LoadRange action dispatched on scroll
This commit is contained in:
parent
24589034df
commit
9bd9b18365
2 changed files with 30 additions and 3 deletions
|
|
@ -11,14 +11,28 @@ const styles = require('./styles');
|
||||||
const Board = () => {
|
const Board = () => {
|
||||||
const profile = useProfile();
|
const profile = useProfile();
|
||||||
const streamingServer = useStreamingServer();
|
const streamingServer = useStreamingServer();
|
||||||
const board = useBoard();
|
const [board, loadBoardCatalogs] = useBoard();
|
||||||
const continueWatchingPreview = useContinueWatchingPreview();
|
const continueWatchingPreview = useContinueWatchingPreview();
|
||||||
const boardCatalogsOffset = continueWatchingPreview.libraryItems.length > 0 ? 1 : 0;
|
const boardCatalogsOffset = continueWatchingPreview.libraryItems.length > 0 ? 1 : 0;
|
||||||
const scrollContainerRef = React.useRef();
|
const scrollContainerRef = React.useRef();
|
||||||
const virtualizer = useVirtual({
|
const virtualizer = useVirtual({
|
||||||
size: board.catalogs.length + boardCatalogsOffset,
|
|
||||||
parentRef: scrollContainerRef,
|
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 (
|
return (
|
||||||
<div className={styles['board-container']}>
|
<div className={styles['board-container']}>
|
||||||
<MainNavBars className={styles['board-content-container']} route={'board'}>
|
<MainNavBars className={styles['board-content-container']} route={'board'}>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// Copyright (C) 2017-2022 Smart code 203358507
|
// Copyright (C) 2017-2022 Smart code 203358507
|
||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
|
const debounce = require('lodash.debounce');
|
||||||
|
const { useServices } = require('stremio/services');
|
||||||
const { useModelState } = require('stremio/common');
|
const { useModelState } = require('stremio/common');
|
||||||
|
|
||||||
const init = () => ({
|
const init = () => ({
|
||||||
|
|
@ -9,6 +11,7 @@ const init = () => ({
|
||||||
});
|
});
|
||||||
|
|
||||||
const useBoard = () => {
|
const useBoard = () => {
|
||||||
|
const { core } = useServices();
|
||||||
const action = React.useMemo(() => ({
|
const action = React.useMemo(() => ({
|
||||||
action: 'Load',
|
action: 'Load',
|
||||||
args: {
|
args: {
|
||||||
|
|
@ -16,7 +19,17 @@ const useBoard = () => {
|
||||||
args: { extra: [] }
|
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;
|
module.exports = useBoard;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue