codevise/pageflow

View on GitHub
entry_types/paged/packages/pageflow-paged-react/src/media/components/Page.jsx

Summary

Maintainability
A
1 hr
Test Coverage
import {
  PageWrapper,
  PageBackground,
  PageShadow,
  PageForeground,
  PageScroller,
  PageHeader,
  PageText
} from 'components';

import PagePrintImage from './PagePrintImage';
import MediaPlayerControls from './PlayerControls';
import NonJsLinks from './NonJsLinks';
import playerStateClassNames from './playerStateClassNames';
import {combineSelectors} from 'utils';
import {prop, has} from 'utils/selectors';
import {textTracks, pageShouldAutoplay} from 'media/selectors';
import {pageScrollerMarginBottom} from '../pageScrollerMargin/selectors';
import {connectInPage} from 'pages';

import classNames from 'classnames';

export function MediaPage(props) {
  const page = props.page;
  const playerState = props.playerState;

  const infoBox = {
    title: page.additionalTitle,
    description: page.additionalDescription
  };

  return (
    <PageWrapper className={pageWraperClassName(props.className,
                                                willAutoplay(props),
                                                props.textTracks,
                                                playerState)}>
      <PageBackground pageHasPlayerControls={true}>
        {props.children}
        <PageShadow page={page} className={playerStateClassNames(playerState)} />
      </PageBackground>

      <PageForeground onInteraction={() => playerState.userIsIdle &&
                                         props.playerActions.userInteraction()}
                      classNames={playerStateClassNames(playerState)}>

        <MediaPlayerControls file={props.file}
                             textTracks={props.textTracks}
                             playerState={playerState}
                             playerActions={props.playerActions}
                             qualities={props.qualities}
                             controlBarText={props.controlBarText}
                             infoBox={infoBox}
                             playerControlsComponent={props.playerControlsComponent} />

        <PageScroller className={playerStateClassNames(playerState)}
                      marginBottom={props.dynamicPageScrollerMargin &&
                                    props.pageScrollerMarginBottom}>

          <PageHeader page={page} />
          <PagePrintImage page={page} />
          <PageText page={page}
                    marginBottom={props.dynamicPageScrollerMargin ? 'none' : 'for_player_controls'}>
            <NonJsLinks file={props.file} />
          </PageText>
        </PageScroller>
      </PageForeground>
    </PageWrapper>
  );
}

MediaPage.defaultProps = {
  playerControlsCanOverlapPageText: true
};

export default connectInPage(combineSelectors({
  pageScrollerMarginBottom,
  textTracks: textTracks({
    file: prop('file'),
    defaultTextTrackFileId: prop('page.defaultTextTrackFileId')
  }),
  hasAutoplaySupport: has('autoplay support'),
  shouldAutoplay: pageShouldAutoplay({
    id: prop('page.permaId'),
    autoplayWhenBackgroundMediaMuted: prop('autoplayWhenBackgroundMediaMuted')
  })
}))(MediaPage);

function willAutoplay(props) {
  return props.shouldAutoplay &&
         props.hasAutoplaySupport &&
         !props.playerState.playFailed;
}

function pageWraperClassName(className, autoplay, textTracks, playerState) {
  return classNames(className, {
    'has_text_tracks': !!textTracks.activeFileId,
    'is_idle': playerState.isPlaying && playerState.userIsIdle,
    'is_control_bar_focused': playerState.focusInsideControls,
    'is_control_bar_hovered': playerState.userHoveringControls,
    'is_control_bar_hidden': playerState.controlsHidden,
    'unplayed': playerState.unplayed && !autoplay,
    'should_play': playerState.shouldPlay,
    'has_played': playerState.hasPlayed
  });
}