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