import { connect } from 'react-redux'; import { makeSelectClaimForUri, makeSelectFileInfoForUri, makeSelectThumbnailForUri, SETTINGS, COLLECTIONS_CONSTS, makeSelectNextUrlForCollectionAndUrl, makeSelectPreviousUrlForCollectionAndUrl, } from 'lbry-redux'; import { doChangeVolume, doChangeMute, doAnalyticsView, doAnalyticsBuffer } from 'redux/actions/app'; import { selectVolume, selectMute } from 'redux/selectors/app'; import { savePosition, clearPosition, doSetPlayingUri, doPlayUri } from 'redux/actions/content'; import { makeSelectContentPositionForUri, selectPlayingUri, makeSelectIsPlayerFloating, } from 'redux/selectors/content'; import VideoViewer from './view'; import { withRouter } from 'react-router'; import { doClaimEligiblePurchaseRewards } from 'redux/actions/rewards'; import { selectDaemonSettings, makeSelectClientSetting, selectHomepageData } from 'redux/selectors/settings'; import { toggleVideoTheaterMode, doSetClientSetting } from 'redux/actions/settings'; import { selectUserVerifiedEmail, selectUser } from 'redux/selectors/user'; const select = (state, props) => { const { search } = props.location; const urlParams = new URLSearchParams(search); const autoplay = urlParams.get('autoplay'); // TODO: eventually this should be received from DB and not local state (https://github.com/lbryio/lbry-desktop/issues/6796) const position = urlParams.get('t') !== null ? urlParams.get('t') : makeSelectContentPositionForUri(props.uri)(state); const userId = selectUser(state) && selectUser(state).id; const playingUri = selectPlayingUri(state); const collectionId = urlParams.get(COLLECTIONS_CONSTS.COLLECTION_ID) || (playingUri && playingUri.collectionId); let playNextUri; let playPreviousUri; if (collectionId) { playNextUri = makeSelectNextUrlForCollectionAndUrl(collectionId, props.uri)(state); playPreviousUri = makeSelectPreviousUrlForCollectionAndUrl(collectionId, props.uri)(state); } return { autoplayIfEmbedded: Boolean(autoplay), autoplaySetting: Boolean(makeSelectClientSetting(SETTINGS.AUTOPLAY)(state)), volume: selectVolume(state), muted: selectMute(state), videoPlaybackRate: makeSelectClientSetting(SETTINGS.VIDEO_PLAYBACK_RATE)(state), position: position, hasFileInfo: Boolean(makeSelectFileInfoForUri(props.uri)(state)), thumbnail: makeSelectThumbnailForUri(props.uri)(state), claim: makeSelectClaimForUri(props.uri)(state), homepageData: selectHomepageData(state), authenticated: selectUserVerifiedEmail(state), userId: userId, shareTelemetry: IS_WEB || selectDaemonSettings(state).share_usage_data, videoTheaterMode: makeSelectClientSetting(SETTINGS.VIDEO_THEATER_MODE)(state), isFloating: makeSelectIsPlayerFloating(props.location)(state), collectionId, playNextUri, playPreviousUri, }; }; const perform = (dispatch) => ({ changeVolume: (volume) => dispatch(doChangeVolume(volume)), savePosition: (uri, position) => dispatch(savePosition(uri, position)), clearPosition: (uri) => dispatch(clearPosition(uri)), changeMute: (muted) => dispatch(doChangeMute(muted)), doAnalyticsView: (uri, timeToStart) => dispatch(doAnalyticsView(uri, timeToStart)), doAnalyticsBuffer: (uri, bufferData) => dispatch(doAnalyticsBuffer(uri, bufferData)), claimRewards: () => dispatch(doClaimEligiblePurchaseRewards()), toggleVideoTheaterMode: () => dispatch(toggleVideoTheaterMode()), setVideoPlaybackRate: (rate) => dispatch(doSetClientSetting(SETTINGS.VIDEO_PLAYBACK_RATE, rate)), doSetPlayingUri: (uri, collectionId) => dispatch(doSetPlayingUri({ uri, collectionId })), doPlayUri: (uri) => dispatch(doPlayUri(uri)), }); export default withRouter(connect(select, perform)(VideoViewer));