const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const UrlUtils = require('url'); const Icon = require('stremio-icons/dom'); const Image = require('stremio/common/Image'); const ModalDialog = require('stremio/common/ModalDialog'); const SharePrompt = require('stremio/common/SharePrompt'); const routesRegexp = require('stremio/common/routesRegexp'); const useBinaryState = require('stremio/common/useBinaryState'); const ActionButton = require('./ActionButton'); const MetaLinks = require('./MetaLinks'); const MetaPreviewPlaceholder = require('./MetaPreviewPlaceholder'); const styles = require('./styles'); const IMDB_LINK_CATEGORY = 'imdb'; const SHARE_LINK_CATEGORY = 'share'; const ALLOWED_LINK_REDIRECTS = [ routesRegexp.search.regexp, routesRegexp.discover.regexp, routesRegexp.metadetails.regexp ]; const MetaPreview = ({ className, compact, name, logo, background, runtime, releaseInfo, released, description, links, trailer, inLibrary, toggleInLibrary }) => { const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false); const linksGroups = React.useMemo(() => { return Array.isArray(links) ? links .filter((link) => { return link && typeof link.category === 'string' && typeof link.url === 'string'; }) .reduce((linksGroups, { category, name, url }) => { if (category === IMDB_LINK_CATEGORY) { linksGroups[category] = { label: name, href: `https://www.stremio.com/warning#${encodeURIComponent(`https://www.imdb.com/title/${url}`)}` }; } else if (category === SHARE_LINK_CATEGORY) { linksGroups[category] = { label: name, href: url }; } else { const { protocol, host, path, pathname } = UrlUtils.parse(url); if (protocol === 'stremio:') { if (ALLOWED_LINK_REDIRECTS.some((regexp) => pathname.match(regexp))) { linksGroups[category] = linksGroups[category] || []; linksGroups[category].push({ label: name, href: `#${path}` }); } } else { if (typeof host === 'string' && host.length > 0) { linksGroups[category] = linksGroups[category] || []; linksGroups[category].push({ label: name, href: `https://www.stremio.com/warning#${encodeURIComponent(url)}` }); } } } return linksGroups; }, {}) : []; }, [links]); return (
{ typeof background === 'string' && background.length > 0 ?
{'
: null }
{ typeof logo === 'string' && logo.length > 0 ? {' ( )} /> : null } { (typeof releaseInfo === 'string' && releaseInfo.length > 0) || (released instanceof Date && !isNaN(released.getTime())) || (typeof runtime === 'string' && runtime.length > 0) ?
{ typeof releaseInfo === 'string' && releaseInfo.length > 0 ?
{releaseInfo}
: released instanceof Date && !isNaN(released.getTime()) ?
{released.getFullYear()}
: null } { typeof runtime === 'string' && runtime.length > 0 ?
{runtime}
: null }
: null } { typeof name === 'string' && name.length > 0 ?
{name}
: null } { typeof description === 'string' && description.length > 0 ?
{description}
: null } { Object.keys(linksGroups) .filter((category) => { return category !== IMDB_LINK_CATEGORY && category !== SHARE_LINK_CATEGORY; }) .map((category, index) => ( )) }
{ typeof toggleInLibrary === 'function' ? : null } { typeof trailer === 'object' && trailer !== null ? : null } { typeof linksGroups[IMDB_LINK_CATEGORY] === 'object' ? : null } { !compact && typeof linksGroups[SHARE_LINK_CATEGORY] === 'object' ? { shareModalOpen ? : null } : null }
); }; MetaPreview.Placeholder = MetaPreviewPlaceholder; MetaPreview.propTypes = { className: PropTypes.string, compact: PropTypes.bool, name: PropTypes.string, logo: PropTypes.string, background: PropTypes.string, runtime: PropTypes.string, releaseInfo: PropTypes.string, released: PropTypes.instanceOf(Date), description: PropTypes.string, links: PropTypes.arrayOf(PropTypes.shape({ category: PropTypes.string, name: PropTypes.string, url: PropTypes.string })), trailer: PropTypes.object, inLibrary: PropTypes.bool, toggleInLibrary: PropTypes.func }; module.exports = MetaPreview;