The only thing we have to change is to self-close tags that don't contain anything. This wasn't even an explicit change in standard. It was already a rule, but I think it wasn't getting enforced very well until a bugfix.
98 lines
2.9 KiB
JavaScript
98 lines
2.9 KiB
JavaScript
const React = require('react')
|
|
|
|
const Header = require('./header')
|
|
|
|
const Views = {
|
|
'home': require('./torrent-list'),
|
|
'player': require('./player'),
|
|
'create-torrent': require('./create-torrent'),
|
|
'preferences': require('./preferences')
|
|
}
|
|
|
|
const Modals = {
|
|
'open-torrent-address-modal': require('./open-torrent-address-modal'),
|
|
'remove-torrent-modal': require('./remove-torrent-modal'),
|
|
'update-available-modal': require('./update-available-modal'),
|
|
'unsupported-media-modal': require('./unsupported-media-modal')
|
|
}
|
|
|
|
module.exports = class App extends React.Component {
|
|
|
|
constructor (props) {
|
|
super(props)
|
|
this.state = props.state
|
|
}
|
|
|
|
render () {
|
|
var state = this.state
|
|
|
|
// Hide player controls while playing video, if the mouse stays still for a while
|
|
// Never hide the controls when:
|
|
// * The mouse is over the controls or we're scrubbing (see CSS)
|
|
// * The video is paused
|
|
// * The video is playing remotely on Chromecast or Airplay
|
|
var hideControls = state.location.url() === 'player' &&
|
|
state.playing.mouseStationarySince !== 0 &&
|
|
new Date().getTime() - state.playing.mouseStationarySince > 2000 &&
|
|
!state.playing.isPaused &&
|
|
state.playing.location === 'local' &&
|
|
state.playing.playbackRate === 1
|
|
|
|
var cls = [
|
|
'view-' + state.location.url(), /* e.g. view-home, view-player */
|
|
'is-' + process.platform /* e.g. is-darwin, is-win32, is-linux */
|
|
]
|
|
if (state.window.isFullScreen) cls.push('is-fullscreen')
|
|
if (state.window.isFocused) cls.push('is-focused')
|
|
if (hideControls) cls.push('hide-video-controls')
|
|
|
|
var vdom = (
|
|
<div className={'app ' + cls.join(' ')}>
|
|
<Header state={state} />
|
|
{this.getErrorPopover()}
|
|
<div key='content' className='content'>{this.getView()}</div>
|
|
{this.getModal()}
|
|
</div>
|
|
)
|
|
|
|
return vdom
|
|
}
|
|
|
|
getErrorPopover () {
|
|
var now = new Date().getTime()
|
|
var recentErrors = this.state.errors.filter((x) => now - x.time < 5000)
|
|
var hasErrors = recentErrors.length > 0
|
|
|
|
var errorElems = recentErrors.map(function (error, i) {
|
|
return (<div key={i} className='error'>{error.message}</div>)
|
|
})
|
|
return (
|
|
<div key='errors'
|
|
className={'error-popover ' + (hasErrors ? 'visible' : 'hidden')}>
|
|
<div key='title' className='title'>Error</div>
|
|
{errorElems}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
getModal () {
|
|
var state = this.state
|
|
if (!state.modal) return
|
|
var ModalContents = Modals[state.modal.id]
|
|
return (
|
|
<div key='modal' className='modal'>
|
|
<div key='modal-background' className='modal-background' />
|
|
<div key='modal-content' className='modal-content'>
|
|
<ModalContents state={state} />
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
getView () {
|
|
var state = this.state
|
|
var View = Views[state.location.url()]
|
|
return (<View state={state} />)
|
|
}
|
|
}
|