From 098827ec7814c1835eb1ba0fc0098cc0786ffb02 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 5 Mar 2016 15:46:57 -0800 Subject: [PATCH] State: put temp state directly in state, saved in state.saved --- renderer/index.js | 115 ++++++++++++++++----------------- renderer/views/app.js | 8 +-- renderer/views/header.js | 4 +- renderer/views/player.js | 30 ++++----- renderer/views/torrent-list.js | 4 +- 5 files changed, 80 insertions(+), 81 deletions(-) diff --git a/renderer/index.js b/renderer/index.js index 42094769..622b5167 100644 --- a/renderer/index.js +++ b/renderer/index.js @@ -34,31 +34,30 @@ var state = global.state = { /* Temporary state disappears once the program exits. * It can contain complex objects like open connections, etc. */ - temp: { - url: '/', - client: null, /* the WebTorrent client */ - server: null, /* local WebTorrent-to-HTTP server */ - dock: { - badge: 0, - progress: 0 - }, - devices: { - airplay: null, /* airplay client. finds and manages AppleTVs */ - chromecast: null /* chromecast client. finds and manages Chromecasts */ - }, - torrentPlaying: null, /* the torrent we're streaming. see client.torrents */ - // history: [], /* track how we got to the current view. enables Back button */ - // historyIndex: 0, - isFocused: true, - isFullScreen: false, - mainWindowBounds: null, /* x y width height */ - title: 'WebTorrent', /* current window title */ - video: { - isPaused: false, - currentTime: 0, /* seconds */ - duration: 1 /* seconds */ - } + url: '/', + client: null, /* the WebTorrent client */ + server: null, /* local WebTorrent-to-HTTP server */ + dock: { + badge: 0, + progress: 0 }, + devices: { + airplay: null, /* airplay client. finds and manages AppleTVs */ + chromecast: null /* chromecast client. finds and manages Chromecasts */ + }, + torrentPlaying: null, /* the torrent we're streaming. see client.torrents */ + // history: [], /* track how we got to the current view. enables Back button */ + // historyIndex: 0, + isFocused: true, + isFullScreen: false, + mainWindowBounds: null, /* x y width height */ + title: 'WebTorrent', /* current window title */ + video: { + isPaused: false, + currentTime: 0, /* seconds */ + duration: 1 /* seconds */ + }, + /* Saved state is read from and written to ~/.webtorrent/state.json * It should be simple and minimal and must be JSONifiable */ @@ -90,7 +89,7 @@ function init () { client = global.client = new WebTorrent() client.on('warning', onWarning) client.on('error', onError) - state.temp.client = client + state.client = client vdomLoop = mainLoop(state, render, { create: createElement, @@ -104,12 +103,12 @@ function init () { dragDrop('body', onFiles) chromecasts.on('update', function (player) { - state.temp.devices.chromecast = player + state.devices.chromecast = player update() }) airplay.createBrowser().on('deviceOn', function (player) { - state.temp.devices.airplay = player + state.devices.airplay = player }).start() document.addEventListener('paste', function () { @@ -118,7 +117,7 @@ function init () { document.addEventListener('keydown', function (e) { if (e.which === 27) { /* ESC means either exit fullscreen or go back */ - if (state.temp.isFullScreen) { + if (state.isFullScreen) { dispatch('toggleFullScreen') } else { dispatch('back') @@ -127,13 +126,13 @@ function init () { }) window.addEventListener('focus', function () { - state.temp.isFocused = true - if (state.temp.dock.badge > 0) electron.ipcRenderer.send('setBadge', '') - state.temp.dock.badge = 0 + state.isFocused = true + if (state.dock.badge > 0) electron.ipcRenderer.send('setBadge', '') + state.dock.badge = 0 }) window.addEventListener('blur', function () { - state.temp.isFocused = false + state.isFocused = false }) } init() @@ -152,16 +151,16 @@ setInterval(function () { }, 1000) function updateDockIcon () { - var progress = state.temp.client.progress - var activeTorrentsExist = state.temp.client.torrents.some(function (torrent) { + var progress = state.client.progress + var activeTorrentsExist = state.client.torrents.some(function (torrent) { return torrent.progress !== 1 }) // Hide progress bar when client has no torrents, or progress is 100% if (!activeTorrentsExist || progress === 1) { progress = -1 } - if (progress !== state.temp.dock.progress) { - state.temp.dock.progress = progress + if (progress !== state.dock.progress) { + state.dock.progress = progress electron.ipcRenderer.send('setProgress', progress) } } @@ -190,19 +189,19 @@ function dispatch (action, ...args) { setDimensions(args[0] /* dimensions */) } if (action === 'back') { - if (state.temp.url === '/player') { + if (state.url === '/player') { restoreBounds() closeServer() } - state.temp.url = '/' + state.url = '/' update() } if (action === 'playPause') { - state.temp.video.isPaused = !state.temp.video.isPaused + state.video.isPaused = !state.video.isPaused update() } if (action === 'playbackJump') { - state.temp.video.jumpToTime = args[0] /* seconds */ + state.video.jumpToTime = args[0] /* seconds */ update() } if (action === 'toggleFullScreen') { @@ -219,14 +218,14 @@ electron.ipcRenderer.on('seed', function (e, files) { }) electron.ipcRenderer.on('fullscreenChanged', function (e, isFullScreen) { - state.temp.isFullScreen = isFullScreen + state.isFullScreen = isFullScreen update() }) electron.ipcRenderer.on('addFakeDevice', function (e, device) { var player = new EventEmitter() player.play = (networkURL) => console.log(networkURL) - state.temp.devices[device] = player + state.devices[device] = player update() }) @@ -263,9 +262,9 @@ function seed (files) { function addTorrentEvents (torrent) { torrent.on('infoHash', update) torrent.on('done', function () { - if (!state.temp.isFocused) { - state.temp.dock.badge += 1 - electron.ipcRenderer.send('setBadge', state.temp.dock.badge) + if (!state.isFocused) { + state.dock.badge += 1 + electron.ipcRenderer.send('setBadge', state.dock.badge) } update() }) @@ -287,19 +286,19 @@ function torrentReady (torrent) { } function startServer (torrent, cb) { - if (state.temp.server) return cb() + if (state.server) return cb() // use largest file - state.temp.torrentPlaying = torrent.files.reduce(function (a, b) { + state.torrentPlaying = torrent.files.reduce(function (a, b) { return a.length > b.length ? a : b }) - var index = torrent.files.indexOf(state.temp.torrentPlaying) + var index = torrent.files.indexOf(state.torrentPlaying) var server = torrent.createServer() server.listen(0, function () { var port = server.address().port var urlSuffix = ':' + port + '/' + index - state.temp.server = { + state.server = { server: server, localURL: 'http://localhost' + urlSuffix, networkURL: 'http://' + networkAddress() + urlSuffix @@ -309,13 +308,13 @@ function startServer (torrent, cb) { } function closeServer () { - state.temp.server.server.destroy() - state.temp.server = null + state.server.server.destroy() + state.server = null } function openPlayer (torrent) { startServer(torrent, function () { - state.temp.url = '/player' + state.url = '/player' update() }) } @@ -326,10 +325,10 @@ function deleteTorrent (torrent) { function openChromecast (torrent) { startServer(torrent, function () { - state.temp.devices.chromecast.play(state.temp.server.networkURL, { + state.devices.chromecast.play(state.server.networkURL, { title: 'WebTorrent — ' + torrent.name }) - state.temp.devices.chromecast.on('error', function (err) { + state.devices.chromecast.on('error', function (err) { err.message = 'Chromecast: ' + err.message onError(err) }) @@ -339,7 +338,7 @@ function openChromecast (torrent) { function openAirplay (torrent) { startServer(torrent, function () { - state.temp.devices.airplay.play(state.temp.server.networkURL, 0, function () { + state.devices.airplay.play(state.server.networkURL, 0, function () { // TODO: handle airplay errors }) update() @@ -347,7 +346,7 @@ function openAirplay (torrent) { } function setDimensions (dimensions) { - state.temp.mainWindowBounds = electron.remote.getCurrentWindow().getBounds() + state.mainWindowBounds = electron.remote.getCurrentWindow().getBounds() // Limit window size to screen size var workAreaSize = electron.remote.screen.getPrimaryDisplay().workAreaSize @@ -373,8 +372,8 @@ function setDimensions (dimensions) { function restoreBounds () { electron.ipcRenderer.send('setAspectRatio', 0) - if (state.temp.mainWindowBounds) { - electron.ipcRenderer.send('setBounds', state.temp.mainWindowBounds, true) + if (state.mainWindowBounds) { + electron.ipcRenderer.send('setBounds', state.mainWindowBounds, true) } } diff --git a/renderer/views/app.js b/renderer/views/app.js index 25334a66..56c93bb3 100644 --- a/renderer/views/app.js +++ b/renderer/views/app.js @@ -10,9 +10,9 @@ var TorrentList = require('./torrent-list') function App (state, dispatch) { function getView () { - if (state.temp.url === '/') { + if (state.url === '/') { return TorrentList(state, dispatch) - } else if (state.temp.url === '/player') { + } else if (state.url === '/player') { return Player(state, dispatch) } } @@ -20,8 +20,8 @@ function App (state, dispatch) { // Show the header only when we're outside of fullscreen // Also don't show it in the video player except in OSX var isOSX = process.platform === 'darwin' - var isVideo = state.temp.url === '/player' - var isFullScreen = state.temp.isFullScreen + var isVideo = state.url === '/player' + var isFullScreen = state.isFullScreen var header = !isFullScreen && (!isVideo || isOSX) ? Header(state, dispatch) : null return hx` diff --git a/renderer/views/header.js b/renderer/views/header.js index e4ec6a26..39be2a7b 100644 --- a/renderer/views/header.js +++ b/renderer/views/header.js @@ -23,12 +23,12 @@ function Header (state, dispatch) { function getTitle () { if (process.platform === 'darwin') { - return hx`
${state.temp.title}
` + return hx`
${state.title}
` } } function plusButton () { - if (state.temp.url !== '/player') { + if (state.url !== '/player') { return hx`add` } } diff --git a/renderer/views/player.js b/renderer/views/player.js index 966c0e77..2335864f 100644 --- a/renderer/views/player.js +++ b/renderer/views/player.js @@ -9,18 +9,18 @@ function Player (state, dispatch) { // Instead, grab the DOM node and play/pause it if necessary var videoElement = document.querySelector('video') if (videoElement !== null) { - if (state.temp.video.isPaused && !videoElement.paused) { + if (state.video.isPaused && !videoElement.paused) { videoElement.pause() - } else if (!state.temp.video.isPaused && videoElement.paused) { + } else if (!state.video.isPaused && videoElement.paused) { videoElement.play() } // When the user clicks or drags on the progress bar, jump to that position - if (state.temp.video.jumpToTime) { - videoElement.currentTime = state.temp.video.jumpToTime - state.temp.video.jumpToTime = null + if (state.video.jumpToTime) { + videoElement.currentTime = state.video.jumpToTime + state.video.jumpToTime = null } - state.temp.video.currentTime = videoElement.currentTime - state.temp.video.duration = videoElement.duration + state.video.currentTime = videoElement.currentTime + state.video.duration = videoElement.duration } // Show the video as large as will fit in the window, play immediately @@ -28,7 +28,7 @@ function Player (state, dispatch) {
@@ -52,9 +52,9 @@ function Player (state, dispatch) { // Renders all video controls: play/pause, scrub, loading bar // TODO: cast buttons function renderPlayerControls (state, dispatch) { - var positionPercent = 100 * state.temp.video.currentTime / state.temp.video.duration + var positionPercent = 100 * state.video.currentTime / state.video.duration var playbackCursorStyle = { left: 'calc(' + positionPercent + '% - 8px)' } - var torrent = state.temp.torrentPlaying._torrent + var torrent = state.torrentPlaying._torrent var elements = [ hx` @@ -75,7 +75,7 @@ function renderPlayerControls (state, dispatch) { ` ] // If we've detected a Chromecast or AppleTV, the user can play video there - if (state.temp.devices.chromecast) { + if (state.devices.chromecast) { elements.push(hx` dispatch('openChromecast', torrent)}> @@ -83,7 +83,7 @@ function renderPlayerControls (state, dispatch) { `) } - if (state.temp.devices.airplay) { + if (state.devices.airplay) { elements.push(hx` dispatch('openAirplay', torrent)}> @@ -103,7 +103,7 @@ function renderPlayerControls (state, dispatch) { } elements.push(hx` dispatch('playPause')}> - ${state.temp.video.isPaused ? 'play_arrow' : 'pause'} + ${state.video.isPaused ? 'play_arrow' : 'pause'} `) @@ -113,7 +113,7 @@ function renderPlayerControls (state, dispatch) { function handleScrub (e) { var windowWidth = document.querySelector('body').clientWidth var fraction = e.clientX / windowWidth - var position = fraction * state.temp.video.duration /* seconds */ + var position = fraction * state.video.duration /* seconds */ dispatch('playbackJump', position) } } @@ -121,7 +121,7 @@ function renderPlayerControls (state, dispatch) { // Renders the loading bar. Shows which parts of the torrent are loaded, which // can be "spongey" / non-contiguous function renderLoadingBar (state) { - var torrent = state.temp.torrentPlaying._torrent + var torrent = state.torrentPlaying._torrent if (torrent === null) { return [] } diff --git a/renderer/views/torrent-list.js b/renderer/views/torrent-list.js index afbdd193..fa32b36a 100644 --- a/renderer/views/torrent-list.js +++ b/renderer/views/torrent-list.js @@ -6,8 +6,8 @@ var hx = hyperx(h) var prettyBytes = require('pretty-bytes') function TorrentList (state, dispatch) { - var torrents = state.temp.client - ? state.temp.client.torrents + var torrents = state.client + ? state.client.torrents : [] var list = torrents.map((torrent) => renderTorrent(torrent, dispatch))