// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const filterInvalidDOMProps = require('filter-invalid-dom-props').default; const { default: Icon } = require('@stremio/stremio-icons/react'); const { default: Button } = require('stremio/components/Button'); const { default: Image } = require('stremio/components/Image'); const Multiselect = require('stremio/components/Multiselect'); const useBinaryState = require('stremio/common/useBinaryState'); const { ICON_FOR_TYPE } = require('stremio/common/CONSTANTS'); const styles = require('./styles'); const useMetaDetailsForMetaItem = require('stremio/routes/Board/useMetaDetailsForMetaItem'); const useTranslate = require('stremio/common/useTranslate'); const MetaItem = React.memo(({ className, type, name, poster, posterShape, posterChangeCursor, progress, newVideos, options, deepLinks, dataset, optionOnSelect, onDismissClick, onPlayClick, watched, nextEpisodeReleaseDate, ...props }) => { const t = useTranslate(); const [menuOpen, onMenuOpen, onMenuClose] = useBinaryState(false); const [isHovered, setIsHovered] = React.useState(false); const [mousePos, setMousePos] = React.useState({ x: 0, y: 0 }); const hoverTimeoutRef = React.useRef(); const onMouseEnter = React.useCallback(() => { hoverTimeoutRef.current = setTimeout(() => setIsHovered(true), 150); }, []); const onMouseLeave = React.useCallback(() => { clearTimeout(hoverTimeoutRef.current); setIsHovered(false); }, []); const onMouseMove = React.useCallback((event) => { setMousePos({ x: event.clientX, y: event.clientY }); }, []); const upcomingDate = useMetaDetailsForMetaItem( { id: props.id || props._id || dataset?.id || dataset?._id, type }, isHovered && (type === 'series' || type === 'tv') && !nextEpisodeReleaseDate ); const displayDate = nextEpisodeReleaseDate || upcomingDate; const href = React.useMemo(() => { return deepLinks ? typeof deepLinks.metaDetailsStreams === 'string' ? deepLinks.metaDetailsStreams : typeof deepLinks.metaDetailsVideos === 'string' ? deepLinks.metaDetailsVideos : typeof deepLinks.player === 'string' ? deepLinks.player : null : null; }, [deepLinks]); const metaItemOnClick = React.useCallback((event) => { if (event.nativeEvent.selectPrevented) { event.preventDefault(); } else if (typeof props.onClick === 'function') { props.onClick(event); } }, [props.onClick]); const menuOnClick = React.useCallback((event) => { event.nativeEvent.selectPrevented = true; }, []); const menuOnSelect = React.useCallback((event) => { if (typeof optionOnSelect === 'function') { optionOnSelect({ type: 'select-option', value: event.value, dataset: dataset, reactEvent: event.reactEvent, nativeEvent: event.nativeEvent }); } }, [dataset, optionOnSelect]); const renderPosterFallback = React.useCallback(() => ( ), [type]); const renderMenuLabelContent = React.useCallback(() => ( ), []); const title = React.useMemo(() => { // Suppress native tooltip for series/tv immediately on hover // to prevent the browser's native box from appearing during the fetch delay. if (isHovered && (type === 'series' || type === 'tv')) { return null; } if (typeof nextEpisodeReleaseDate === 'string' && nextEpisodeReleaseDate.length > 0) { return `${name} (${nextEpisodeReleaseDate})`; } return name; }, [name, nextEpisodeReleaseDate, isHovered, type]); return ( ); }); MetaItem.displayName = 'MetaItem'; MetaItem.propTypes = { className: PropTypes.string, type: PropTypes.string, name: PropTypes.string, poster: PropTypes.string, posterShape: PropTypes.oneOf(['poster', 'landscape', 'square']), posterChangeCursor: PropTypes.bool, progress: PropTypes.number, newVideos: PropTypes.number, options: PropTypes.array, deepLinks: PropTypes.shape({ metaDetailsVideos: PropTypes.string, metaDetailsStreams: PropTypes.string, player: PropTypes.string }), dataset: PropTypes.object, optionOnSelect: PropTypes.func, onDismissClick: PropTypes.func, onPlayClick: PropTypes.func, onClick: PropTypes.func, watched: PropTypes.bool, nextEpisodeReleaseDate: PropTypes.string }; module.exports = MetaItem;