summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/nav/nav.parent.js
blob: c27947b0b6843dbcba90f553d07e10fae73f3379 (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
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 } 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)
  }
  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)
  }
  render() {
    const { viewer } = this.props
    let containerClassName = "viewer-nav " + viewer.navStyle
    let navClassName = 'nav-row main-nav'
    if (this.state.hoveringNav) navClassName += ' hovering-nav'
    if (this.state.hoveringNext) 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 && 
                <span>
                  {ROMAN_NUMERALS[viewer.currentSection.index]}
                  {'. '}
                  {viewer.currentSection.title}
                </span>
              }
            </span>
          </div>
          <div onMouseEnter={this.handleMouseEnter}>
            <NavPlayer />
          </div>
          <div className='nav-next'>
            {viewer.nextSection &&
              <span
                className="next-link link"
                onMouseEnter={this.handleMouseEnterNext}
                onClick={() => actions.viewer.seekToSection(viewer.nextSection)}
              >
                Next
                <Arrow type={'right'} />
              </span>
            }
          </div>
        </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,
})

export default connect(mapStateToProps)(NavParent)