)
- }
- var trackers = createTorrent.announceList.join('\n')
- var collapsedClass = info.showAdvanced ? 'expanded' : 'collapsed'
+ // Then, use the name of the base folder (or sole file, for a single file torrent)
+ // as the default name. Show all files relative to the base folder.
+ var defaultName, basePath
+ if (files.length === 1) {
+ // Single file torrent: /a/b/foo.jpg -> torrent name 'foo.jpg', path '/a/b'
+ defaultName = files[0].name
+ basePath = pathPrefix
+ } else {
+ // Multi file torrent: /a/b/{foo, bar}.jpg -> torrent name 'b', path '/a'
+ defaultName = path.basename(pathPrefix)
+ basePath = path.dirname(pathPrefix)
+ }
+ var maxFileElems = 100
+ var fileElems = files.slice(0, maxFileElems).map(function (file) {
+ var relativePath = files.length === 0 ? file.name : path.relative(pathPrefix, file.path)
+ return (
- )
+ )
- function handleOK () {
- var announceList = document.querySelector('.torrent-trackers').value
- .split('\n')
- .map((s) => s.trim())
- .filter((s) => s !== '')
- var isPrivate = document.querySelector('.torrent-is-private').checked
- var comment = document.querySelector('.torrent-comment').value.trim()
- var options = {
- // We can't let the user choose their own name if we want WebTorrent
- // to use the files in place rather than creating a new folder.
- // If we ever want to add support for that:
- // name: document.querySelector('.torrent-name').value
- name: defaultName,
- path: basePath,
- files: files,
- announce: announceList,
- private: isPrivate,
- comment: comment
+ function handleOK () {
+ // TODO: dcposch use React refs instead
+ var announceList = document.querySelector('.torrent-trackers').value
+ .split('\n')
+ .map((s) => s.trim())
+ .filter((s) => s !== '')
+ var isPrivate = document.querySelector('.torrent-is-private').checked
+ var comment = document.querySelector('.torrent-comment').value.trim()
+ var options = {
+ // We can't let the user choose their own name if we want WebTorrent
+ // to use the files in place rather than creating a new folder.
+ // If we ever want to add support for that:
+ // name: document.querySelector('.torrent-name').value
+ name: defaultName,
+ path: basePath,
+ files: files,
+ announce: announceList,
+ private: isPrivate,
+ comment: comment
+ }
+ dispatch('createTorrent', options)
}
- dispatch('createTorrent', options)
}
}
-function CreateTorrentErrorPage () {
- 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.
-
-
-
-
-
-
- )
-}
-
// Finds the longest common prefix
function findCommonPrefix (a, b) {
for (var i = 0; i < a.length && i < b.length; i++) {
diff --git a/src/renderer/views/header.js b/src/renderer/views/header.js
index 75a49878..22fb83db 100644
--- a/src/renderer/views/header.js
+++ b/src/renderer/views/header.js
@@ -1,39 +1,42 @@
-module.exports = Header
-
const React = require('react')
const {dispatcher} = require('../lib/dispatcher')
-function Header (state) {
- return (
-
- {getTitle()}
-
-
- chevron_left
-
-
- chevron_right
-
+module.exports = class Header extends React.Component {
+ render () {
+ var loc = this.props.state.location
+ return (
+
+ {this.getTitle()}
+
+
+ chevron_left
+
+
+ chevron_right
+
+
+
+ {this.getAddButton()}
+
-
- {getAddButton()}
-
-
- )
+ )
+ }
- function getTitle () {
+ getTitle () {
if (process.platform !== 'darwin') return null
+ var state = this.props.state
return (
{state.window.title}
)
}
- function getAddButton () {
+ getAddButton () {
+ var state = this.props.state
if (state.location.url() !== 'home') return null
return (
-
-
+ )
+ }
}
function handleKeyPress (e) {
@@ -26,5 +27,6 @@ function handleKeyPress (e) {
function handleOK () {
dispatch('exitModal')
+ // TODO: dcposch use React refs instead
dispatch('addTorrent', document.querySelector('#add-torrent-url').value)
}
diff --git a/src/renderer/views/player.js b/src/renderer/views/player.js
index 295b9866..94e43d57 100644
--- a/src/renderer/views/player.js
+++ b/src/renderer/views/player.js
@@ -1,5 +1,3 @@
-module.exports = Player
-
const React = require('react')
const Bitfield = require('bitfield')
const prettyBytes = require('prettier-bytes')
@@ -9,19 +7,22 @@ const TorrentSummary = require('../lib/torrent-summary')
const {dispatch, dispatcher} = require('../lib/dispatcher')
// Shows a streaming video player. Standard features + Chromecast + Airplay
-function Player (state) {
- // Show the video as large as will fit in the window, play immediately
- // If the video is on Chromecast or Airplay, show a title screen instead
- var showVideo = state.playing.location === 'local'
- return (
-
- )
+module.exports = class Player extends React.Component {
+ render () {
+ // Show the video as large as will fit in the window, play immediately
+ // If the video is on Chromecast or Airplay, show a title screen instead
+ var state = this.props.state
+ var showVideo = state.playing.location === 'local'
+ return (
+
- )
+module.exports = class Preferences extends React.Component {
+ render () {
+ var state = this.props.state
+ return (
+
+ {renderGeneralSection(state)}
+
+ )
+ }
}
function renderGeneralSection (state) {
diff --git a/src/renderer/views/remove-torrent-modal.js b/src/renderer/views/remove-torrent-modal.js
index b22720b4..b1fda057 100644
--- a/src/renderer/views/remove-torrent-modal.js
+++ b/src/renderer/views/remove-torrent-modal.js
@@ -1,27 +1,28 @@
-module.exports = RemoveTorrentModal
-
const React = require('react')
const {dispatch, dispatcher} = require('../lib/dispatcher')
-function RemoveTorrentModal (state) {
- var message = state.modal.deleteData
- ? 'Are you sure you want to remove this torrent from the list and delete the data file?'
- : 'Are you sure you want to remove this torrent from the list?'
- var buttonText = state.modal.deleteData ? 'Remove Data' : 'Remove'
+module.exports = class RemoveTorrentModal extends React.Component {
+ render () {
+ var state = this.props.state
+ var message = state.modal.deleteData
+ ? 'Are you sure you want to remove this torrent from the list and delete the data file?'
+ : 'Are you sure you want to remove this torrent from the list?'
+ var buttonText = state.modal.deleteData ? 'Remove Data' : 'Remove'
- return (
-
)
}
// Show name, download status, % complete
- function renderTorrentMetadata (torrentSummary) {
+ renderTorrentMetadata (torrentSummary) {
var name = torrentSummary.name || 'Loading torrent...'
var elements = [(
{name}
@@ -132,7 +134,7 @@ function TorrentList (state) {
// Download button toggles between torrenting (DL/seed) and paused
// Play button starts streaming the torrent immediately, unpausing if needed
- function renderTorrentButtons (torrentSummary) {
+ renderTorrentButtons (torrentSummary) {
var infoHash = torrentSummary.infoHash
var playIcon, playTooltip, playClass
@@ -164,7 +166,7 @@ function TorrentList (state) {
torrentSummary.files[torrentSummary.defaultPlayFileIndex]
if (defaultFile && defaultFile.currentTime && !willShowSpinner) {
var fraction = defaultFile.currentTime / defaultFile.duration
- positionElem = renderRadialProgressBar(fraction, 'radial-progress-large')
+ positionElem = this.renderRadialProgressBar(fraction, 'radial-progress-large')
playClass = 'resume-position'
}
@@ -202,7 +204,7 @@ function TorrentList (state) {
}
// Show files, per-file download status and play buttons, and so on
- function renderTorrentDetails (torrentSummary) {
+ renderTorrentDetails (torrentSummary) {
var filesElement
if (!torrentSummary.files) {
// We don't know what files this torrent contains
@@ -219,7 +221,7 @@ function TorrentList (state) {
if (b.file.name < a.file.name) return 1
return 0
})
- .map((object) => renderFileRow(torrentSummary, object.file, object.index))
+ .map((object) => this.renderFileRow(torrentSummary, object.file, object.index))
filesElement = (
@@ -238,7 +240,7 @@ function TorrentList (state) {
}
// Show a single torrentSummary file in the details view for a single torrent
- function renderFileRow (torrentSummary, file, index) {
+ renderFileRow (torrentSummary, file, index) {
// First, find out how much of the file we've downloaded
// Are we even torrenting it?
var isSelected = torrentSummary.selections && torrentSummary.selections[index]
@@ -254,7 +256,7 @@ function TorrentList (state) {
var positionElem
if (file.currentTime) {
// Radial progress bar. 0% = start from 0:00, 270% = 3/4 of the way thru
- positionElem = renderRadialProgressBar(file.currentTime / file.duration)
+ positionElem = this.renderRadialProgressBar(file.currentTime / file.duration)
}
// Finally, render the file as a table row
@@ -294,25 +296,25 @@ function TorrentList (state) {
)
}
-}
-function renderRadialProgressBar (fraction, cssClass) {
- var rotation = 360 * fraction
- var transformFill = {transform: 'rotate(' + (rotation / 2) + 'deg)'}
- var transformFix = {transform: 'rotate(' + rotation + 'deg)'}
+ renderRadialProgressBar (fraction, cssClass) {
+ var rotation = 360 * fraction
+ var transformFill = {transform: 'rotate(' + (rotation / 2) + 'deg)'}
+ var transformFix = {transform: 'rotate(' + rotation + 'deg)'}
- return (
-