// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const UrlUtils = require('url'); const { useTranslation } = require('react-i18next'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { default: Button } = require('stremio/components/Button'); const { default: Image } = require('stremio/components/Image'); const ModalDialog = require('stremio/components/ModalDialog'); const SharePrompt = require('stremio/components/SharePrompt'); const CONSTANTS = require('stremio/common/CONSTANTS'); 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 { Ratings } = require('./Ratings'); const ALLOWED_LINK_REDIRECTS = [ routesRegexp.search.regexp, routesRegexp.discover.regexp, routesRegexp.metadetails.regexp ]; const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary, ratingInfo }, ref) => { const { t } = useTranslation(); const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false); const linksGroups = React.useMemo(() => { return Array.isArray(links) ? links .filter((link) => link && typeof link.category === 'string' && typeof link.url === 'string') .reduce((linksGroups, { category, name, url }) => { const { protocol, path, pathname, hostname } = UrlUtils.parse(url); if (category === CONSTANTS.IMDB_LINK_CATEGORY) { if (hostname === 'imdb.com') { linksGroups.set(category, { label: name, href: `https://www.stremio.com/warning#${encodeURIComponent(url)}` }); } } else if (category === CONSTANTS.SHARE_LINK_CATEGORY) { linksGroups.set(category, { label: name, href: url }); } else { if (protocol === 'stremio:') { if (pathname !== null && ALLOWED_LINK_REDIRECTS.some((regexp) => pathname.match(regexp))) { if (!linksGroups.has(category)) { linksGroups.set(category, []); } linksGroups.get(category).push({ label: name, href: `#${path}` }); } } else if (typeof hostname === 'string' && hostname.length > 0) { if (!linksGroups.has(category)) { linksGroups.set(category, []); } linksGroups.get(category).push({ label: name, href: `https://www.stremio.com/warning#${encodeURIComponent(url)}` }); } } return linksGroups; }, new Map()) : new Map(); }, [links]); const showHref = React.useMemo(() => { return deepLinks ? typeof deepLinks.player === 'string' ? deepLinks.player : typeof deepLinks.metaDetailsStreams === 'string' ? deepLinks.metaDetailsStreams : typeof deepLinks.metaDetailsVideos === 'string' ? deepLinks.metaDetailsVideos : null : null; }, [deepLinks]); const trailerHref = React.useMemo(() => { if (!Array.isArray(trailerStreams) || trailerStreams.length === 0) { return null; } return trailerStreams[0].deepLinks.player; }, [trailerStreams]); const renderLogoFallback = React.useCallback(() => (
{name}
), [name]); return (
{ typeof background === 'string' && background.length > 0 ?
{'
: null }
{ typeof logo === 'string' && logo.length > 0 ? {' : renderLogoFallback() } { (typeof releaseInfo === 'string' && releaseInfo.length > 0) || (released instanceof Date && !isNaN(released.getTime())) || (typeof runtime === 'string' && runtime.length > 0) || linksGroups.has(CONSTANTS.IMDB_LINK_CATEGORY) ?
{ typeof runtime === 'string' && runtime.length > 0 ?
{runtime}
: null } { typeof releaseInfo === 'string' && releaseInfo.length > 0 ?
{releaseInfo}
: released instanceof Date && !isNaN(released.getTime()) ?
{released.getFullYear()}
: null } { linksGroups.has(CONSTANTS.IMDB_LINK_CATEGORY) ? : null }
: null } { compact && typeof description === 'string' && description.length > 0 ?
{description}
: null } { Array.from(linksGroups.keys()) .filter((category) => { return category !== CONSTANTS.IMDB_LINK_CATEGORY && category !== CONSTANTS.SHARE_LINK_CATEGORY && category !== CONSTANTS.WRITERS_LINK_CATEGORY; }) .map((category, index) => ( )) } { !compact && typeof description === 'string' && description.length > 0 ?
{t('SUMMARY')}
{description}
: null }
{ typeof toggleInLibrary === 'function' ? : null } { typeof trailerHref === 'string' ? : null } { typeof showHref === 'string' && compact ? : null } { !compact && ratingInfo !== null ? : null } { linksGroups.has(CONSTANTS.SHARE_LINK_CATEGORY) && !compact ? { 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, deepLinks: PropTypes.shape({ metaDetailsVideos: PropTypes.string, metaDetailsStreams: PropTypes.string, player: PropTypes.string }), links: PropTypes.arrayOf(PropTypes.shape({ category: PropTypes.string, name: PropTypes.string, url: PropTypes.string })), trailerStreams: PropTypes.array, inLibrary: PropTypes.bool, toggleInLibrary: PropTypes.func, ratingInfo: PropTypes.object, }; module.exports = MetaPreview;