// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const { useTranslation } = require('react-i18next'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { usePlatform, useBinaryState, withCoreSuspender } = require('stremio/common'); const { AddonDetailsModal, Button, Image, MainNavBars, ModalDialog, SearchBar, SharePrompt, TextInput, MultiselectMenu } = require('stremio/components'); const { useServices } = require('stremio/services'); const Addon = require('./Addon'); const useInstalledAddons = require('./useInstalledAddons'); const useRemoteAddons = require('./useRemoteAddons'); const useAddonDetailsTransportUrl = require('./useAddonDetailsTransportUrl'); const useSelectableInputs = require('./useSelectableInputs'); const styles = require('./styles'); const { AddonPlaceholder } = require('./AddonPlaceholder'); const Addons = ({ urlParams, queryParams }) => { const { t } = useTranslation(); const platform = usePlatform(); const { core } = useServices(); const installedAddons = useInstalledAddons(urlParams); const remoteAddons = useRemoteAddons(urlParams); const [addonDetailsTransportUrl, setAddonDetailsTransportUrl] = useAddonDetailsTransportUrl(urlParams, queryParams); const selectInputs = useSelectableInputs(installedAddons, remoteAddons); const [filtersModalOpen, openFiltersModal, closeFiltersModal] = useBinaryState(false); const [addAddonModalOpen, openAddAddonModal, closeAddAddonModal] = useBinaryState(false); const addAddonUrlInputRef = React.useRef(null); const addAddonOnSubmit = React.useCallback(() => { if (addAddonUrlInputRef.current !== null) { setAddonDetailsTransportUrl(addAddonUrlInputRef.current.value); } }, [setAddonDetailsTransportUrl]); const addAddonModalButtons = React.useMemo(() => { return [ { className: styles['cancel-button'], label: t('BUTTON_CANCEL'), props: { onClick: closeAddAddonModal } }, { label: t('ADDON_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 clearSharedAddon = React.useCallback(() => { setSharedAddon(null); }, []); const onAddonShare = React.useCallback((event) => { setSharedAddon(event.dataset.addon); }, []); const onAddonInstall = React.useCallback((event) => { core.transport.dispatch({ action: 'Ctx', args: { action: 'InstallAddon', args: event.dataset.addon, } }); }, []); const onAddonUninstall = React.useCallback((event) => { core.transport.dispatch({ action: 'Ctx', args: { action: 'UninstallAddon', args: event.dataset.addon, } }); }, []); const onAddonConfigure = React.useCallback((event) => { platform.openExternal(event.dataset.addon.transportUrl.replace('manifest.json', 'configure')); }, []); const onAddonOpen = React.useCallback((event) => { setAddonDetailsTransportUrl(event.dataset.addon.transportUrl); }, [setAddonDetailsTransportUrl]); const closeAddonDetails = React.useCallback(() => { setAddonDetailsTransportUrl(null); }, [setAddonDetailsTransportUrl]); const searchFilterPredicate = React.useCallback((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())) ); }, [search]); const renderLogoFallback = React.useCallback(() => ( ), []); React.useLayoutEffect(() => { closeAddAddonModal(); setSearch(''); clearSharedAddon(); }, [urlParams, queryParams]); return (
{selectInputs.map((selectInput, index) => ( ))}
{ installedAddons.selected !== null ? installedAddons.selectable.types.length === 0 ?
No addons ware installed!
: installedAddons.catalog.length === 0 ?
No addons ware installed for that type!
:
{ installedAddons.catalog .filter(searchFilterPredicate) .map((addon, index) => ( )) }
: remoteAddons.selected !== null ? remoteAddons.catalog.content.type === 'Err' ?
{remoteAddons.catalog.content.content}
: remoteAddons.catalog.content.type === 'Loading' ?
{Array.from({ length: 6 }).map((_, index) => ( ))}
:
{ remoteAddons.catalog.content.content .filter(searchFilterPredicate) .map((addon, index) => ( )) }
:
{Array.from({ length: 6 }).map((_, index) => ( ))}
}
{ filtersModalOpen ? {selectInputs.map((selectInput, index) => ( ))} : null } { addAddonModalOpen ?
{t('ADD_ADDON_DESCRIPTION')}
: 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 addonDetailsTransportUrl === 'string' ? : null } ); }; Addons.propTypes = { urlParams: PropTypes.shape({ path: PropTypes.string, transportUrl: PropTypes.string, catalogId: PropTypes.string, type: PropTypes.string }), queryParams: PropTypes.instanceOf(URLSearchParams) }; const AddonsFallback = () => ( ); module.exports = withCoreSuspender(Addons, AddonsFallback);