From a4a31d08608d4eb3d7499c0cf41138a2da905230 Mon Sep 17 00:00:00 2001 From: DC Date: Wed, 20 Jul 2016 13:49:14 -0700 Subject: [PATCH] React: fix warnings --- package.json | 2 +- src/renderer/lib/state.js | 1 + src/renderer/main.js | 6 +- src/renderer/views/app.js | 3 +- .../views/create-torrent-error-page.js | 26 ++++++ src/renderer/views/create-torrent.js | 44 ++++----- src/renderer/views/player.js | 93 +++++++++---------- src/renderer/views/preferences.js | 12 ++- src/renderer/views/torrent-list.js | 60 ++++++------ static/main.css | 7 ++ static/main.html | 4 +- 11 files changed, 148 insertions(+), 110 deletions(-) create mode 100644 src/renderer/views/create-torrent-error-page.js diff --git a/package.json b/package.json index 3df00984..a90eeef7 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "clean": "node ./bin/clean.js", "open-config": "node ./bin/open-config.js", "package": "node ./bin/package.js", - "start": "electron .", + "start": "jsx --es6module src/ build/ && electron .", "test": "standard && node ./bin/check-deps.js", "update-authors": "./bin/update-authors.sh" } diff --git a/src/renderer/lib/state.js b/src/renderer/lib/state.js index 2fd1ba82..af48a045 100644 --- a/src/renderer/lib/state.js +++ b/src/renderer/lib/state.js @@ -82,6 +82,7 @@ function getDefaultPlayState () { lastTimeUpdate: 0, /* Unix time in ms */ mouseStationarySince: 0, /* Unix time in ms */ playbackRate: 1, + volume: 1, subtitles: { tracks: [], /* subtitle tracks, each {label, language, ...} */ selectedIndex: -1, /* current subtitle track */ diff --git a/src/renderer/main.js b/src/renderer/main.js index 2ef43d9c..eaa331f3 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -82,7 +82,7 @@ function onState (err, _state) { // a progress bar and to keep the cursor in sync when playing a video setInterval(update, 1000) window.requestAnimationFrame(renderIfNecessary) - app = ReactDOM.render(, document.querySelector('body')) + app = ReactDOM.render(, document.querySelector('#body')) // OS integrations: // ...drag and drop a torrent or video file to play or seed @@ -240,8 +240,8 @@ const dispatchHandlers = { // Events from the UI never modify state directly. Instead they call dispatch() function dispatch (action, ...args) { - // Log dispatch calls, for debugging - if (!['mediaMouseMoved', 'mediaTimeUpdate'].includes(action)) { + // Log dispatch calls, for debugging, but don't spam + if (!['mediaMouseMoved', 'mediaTimeUpdate', 'update'].includes(action)) { console.log('dispatch: %s %o', action, args) } diff --git a/src/renderer/views/app.js b/src/renderer/views/app.js index e2224e99..bd159803 100644 --- a/src/renderer/views/app.js +++ b/src/renderer/views/app.js @@ -24,7 +24,6 @@ module.exports = class App extends React.Component { } render () { - console.time('render app') var state = this.state // Hide player controls while playing video, if the mouse stays still for a while @@ -55,7 +54,7 @@ module.exports = class App extends React.Component { {getModal(state)} ) - console.timeEnd('render app') + return vdom } } diff --git a/src/renderer/views/create-torrent-error-page.js b/src/renderer/views/create-torrent-error-page.js new file mode 100644 index 00000000..b59a360f --- /dev/null +++ b/src/renderer/views/create-torrent-error-page.js @@ -0,0 +1,26 @@ +const React = require('react') + +const {dispatcher} = require('../lib/dispatcher') + +module.exports = class CreateTorrentErrorPage extends React.Component { + render () { + return ( +
+

Create torrent

+

+

+ Sorry, you must select at least one file that is not a hidden file. +

+

+ Hidden files, starting with a . character, are not included. +

+

+

+ +

+
+ ) + } +} diff --git a/src/renderer/views/create-torrent.js b/src/renderer/views/create-torrent.js index 9deafb7c..7fe4a308 100644 --- a/src/renderer/views/create-torrent.js +++ b/src/renderer/views/create-torrent.js @@ -46,12 +46,12 @@ module.exports = class CreateTorrentPage extends React.Component { basePath = path.dirname(pathPrefix) } var maxFileElems = 100 - var fileElems = files.slice(0, maxFileElems).map(function (file) { + var fileElems = files.slice(0, maxFileElems).map(function (file, i) { var relativePath = files.length === 0 ? file.name : path.relative(pathPrefix, file.path) - return (
{relativePath}
) + return (
{relativePath}
) }) if (files.length > maxFileElems) { - fileElems.push(
+ {maxFileElems - files.length} more
) + fileElems.push(
+ {maxFileElems - files.length} more
) } var trackers = createTorrent.announceList.join('\n') var collapsedClass = info.showAdvanced ? 'expanded' : 'collapsed' @@ -59,39 +59,39 @@ module.exports = class CreateTorrentPage extends React.Component { return (

Create torrent {defaultName}

-

+

{torrentInfo} -

-

+

+
{pathPrefix}
-

-
+
{info.showAdvanced ? 'Basic' : 'Advanced'}
-
-

+

+
-

-

+

+
- -

-

+ +

+
-

-

+

+
{fileElems}
-

+
+
+
+ +
-

- - -

) diff --git a/src/renderer/views/player.js b/src/renderer/views/player.js index 94e43d57..afbd0106 100644 --- a/src/renderer/views/player.js +++ b/src/renderer/views/player.js @@ -94,6 +94,7 @@ function renderMedia (state) { var isSelected = state.playing.subtitles.selectedIndex === i trackTags.push( {mediaTag} @@ -179,7 +181,7 @@ function renderOverlay (state) { } return ( -
+
{elems}
) @@ -209,21 +211,21 @@ function renderAudioMetadata (state) { var elems = [] if (artist) { elems.push(( -
+
{artist}
)) } if (album) { elems.push(( -
+
{album}
)) } if (track) { elems.push(( -
+
{track}
)) @@ -232,12 +234,12 @@ function renderAudioMetadata (state) { // Align the title with the other info, if available. Otherwise, center title var emptyLabel = () elems.unshift(( -
+
{elems.length ? emptyLabel : undefined}{title}
)) - return (
{elems}
) + return (
{elems}
) } function renderLoadingSpinner (state) { @@ -254,9 +256,9 @@ function renderLoadingSpinner (state) { } return ( -
-
 
-
+
+
 
+
{fileProgress}% downloaded, ↓ {prettyBytes(prog.downloadSpeed || 0)}/s ↑ {prettyBytes(prog.uploadSpeed || 0)}/s @@ -302,11 +304,11 @@ function renderCastScreen (state) { } return ( -
+
{castIcon} -
{castType}
-
{castStatus}
+
{castType}
+
{castStatus}
) @@ -322,7 +324,7 @@ function renderCastOptions (state) { var isSelected = player.device === device var name = device.name return ( -
  • +
  • {isSelected ? 'radio_button_checked' : 'radio_button_unchecked'} {name}
  • @@ -330,20 +332,20 @@ function renderCastOptions (state) { }) return ( -
      +
        {items}
      ) } -function renderSubtitlesOptions (state) { +function renderSubtitleOptions (state) { var subtitles = state.playing.subtitles if (!subtitles.tracks.length || !subtitles.showMenu) return var items = subtitles.tracks.map(function (track, ix) { var isSelected = state.playing.subtitles.selectedIndex === ix return ( -
    • +
    • {'radio_button_' + (isSelected ? 'checked' : 'unchecked')} {track.label}
    • @@ -353,7 +355,7 @@ function renderSubtitlesOptions (state) { var noneSelected = state.playing.subtitles.selectedIndex === -1 var noneClass = 'radio_button_' + (noneSelected ? 'checked' : 'unchecked') return ( -
        +
          {items}
        • {noneClass} @@ -373,13 +375,15 @@ function renderPlayerControls (state) { : '' var elements = [ -
          +
          {renderLoadingBar(state)}
          , - + {state.playing.isPaused ? 'play_arrow' : 'pause'} , {state.window.isFullScreen ? 'fullscreen_exit' : 'fullscreen'} @@ -403,6 +411,7 @@ function renderPlayerControls (state) { // show closed captions icon elements.push(( closed_caption @@ -446,6 +455,7 @@ function renderPlayerControls (state) { elements.push(( {buttonIcon} @@ -466,8 +476,10 @@ function renderPlayerControls (state) { 'color-stop(' + (volume * 100) + '%, #727272))' } + //TODO: dcposch change the range input to use value / onChanged instead of + // "readonly" / onMouse[Down,Move,Up] elements.push(( -
          +
          @@ -476,10 +488,8 @@ function renderPlayerControls (state) {
          @@ -489,7 +499,7 @@ function renderPlayerControls (state) { var currentTimeStr = formatTime(state.playing.currentTime) var durationStr = formatTime(state.playing.duration) elements.push(( - + {currentTimeStr} / {durationStr} )) @@ -497,17 +507,17 @@ function renderPlayerControls (state) { // render playback rate if (state.playing.playbackRate !== 1) { elements.push(( - + {state.playing.playbackRate}x )) } return ( -
          +
          {elements} {renderCastOptions(state)} - {renderSubtitlesOptions(state)} + {renderSubtitleOptions(state)}
          ) @@ -540,21 +550,7 @@ function renderPlayerControls (state) { // Handles volume slider scrub function handleVolumeScrub (e) { - switch (e.type) { - case 'mouseup': - volumeChanging = false - dispatch('setVolume', e.nativeEvent.offsetX / 50) - break - case 'mousedown': - volumeChanging = this.value - break - case 'mousemove': - // only change if move was started by click - if (volumeChanging !== false) { - volumeChanging = this.value - } - break - } + dispatch('setVolume', e.target.value) } function handleSubtitles (e) { @@ -567,9 +563,6 @@ function renderPlayerControls (state) { } } -// lets scrub without sending to volume backend -var volumeChanging = false - // Renders the loading bar. Shows which parts of the torrent are loaded, which // can be 'spongey' / non-contiguous function renderLoadingBar (state) { @@ -594,15 +587,15 @@ function renderLoadingBar (state) { } // Output some bars to show which parts of the file are loaded - var loadingBarElems = parts.map(function (part) { + var loadingBarElems = parts.map(function (part, i) { var style = { left: (100 * part.start / fileProg.numPieces) + '%', width: (100 * part.count / fileProg.numPieces) + '%' } - return (
          ) + return (
          ) }) - return (
          {loadingBarElems}
          ) + return (
          {loadingBarElems}
          ) } // Returns the CSS background-image string for a poster image + dark vignette diff --git a/src/renderer/views/preferences.js b/src/renderer/views/preferences.js index 20be7258..3caaac93 100644 --- a/src/renderer/views/preferences.js +++ b/src/renderer/views/preferences.js @@ -17,6 +17,7 @@ module.exports = class Preferences extends React.Component { function renderGeneralSection (state) { return renderSection({ + key: 'general', title: 'General', description: '', icon: 'settings' @@ -27,6 +28,7 @@ function renderGeneralSection (state) { function renderDownloadDirSelector (state) { return renderFileSelector({ + key: 'download-path', label: 'Download Path', description: 'Data from torrents will be saved here', property: 'downloadPath', @@ -46,18 +48,18 @@ function renderDownloadDirSelector (state) { // - controls should be an array of vdom elements function renderSection (definition, controls) { var helpElem = !definition.description ? null : ( -
          +
          help_outline{definition.description}
          ) return ( -
          +
          -
          +
          {definition.icon}{definition.title}
          {helpElem} -
          +
          {controls}
          @@ -72,7 +74,7 @@ function renderSection (definition, controls) { // - callback takes a new file or folder path function renderFileSelector (definition, value, callback) { return ( -
          +