const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const { useRouteFocused } = require('stremio-router'); const Icon = require('stremio-icons/dom'); const { AddonDetailsModal, Button, Image, Multiselect, MainNavBars, TextInput, SharePrompt, ModalDialog, useBinaryState } = require('stremio/common'); const Addon = require('./Addon'); const useAddons = require('./useAddons'); const useSelectableInputs = require('./useSelectableInputs'); const styles = require('./styles'); const Addons = ({ urlParams, queryParams }) => { const routeFocused = useRouteFocused(); const navigate = React.useCallback((args) => { if (!routeFocused) { return; } const nextPath = args.hasOwnProperty('request') ? `/${encodeURIComponent(args.request.base)}/${encodeURIComponent(args.request.path.id)}/${encodeURIComponent(args.request.path.type_name)}` : typeof urlParams.transportUrl === 'string' && typeof urlParams.catalogId === 'string' && typeof urlParams.type === 'string' ? `/${encodeURIComponent(urlParams.transportUrl)}/${encodeURIComponent(urlParams.catalogId)}/${encodeURIComponent(urlParams.type)}` : ''; const nextQueryParams = new URLSearchParams(queryParams); if (args.hasOwnProperty('detailsTransportUrl')) { if (args.detailsTransportUrl === null) { nextQueryParams.delete('addon'); } else { nextQueryParams.set('addon', args.detailsTransportUrl); } } window.location.replace(`#/addons${nextPath}?${nextQueryParams}`); }, [routeFocused, urlParams, queryParams]); const addons = useAddons(urlParams); const detailsTransportUrl = queryParams.get('addon'); const selectInputs = useSelectableInputs(addons, navigate); const [addAddonModalOpen, openAddAddonModal, closeAddAddonModal] = useBinaryState(false); const addAddonUrlInputRef = React.useRef(null); const addAddonOnSubmit = React.useCallback(() => { if (addAddonUrlInputRef.current !== null) { navigate({ detailsTransportUrl: addAddonUrlInputRef.current.value }); } }, [navigate]); const addAddonModalButtons = React.useMemo(() => { return [ { className: styles['cancel-button'], label: 'Cancel', props: { onClick: closeAddAddonModal } }, { label: 'Add', props: { onClick: addAddonOnSubmit } } ]; }, [addAddonOnSubmit]); const [search, setSearch] = React.useState(''); const searchInputOnChange = React.useCallback((event) => { setSearch(event.currentTarget.value); }, []); const [sharedAddon, setSharedAddon] = React.useState(null); const renderLogoFallback = React.useMemo(() => () => { return ( ); }, []); const clearSharedAddon = React.useCallback(() => { setSharedAddon(null); }, []); const onAddonShare = React.useCallback((event) => { setSharedAddon(event.dataset.addon); }, []); const onAddonToggle = React.useCallback((event) => { navigate({ detailsTransportUrl: event.dataset.addon.transportUrl }); }, [navigate]); const closeAddonDetails = React.useCallback(() => { navigate({ detailsTransportUrl: null }); }, [navigate]); React.useLayoutEffect(() => { closeAddAddonModal(); setSearch(''); clearSharedAddon(); }, [urlParams, queryParams]); return (
{selectInputs.map((selectInput, index) => ( ))}
{ addons.selectable.catalogs.length === 0 && addons.catalog_resource === null ?
No addons
: addons.catalog_resource === null ?
No select
: addons.catalog_resource.content.type === 'Err' ?
Addons could not be loaded
: addons.catalog_resource.content.type === 'Loading' ?
Loading
:
{ addons.catalog_resource.content.content .filter((addon) => { return search.length === 0 || ( (typeof addon.manifest.name === 'string' && addon.manifest.name.toLowerCase().includes(search.toLowerCase())) || (typeof addon.manifest.description === 'string' && addon.manifest.description.toLowerCase().includes(search.toLowerCase())) ); }) .map((addon, index) => ( )) }
}
{ addAddonModalOpen ?
You can add an addon via an external link, which will appear under Installed addons.
: null } { sharedAddon !== null ?
{'
{typeof sharedAddon.manifest.name === 'string' && sharedAddon.manifest.name.length > 0 ? sharedAddon.manifest.name : sharedAddon.manifest.id} { typeof sharedAddon.manifest.version === 'string' && sharedAddon.manifest.version.length > 0 ? v. {sharedAddon.manifest.version} : null }
: null } { typeof detailsTransportUrl === 'string' ? : null } ); }; Addons.propTypes = { urlParams: PropTypes.exact({ transportUrl: PropTypes.string, catalogId: PropTypes.string, type: PropTypes.string }), queryParams: PropTypes.instanceOf(URLSearchParams) }; module.exports = Addons;