summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/nav/nav.parent.js
blob: 80340c80f3e2d2e1f8abb93c63cdd8b286e1dfad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import React, { Component } from 'react'
import { connect } from 'react-redux'

import actions from 'app/actions'
import { ROMAN_NUMERALS } from 'app/constants'
import { Arrow } from './viewer.icons'
import NavPlayer from './nav.player'
import { thumbnailURL, sectionProgressPercentage } from 'app/utils/annotation.utils'

class NavParent extends Component {
  state = {
    hoveringNext: false,
    hoveringNav: false,
    suppressHover: false,
  }
  constructor(props){
    super(props)
    this.handleMouseEnter = this.handleMouseEnter.bind(this)
    this.handleMouseLeave = this.handleMouseLeave.bind(this)
    this.handleMouseEnterNext = this.handleMouseEnterNext.bind(this)
    this.handleMouseLeaveNext = this.handleMouseLeaveNext.bind(this)
    this.goToNextSection = this.goToNextSection.bind(this)
  }
  handleMouseEnter(){
    if (this.state.suppressHover) return
    this.setState({ hoveringNext: false, hoveringNav: true })
  }
  handleMouseEnterNext(){
    if (this.state.suppressHover) return
    this.setState({ hoveringNext: true, hoveringNav: false })
  }
  handleMouseLeave(){
    this.setState({ hoveringNext: false, hoveringNav: false, suppressHover: false })
  }
  handleMouseLeaveNext(){
    this.setState({ hoveringNext: false, suppressHover: true, })
    setTimeout(() => {
      this.setState({ suppressHover: false })
    }, 50)
  }
  goToNextSection() {
    const { viewer } = this.props
    if (viewer.nextSection) {
      actions.viewer.seekToSection(viewer.nextSection)
    } else if (viewer.credits) {
      actions.viewer.seekToBeginning()
    } else {
      actions.viewer.showCredits()
    }
  }
  render() {
    const { viewer, play_ts, started } = this.props
    let containerClassName = "viewer-nav " + viewer.navStyle
    let navClassName = 'nav-row main-nav'
    if (this.state.hoveringNav || !started) containerClassName += ' hovering-nav'
    if ((this.state.hoveringNext || viewer.atEndOfSection) && !viewer.nav && !viewer.credits && viewer.nextSection) containerClassName += ' hovering-next'
    return (
      <div className={containerClassName} onMouseLeave={this.handleMouseLeave}>
        <div className={navClassName}>
          <div className='nav-section-name' onMouseEnter={this.handleMouseEnter}>
            <span className="section-link link" onClick={() => actions.viewer.toggleComponent('nav')}>
              <Arrow type={viewer.nav ? 'down' : 'up'} />
              {viewer.currentSection && (
                viewer.mediaTitle
                ? <span>{viewer.mediaTitle}</span>
                : <span>
                    {ROMAN_NUMERALS[viewer.currentSection.index]}
                    {'. '}
                    {viewer.currentSection.title}
                  </span>
              )}
            </span>
          </div>
          <div onMouseEnter={this.handleMouseEnter}>
            <NavPlayer />
          </div>
          <div className='nav-next'>
            <span
              className="next-link link"
              onMouseEnter={this.handleMouseEnterNext}
              onClick={this.goToNextSection}
            >
              {viewer.credits
                ? <span className="replay-link">{'Replay Episode 1. Animist Origins & Export Projections'}</span>
                : "Next"
              }
              <Arrow type={'right'} />
            </span>
          </div>
          <div className="nav-progress-percentage" style={{
            width: viewer.currentSection ? sectionProgressPercentage(viewer.currentSection, play_ts) : 0
          }} />
        </div>
        {viewer.nextSection &&
          <div className="next-section-thumbnail"
            onClick={() => {
              actions.viewer.seekToSection(viewer.nextSection)
              this.setState({ hoveringNext: false, hoveringNav: false, suppressHover: true })
            }}
            style={{
            backgroundImage: viewer.nextSection.media.length && 'url(' + thumbnailURL(viewer.nextSection.media[0].media) + ')',
          }}/>
        }
      </div>
    )
  }
}

const mapStateToProps = state => ({
  viewer: state.viewer,
  started: state.audio.started,
  play_ts: state.audio.play_ts,
})

export default connect(mapStateToProps)(NavParent)