mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-21 11:42:05 +00:00
dicover adapted to changes in core
This commit is contained in:
parent
b4a72b96a0
commit
874abf6ffa
3 changed files with 29 additions and 66 deletions
|
|
@ -5,15 +5,17 @@ const PropTypes = require('prop-types');
|
||||||
const classnames = require('classnames');
|
const classnames = require('classnames');
|
||||||
const Icon = require('@stremio/stremio-icons/dom');
|
const Icon = require('@stremio/stremio-icons/dom');
|
||||||
const { useServices } = require('stremio/services');
|
const { useServices } = require('stremio/services');
|
||||||
const { AddonDetailsModal, Button, MainNavBars, MetaItem, Image, MetaPreview, Multiselect, ModalDialog, PaginationInput, CONSTANTS, useBinaryState } = require('stremio/common');
|
const { AddonDetailsModal, Button, MainNavBars, MetaItem, Image, MetaPreview, Multiselect, ModalDialog, CONSTANTS, useBinaryState, useOnScrollToBottom } = require('stremio/common');
|
||||||
const useDiscover = require('./useDiscover');
|
const useDiscover = require('./useDiscover');
|
||||||
const useSelectableInputs = require('./useSelectableInputs');
|
const useSelectableInputs = require('./useSelectableInputs');
|
||||||
const styles = require('./styles');
|
const styles = require('./styles');
|
||||||
|
|
||||||
|
const SCROLL_TO_BOTTOM_TRESHOLD = 400;
|
||||||
|
|
||||||
const Discover = ({ urlParams, queryParams }) => {
|
const Discover = ({ urlParams, queryParams }) => {
|
||||||
const { core } = useServices();
|
const { core } = useServices();
|
||||||
const discover = useDiscover(urlParams, queryParams);
|
const [discover, loadNextPage] = useDiscover(urlParams, queryParams);
|
||||||
const [selectInputs, paginationInput] = useSelectableInputs(discover);
|
const [selectInputs, hasNextPage] = useSelectableInputs(discover);
|
||||||
const [inputsModalOpen, openInputsModal, closeInputsModal] = useBinaryState(false);
|
const [inputsModalOpen, openInputsModal, closeInputsModal] = useBinaryState(false);
|
||||||
const [addonModalOpen, openAddonModal, closeAddonModal] = useBinaryState(false);
|
const [addonModalOpen, openAddonModal, closeAddonModal] = useBinaryState(false);
|
||||||
const [selectedMetaItemIndex, setSelectedMetaItemIndex] = React.useState(0);
|
const [selectedMetaItemIndex, setSelectedMetaItemIndex] = React.useState(0);
|
||||||
|
|
@ -62,6 +64,12 @@ const Discover = ({ urlParams, queryParams }) => {
|
||||||
event.currentTarget.focus();
|
event.currentTarget.focus();
|
||||||
}
|
}
|
||||||
}, [selectedMetaItemIndex]);
|
}, [selectedMetaItemIndex]);
|
||||||
|
const onScrollToBottom = React.useCallback(() => {
|
||||||
|
if (hasNextPage) {
|
||||||
|
loadNextPage();
|
||||||
|
}
|
||||||
|
}, [hasNextPage, loadNextPage]);
|
||||||
|
const onScroll = useOnScrollToBottom(onScrollToBottom, SCROLL_TO_BOTTOM_TRESHOLD);
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
closeInputsModal();
|
closeInputsModal();
|
||||||
closeAddonModal();
|
closeAddonModal();
|
||||||
|
|
@ -94,13 +102,6 @@ const Discover = ({ urlParams, queryParams }) => {
|
||||||
<Button className={styles['filter-container']} title={'All filters'} onClick={openInputsModal}>
|
<Button className={styles['filter-container']} title={'All filters'} onClick={openInputsModal}>
|
||||||
<Icon className={styles['filter-icon']} icon={'ic_filter'} />
|
<Icon className={styles['filter-icon']} icon={'ic_filter'} />
|
||||||
</Button>
|
</Button>
|
||||||
<div className={styles['spacing']} />
|
|
||||||
{
|
|
||||||
paginationInput !== null ?
|
|
||||||
<PaginationInput {...paginationInput} className={styles['pagination-input']} />
|
|
||||||
:
|
|
||||||
<PaginationInput label={'1'} className={classnames(styles['pagination-input'], styles['pagination-input-placeholder'])} />
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
:
|
:
|
||||||
null
|
null
|
||||||
|
|
@ -141,7 +142,7 @@ const Discover = ({ urlParams, queryParams }) => {
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
:
|
:
|
||||||
<div ref={metaItemsContainerRef} className={styles['meta-items-container']} onFocusCapture={metaItemsOnFocusCapture}>
|
<div ref={metaItemsContainerRef} className={styles['meta-items-container']} onScroll={onScroll} onFocusCapture={metaItemsOnFocusCapture}>
|
||||||
{discover.catalog.content.content.map((metaItem, index) => (
|
{discover.catalog.content.content.map((metaItem, index) => (
|
||||||
<MetaItem
|
<MetaItem
|
||||||
key={index}
|
key={index}
|
||||||
|
|
|
||||||
|
|
@ -87,44 +87,6 @@
|
||||||
fill: @color-secondaryvariant1-90;
|
fill: @color-secondaryvariant1-90;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.spacing {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-input {
|
|
||||||
flex: none;
|
|
||||||
height: 3.5rem;
|
|
||||||
margin-left: 1.5rem;
|
|
||||||
|
|
||||||
&.pagination-input-placeholder {
|
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
.pagination-prev-button-container, .pagination-next-button-container {
|
|
||||||
.pagination-button-icon {
|
|
||||||
fill: @color-surface-dark5-90;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-label {
|
|
||||||
color: @color-surface-dark5-90;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-prev-button-container, .pagination-next-button-container {
|
|
||||||
width: 3.5rem;
|
|
||||||
height: 3.5rem;
|
|
||||||
|
|
||||||
.pagination-button-icon {
|
|
||||||
width: 1rem;
|
|
||||||
height: 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-label {
|
|
||||||
width: 3rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.missing-addon-warning-container {
|
.missing-addon-warning-container {
|
||||||
|
|
@ -427,23 +389,16 @@
|
||||||
.discover-content {
|
.discover-content {
|
||||||
.catalog-container {
|
.catalog-container {
|
||||||
.selectable-inputs-container {
|
.selectable-inputs-container {
|
||||||
flex-direction: row-reverse;
|
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
||||||
.select-input {
|
.select-input {
|
||||||
display: none;
|
&:nth-child(n+3) {
|
||||||
}
|
display: none;
|
||||||
|
|
||||||
.filter-container {
|
&~.filter-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
.spacing {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-input {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,10 @@ const init = () => ({
|
||||||
types: [],
|
types: [],
|
||||||
catalogs: [],
|
catalogs: [],
|
||||||
extra: [],
|
extra: [],
|
||||||
prevPage: null,
|
nextPage: false
|
||||||
nextPage: null
|
|
||||||
},
|
},
|
||||||
catalog: null,
|
catalog: null,
|
||||||
defaultRequest: null,
|
defaultRequest: null,
|
||||||
page: 1,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const map = (discover) => ({
|
const map = (discover) => ({
|
||||||
|
|
@ -38,6 +36,14 @@ const map = (discover) => ({
|
||||||
|
|
||||||
const useDiscover = (urlParams, queryParams) => {
|
const useDiscover = (urlParams, queryParams) => {
|
||||||
const { core } = useServices();
|
const { core } = useServices();
|
||||||
|
const loadNextPage = React.useCallback(() => {
|
||||||
|
core.transport.dispatch({
|
||||||
|
action: 'CatalogWithFilters',
|
||||||
|
args: {
|
||||||
|
action: 'LoadNextPage'
|
||||||
|
}
|
||||||
|
}, 'discover');
|
||||||
|
}, []);
|
||||||
const action = React.useMemo(() => {
|
const action = React.useMemo(() => {
|
||||||
if (typeof urlParams.transportUrl === 'string' && typeof urlParams.type === 'string' && typeof urlParams.catalogId === 'string') {
|
if (typeof urlParams.transportUrl === 'string' && typeof urlParams.type === 'string' && typeof urlParams.catalogId === 'string') {
|
||||||
const { hostname } = UrlUtils.parse(urlParams.transportUrl);
|
const { hostname } = UrlUtils.parse(urlParams.transportUrl);
|
||||||
|
|
@ -79,7 +85,8 @@ const useDiscover = (urlParams, queryParams) => {
|
||||||
action: 'Unload'
|
action: 'Unload'
|
||||||
};
|
};
|
||||||
}, [urlParams, queryParams]);
|
}, [urlParams, queryParams]);
|
||||||
return useModelState({ model: 'discover', action, map, init });
|
const discover = useModelState({ model: 'discover', action, map, init });
|
||||||
|
return [discover, loadNextPage];
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = useDiscover;
|
module.exports = useDiscover;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue