From 704af55ccbbe3d8b9f0c3b627618bde09b1e375b Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 26 Oct 2022 01:14:10 +0200 Subject: [PATCH 1/3] feat(StreamsList): add multiselect to filter streams by addons --- .../MetaDetails/StreamsList/StreamsList.js | 72 ++++++++++++++----- .../MetaDetails/StreamsList/styles.less | 30 ++++++++ 2 files changed, 86 insertions(+), 16 deletions(-) diff --git a/src/routes/MetaDetails/StreamsList/StreamsList.js b/src/routes/MetaDetails/StreamsList/StreamsList.js index e62c26633..eed53ec22 100644 --- a/src/routes/MetaDetails/StreamsList/StreamsList.js +++ b/src/routes/MetaDetails/StreamsList/StreamsList.js @@ -4,13 +4,19 @@ const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('@stremio/stremio-icons/dom'); -const { Button, Image } = require('stremio/common'); +const { Button, Image, Multiselect } = require('stremio/common'); const { useServices } = require('stremio/services'); const Stream = require('./Stream'); const styles = require('./styles'); +const ALL_ADDONS_KEY = 'ALL'; + const StreamsList = ({ className, ...props }) => { const { core } = useServices(); + const [selectedAddon, setSelectedAddon] = React.useState(ALL_ADDONS_KEY); + const onAddonSelected = React.useCallback((event) => { + setSelectedAddon(event.value); + }, []); const streams = React.useMemo(() => { return props.streams .filter((streams) => streams.content.type === 'Ready') @@ -25,11 +31,39 @@ const StreamsList = ({ className, ...props }) => { } }); }, + transportUrl: streams.addon.transportUrl, addonName: streams.addon.manifest.name })); }) .flat(1); }, [props.streams]); + const filteredStreams = React.useMemo(() => { + return selectedAddon === ALL_ADDONS_KEY ? + streams + : + streams.filter((stream) => stream.transportUrl === selectedAddon); + }, [streams, selectedAddon]); + const selectableOptions = React.useMemo(() => { + const transportUrls = [...new Set(streams.map(({ transportUrl }) => transportUrl))]; + const sortedStreams = transportUrls.map((transportUrl) => streams.filter((stream) => stream.transportUrl === transportUrl)); + return { + title: 'Select Addon', + options: [ + { + value: ALL_ADDONS_KEY, + label: 'All', + title: 'All' + }, + ...sortedStreams.map((streams) => ({ + value: streams[0].transportUrl, + label: streams[0].addonName, + title: streams[0].addonName + })) + ], + selected: [selectedAddon], + onSelect: onAddonSelected + }; + }, [streams, selectedAddon]); return (
{ @@ -45,26 +79,32 @@ const StreamsList = ({ className, ...props }) => {
No streams were found!
: - streams.length === 0 ? + filteredStreams.length === 0 ?
: -
- {streams.map((stream, index) => ( - - ))} -
+ + +
+ {filteredStreams.map((stream, index) => ( + + ))} +
+
}