diff --git a/src/renderer/components/ShowMore.js b/src/renderer/components/ShowMore.js index 62313d64..4c79b86d 100644 --- a/src/renderer/components/ShowMore.js +++ b/src/renderer/components/ShowMore.js @@ -39,14 +39,11 @@ class ShowMore extends React.Component { ? this.props.hideLabel : this.props.showLabel return ( -
+
{this.state.expanded ? this.props.children : null} + label={label} />
) } diff --git a/src/renderer/pages/CreateTorrentPage.js b/src/renderer/pages/CreateTorrentPage.js index 4821f0fe..697b1347 100644 --- a/src/renderer/pages/CreateTorrentPage.js +++ b/src/renderer/pages/CreateTorrentPage.js @@ -8,6 +8,7 @@ const {dispatch, dispatcher} = require('../lib/dispatcher') const FlatButton = require('material-ui/FlatButton').default const RaisedButton = require('material-ui/RaisedButton').default const TextField = require('material-ui/TextField').default +const Checkbox = require('material-ui/Checkbox').default const CreateTorrentErrorPage = require('../components/create-torrent-error-page') const Heading = require('../components/Heading') @@ -20,27 +21,20 @@ class CreateTorrentPage extends React.Component { var state = this.props.state var info = state.location.current() - // Preprocess: exclude .DS_Store and other dotfiles - var files = info.files - .filter((f) => !f.name.startsWith('.')) - .map((f) => ({name: f.name, path: f.path, size: f.size})) - if (files.length === 0) return () - // First, extract the base folder that the files are all in var pathPrefix = info.folderPath if (!pathPrefix) { - pathPrefix = files.map((x) => x.path).reduce(findCommonPrefix) + pathPrefix = info.files.map((x) => x.path).reduce(findCommonPrefix) if (!pathPrefix.endsWith('/') && !pathPrefix.endsWith('\\')) { pathPrefix = path.dirname(pathPrefix) } } - // Sanity check: show the number of files and total size - var numFiles = files.length - var totalBytes = files - .map((f) => f.size) - .reduce((a, b) => a + b, 0) - var torrentInfo = `${numFiles} files, ${prettyBytes(totalBytes)}` + // Then, exclude .DS_Store and other dotfiles + var files = info.files + .filter((f) => !containsDots(f.path, pathPrefix)) + .map((f) => ({name: f.name, path: f.path, size: f.size})) + if (files.length === 0) return () // 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. @@ -54,34 +48,32 @@ class CreateTorrentPage extends React.Component { defaultName = path.basename(pathPrefix) basePath = path.dirname(pathPrefix) } - var maxFileElems = 100 - var fileElems = files.slice(0, maxFileElems).map(function (file, i) { - var relativePath = files.length === 0 - ? file.name - : path.relative(pathPrefix, file.path) - return (
{relativePath}
) - }) - if (files.length > maxFileElems) { - fileElems.push(
+ {maxFileElems - files.length} more
) - } + + // Default trackers var trackers = createTorrent.announceList.join('\n') this.state = { + comment: '', + isPrivate: false, + pathPrefix, basePath, defaultName, - fileElems, - torrentInfo, + files, trackers } + + // Create React event handlers only once + this.setIsPrivate = (_, isPrivate) => this.setState({isPrivate}) + this.setComment = (_, comment) => this.setState({comment}) + this.setTrackers = (_, trackers) => this.setState({trackers}) + this.handleSubmit = () => this.handleSubmit } handleSubmit () { - var announceList = document.querySelector('.torrent-trackers').value + var announceList = this.state.trackers .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. @@ -89,55 +81,37 @@ class CreateTorrentPage extends React.Component { path: this.state.basePath, files: this.state.files, announce: announceList, - private: isPrivate, - comment: comment + private: this.state.isPrivate, + comment: this.state.comment.trim() } dispatch('createTorrent', options) } render () { + var files = this.state.files + + // Sanity check: show the number of files and total size + var numFiles = files.length + var totalBytes = files + .map((f) => f.size) + .reduce((a, b) => a + b, 0) + var torrentInfo = `${numFiles} files, ${prettyBytes(totalBytes)}` + return (
- - Create torrent "{this.state.defaultName}" - -
- {this.state.torrentInfo} -
+ Create torrent {this.state.defaultName} +
{torrentInfo}
-
{this.state.pathPrefix}
+
{this.state.pathPrefix}
-
-
- - -
- Trackers: - -
- -