summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/nav/nav.parent.js
blob: a4c2aeecdf1d8e589b43558257b267db7d41d865 (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
116
117
118
119
120
121
122
123
124
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.handleNavBarClick = this.handleNavBarClick.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, })
    clearTimeout(this.timeout)
    this.timeout = setTimeout(() => {
      this.setState({ suppressHover: false })
    }, 50)
  }
  handleNavBarClick(e) {
    e && e.stopPropagation()
    actions.viewer.toggleComponent('nav')
  }
  goToNextSection(e) {
    e && e.preventDefault()
    e && e.stopPropagation()
    const { viewer } = this.props
    if (viewer.nextSection) {
      actions.viewer.seekToSection(viewer.nextSection)
    } else {
      actions.viewer.seekToBeginning()
    }
  }
  render() {
    const { viewer, play_ts, started, playing } = 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 && !playing)) && !viewer.nav && viewer.nextSection) containerClassName += ' hovering-next'
    return (
      <div className={containerClassName} onMouseLeave={this.handleMouseLeave}>
        <div className={navClassName} onClick={this.handleNavBarClick}>
          <div className='nav-section-name' onMouseEnter={this.handleMouseEnter}>
            <span className="section-link link">
              <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'
            onMouseEnter={this.handleMouseEnterNext}
            onClick={this.goToNextSection}
          >
            <span
              className="next-link link"
            >
              {viewer.nextSection
                ? "Next"
                : <span className="replay-link">{'Replay Episode 1. Animist Origins & Export Projections'}</span>
              }
              <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,
  playing: state.audio.playing,
  play_ts: state.audio.play_ts,
})

export default connect(mapStateToProps)(NavParent)