// @flow import * as PAGES from 'constants/pages'; import { VIDEO_ALMOST_FINISHED_THRESHOLD } from 'constants/player'; import * as React from 'react'; import classnames from 'classnames'; import { lazyImport } from 'util/lazyImport'; import Page from 'component/page'; import * as RENDER_MODES from 'constants/file_render_modes'; import FileTitleSection from 'component/fileTitleSection'; import FileRenderInitiator from 'component/fileRenderInitiator'; import FileRenderInline from 'component/fileRenderInline'; import FileRenderDownload from 'component/fileRenderDownload'; import RecommendedContent from 'component/recommendedContent'; import CollectionContent from 'component/collectionContentSidebar'; import Button from 'component/button'; import I18nMessage from 'component/i18nMessage'; import Empty from 'component/common/empty'; const CommentsList = lazyImport(() => import('component/commentsList' /* webpackChunkName: "comments" */)); const PostViewer = lazyImport(() => import('component/postViewer' /* webpackChunkName: "postViewer" */)); export const PRIMARY_PLAYER_WRAPPER_CLASS = 'file-page__video-container'; type Props = { costInfo: ?{ includesData: boolean, cost: number }, fileInfo: FileListItem, uri: string, renderMode: string, obscureNsfw: boolean, isMature: boolean, linkedCommentId?: string, hasCollectionById?: boolean, collectionId: string, videoTheaterMode: boolean, claimIsMine: boolean, commentsDisabled: boolean, isLivestream: boolean, position: number, doFetchCostInfoForUri: (uri: string) => void, doSetContentHistoryItem: (uri: string) => void, doSetPrimaryUri: (uri: ?string) => void, clearPosition: (uri: string) => void, }; export default function FilePage(props: Props) { const { uri, renderMode, fileInfo, obscureNsfw, isMature, costInfo, linkedCommentId, videoTheaterMode, claimIsMine, commentsDisabled, hasCollectionById, collectionId, isLivestream, position, doFetchCostInfoForUri, doSetContentHistoryItem, doSetPrimaryUri, clearPosition, } = props; const cost = costInfo ? costInfo.cost : null; const hasFileInfo = fileInfo !== undefined; const isMarkdown = renderMode === RENDER_MODES.MARKDOWN; const videoPlayedEnoughToResetPosition = React.useMemo(() => { const durationInSecs = fileInfo && fileInfo.metadata && fileInfo.metadata.video ? fileInfo.metadata.video.duration : 0; const isVideoTooShort = durationInSecs <= 45; const almostFinishedPlaying = position / durationInSecs >= VIDEO_ALMOST_FINISHED_THRESHOLD; return durationInSecs ? isVideoTooShort || almostFinishedPlaying : false; }, [fileInfo, position]); React.useEffect(() => { // always refresh file info when entering file page to see if we have the file // this could probably be refactored into more direct components now if (collectionId) { clearPosition(uri); } if (fileInfo && videoPlayedEnoughToResetPosition) { clearPosition(uri); } // See https://github.com/lbryio/lbry-desktop/pull/1563 for discussion doFetchCostInfoForUri(uri); doSetContentHistoryItem(uri); doSetPrimaryUri(uri); return () => doSetPrimaryUri(null); }, [ uri, hasFileInfo, fileInfo, videoPlayedEnoughToResetPosition, collectionId, clearPosition, doFetchCostInfoForUri, doSetContentHistoryItem, doSetPrimaryUri, ]); function renderFilePageLayout() { if (RENDER_MODES.FLOATING_MODES.includes(renderMode)) { return (