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)
|