mirror of
https://github.com/zoriya/flood.git
synced 2025-12-20 22:25:16 +00:00
Abstract DirectoryTree component from TorrentDetails
This commit is contained in:
@@ -3,6 +3,7 @@ import classNames from 'classnames';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import CSSTransitionGroup from 'react-addons-css-transition-group';
|
import CSSTransitionGroup from 'react-addons-css-transition-group';
|
||||||
|
|
||||||
|
import TorrentFiles from './TorrentFiles';
|
||||||
import EventTypes from '../../constants/EventTypes';
|
import EventTypes from '../../constants/EventTypes';
|
||||||
import format from '../../util/formatData';
|
import format from '../../util/formatData';
|
||||||
import Icon from '../icons/Icon';
|
import Icon from '../icons/Icon';
|
||||||
@@ -11,12 +12,9 @@ import TorrentStore from '../../stores/TorrentStore';
|
|||||||
import UIStore from '../../stores/UIStore';
|
import UIStore from '../../stores/UIStore';
|
||||||
|
|
||||||
const METHODS_TO_BIND = [
|
const METHODS_TO_BIND = [
|
||||||
'getFileData',
|
|
||||||
'getFileTreeDomNodes',
|
|
||||||
'onTorrentDetailsHashChange',
|
'onTorrentDetailsHashChange',
|
||||||
'onOpenChange',
|
'onOpenChange',
|
||||||
'onTorrentDetailsChange',
|
'onTorrentDetailsChange',
|
||||||
'createFileTree',
|
|
||||||
'getHeading',
|
'getHeading',
|
||||||
'getSidePanel'
|
'getSidePanel'
|
||||||
];
|
];
|
||||||
@@ -76,106 +74,6 @@ export default class TorrentDetails extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
createFileTree(tree = {}, directory, file, depth = 0) {
|
|
||||||
if (depth < file.pathComponents.length - 1) {
|
|
||||||
depth++;
|
|
||||||
tree[directory] = this.createFileTree(
|
|
||||||
tree[directory],
|
|
||||||
file.pathComponents[depth],
|
|
||||||
file,
|
|
||||||
depth
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
if (!tree.files) {
|
|
||||||
tree.files = [];
|
|
||||||
}
|
|
||||||
tree.files.push(file);
|
|
||||||
}
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileTreeDomNodes(tree, depth = 0) {
|
|
||||||
let index = 0;
|
|
||||||
depth++;
|
|
||||||
return Object.keys(tree).map((branchName) => {
|
|
||||||
let branch = tree[branchName];
|
|
||||||
let domNodes = null;
|
|
||||||
index++;
|
|
||||||
|
|
||||||
if (branchName === 'files') {
|
|
||||||
branch.sort((a, b) => {
|
|
||||||
return a.filename.localeCompare(b.filename);
|
|
||||||
});
|
|
||||||
domNodes = branch.map((file, fileIndex) => {
|
|
||||||
return (
|
|
||||||
<div className="file-list__node file-list__node--file"
|
|
||||||
key={`${fileIndex}`}>
|
|
||||||
<Icon icon="file" />
|
|
||||||
{file.filename}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
let classes = `file-list__branch file-list__branch--depth-${depth}`;
|
|
||||||
domNodes = (
|
|
||||||
<div className={classes} key={`${index}${depth}`}>
|
|
||||||
<div className="file-list__node file-list__node--directory">
|
|
||||||
<Icon icon="directoryOutlined" />
|
|
||||||
{branchName}
|
|
||||||
</div>
|
|
||||||
{this.getFileTreeDomNodes(tree[branchName], depth)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return domNodes;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileList(files) {
|
|
||||||
let tree = {};
|
|
||||||
|
|
||||||
files.forEach((file) => {
|
|
||||||
tree = this.createFileTree(tree, file.pathComponents[0], file);
|
|
||||||
});
|
|
||||||
|
|
||||||
let directoryTree = this.getFileTreeDomNodes(tree);
|
|
||||||
|
|
||||||
return directoryTree;
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileData(torrent, files) {
|
|
||||||
let parentDirectory = torrent.directory;
|
|
||||||
let filename = torrent.filename;
|
|
||||||
|
|
||||||
if (files) {
|
|
||||||
// We've received full file details from the client.
|
|
||||||
return (
|
|
||||||
<div className="file-list torrent-details__section">
|
|
||||||
<div className="file-list__node file-list__parent-directory">
|
|
||||||
<Icon icon="directoryFilled" />
|
|
||||||
{parentDirectory}
|
|
||||||
</div>
|
|
||||||
{this.getFileList(files)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// We've only received the top-level file details from the torrent list.
|
|
||||||
return (
|
|
||||||
<div className="file-list torrent-details__section">
|
|
||||||
<div className="file-list__node file-list__parent-directory">
|
|
||||||
<Icon icon="directoryFilled" />
|
|
||||||
{parentDirectory}
|
|
||||||
</div>
|
|
||||||
<div className="file-list__node file-list__node--file">
|
|
||||||
<Icon icon="file" />
|
|
||||||
{filename}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getHeading() {
|
getHeading() {
|
||||||
// return (
|
// return (
|
||||||
// <div className="torrent-details__actions torrent-details__section">
|
// <div className="torrent-details__actions torrent-details__section">
|
||||||
@@ -276,7 +174,7 @@ export default class TorrentDetails extends React.Component {
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
{this.getTrackerList(torrentDetails.trackers)}
|
{this.getTrackerList(torrentDetails.trackers)}
|
||||||
{this.getFileData(torrent, torrentDetails.files)}
|
<TorrentFiles files={torrentDetails.files} torrent={torrent} />
|
||||||
{this.getPeerList(torrentDetails.peers)}
|
{this.getPeerList(torrentDetails.peers)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -322,13 +220,17 @@ export default class TorrentDetails extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
try {
|
||||||
<CSSTransitionGroup
|
return (
|
||||||
transitionEnterTimeout={500}
|
<CSSTransitionGroup
|
||||||
transitionLeaveTimeout={500}
|
transitionEnterTimeout={500}
|
||||||
transitionName="torrent-details">
|
transitionLeaveTimeout={500}
|
||||||
{this.getSidePanel()}
|
transitionName="torrent-details">
|
||||||
</CSSTransitionGroup>
|
{this.getSidePanel()}
|
||||||
);
|
</CSSTransitionGroup>
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
console.trace(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user