// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const { useTranslation } = require('react-i18next'); const { useNavigate } = require('react-router'); const { default: toPath } = require('stremio/common/toPath'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const { default: useRouteFocused } = require('stremio/common/useRouteFocused'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { Button, Image, Popup } = require('stremio/components'); const useBinaryState = require('stremio/common/useBinaryState'); const useProfile = require('stremio/common/useProfile'); const { usePlatform } = require('stremio/common/Platform'); const VideoPlaceholder = require('./VideoPlaceholder'); const styles = require('./styles'); const Video = ({ className, id, title, thumbnail, season, episode, released, upcoming, watched, progress, scheduled, seasonWatched, selected, deepLinks, onMarkVideoAsWatched, onMarkSeasonAsWatched, ...props }) => { const routeFocused = useRouteFocused(); const profile = useProfile(); const navigate = useNavigate(); const platform = usePlatform(); const { t } = useTranslation(); const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false); const popupLabelOnMouseUp = React.useCallback((event) => { if (!event.nativeEvent.togglePopupPrevented) { if (event.nativeEvent.ctrlKey || event.nativeEvent.button === 2) { event.preventDefault(); toggleMenu(); } } }, []); const popupLabelOnContextMenu = React.useCallback((event) => { if (!event.nativeEvent.togglePopupPrevented && !event.nativeEvent.ctrlKey) { event.preventDefault(); } }, [toggleMenu]); const popupLabelOnLongPress = React.useCallback((event) => { if (event.nativeEvent.pointerType !== 'mouse' && !event.nativeEvent.togglePopupPrevented) { toggleMenu(); } }, [toggleMenu]); const popupMenuOnPointerDown = React.useCallback((event) => { event.nativeEvent.togglePopupPrevented = true; }, []); const popupMenuOnContextMenu = React.useCallback((event) => { event.nativeEvent.togglePopupPrevented = true; }, []); const popupMenuOnClick = React.useCallback((event) => { event.nativeEvent.togglePopupPrevented = true; }, []); const popupMenuOnKeyDown = React.useCallback((event) => { event.nativeEvent.buttonClickPrevented = true; }, []); const toggleWatchedOnClick = React.useCallback((event) => { event.preventDefault(); event.stopPropagation(); closeMenu(); onMarkVideoAsWatched({ id, released }, watched); }, [id, released, watched]); const toggleWatchedSeasonOnClick = React.useCallback((event) => { event.preventDefault(); event.stopPropagation(); closeMenu(); onMarkSeasonAsWatched(season, seasonWatched); }, [season, seasonWatched, onMarkSeasonAsWatched]); const videoButtonOnClick = React.useCallback(() => { if (deepLinks) { if (typeof deepLinks.player === 'string') { navigate(toPath(deepLinks.player)); } else if (typeof deepLinks.metaDetailsStreams === 'string') { navigate(toPath(deepLinks.metaDetailsStreams), { replace: !platform.isMobile }); } } }, [deepLinks]); const renderLabel = React.useMemo(() => function renderLabel({ className, id, title, thumbnail, episode, released, upcoming, watched, progress, scheduled, children, ref, ...props }) { const blurThumbnail = profile.settings.hideSpoilers && season && episode && !watched; React.useEffect(() => { if (selected && ref.current) { if ((progress && watched) || !watched) { ref.current.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' }); } } }, [selected]); return ( ); }, [selected]); const renderMenu = React.useMemo(() => function renderMenu() { return (
); }, [watched, seasonWatched, toggleWatchedOnClick]); React.useEffect(() => { if (!routeFocused) { closeMenu(); } }, [routeFocused]); return ( ); }; Video.Placeholder = VideoPlaceholder; Video.propTypes = { className: PropTypes.string, id: PropTypes.string, title: PropTypes.string, thumbnail: PropTypes.string, season: PropTypes.number, episode: PropTypes.number, released: PropTypes.instanceOf(Date), upcoming: PropTypes.bool, watched: PropTypes.bool, progress: PropTypes.number, scheduled: PropTypes.bool, seasonWatched: PropTypes.bool, selected: PropTypes.bool, deepLinks: PropTypes.shape({ metaDetailsStreams: PropTypes.string, player: PropTypes.string }), onMarkVideoAsWatched: PropTypes.func, onMarkSeasonAsWatched: PropTypes.func, }; module.exports = Video;