Merge pull request #62 from lbryio/my-files-tabs
Separate tabs for Downloaded and Published files in My Files
This commit is contained in:
commit
ac1b504dcf
5 changed files with 117 additions and 17 deletions
12
js/app.js
12
js/app.js
|
@ -89,6 +89,12 @@ var App = React.createClass({
|
||||||
'?claim' : 'Claim Beta Code',
|
'?claim' : 'Claim Beta Code',
|
||||||
'?referral' : 'Check Referral Credit',
|
'?referral' : 'Check Referral Credit',
|
||||||
};
|
};
|
||||||
|
case 'downloaded':
|
||||||
|
case 'published':
|
||||||
|
return {
|
||||||
|
'?downloaded': 'Downloaded',
|
||||||
|
'?published': 'Published',
|
||||||
|
};
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -105,8 +111,10 @@ var App = React.createClass({
|
||||||
return <WatchPage name={this.state.pageArgs} />;
|
return <WatchPage name={this.state.pageArgs} />;
|
||||||
case 'report':
|
case 'report':
|
||||||
return <ReportPage />;
|
return <ReportPage />;
|
||||||
case 'files':
|
case 'downloaded':
|
||||||
return <MyFilesPage />;
|
return <MyFilesPage show="downloaded" />;
|
||||||
|
case 'published':
|
||||||
|
return <MyFilesPage show="published" />;
|
||||||
case 'start':
|
case 'start':
|
||||||
return <StartPage />;
|
return <StartPage />;
|
||||||
case 'claim':
|
case 'claim':
|
||||||
|
|
|
@ -32,7 +32,7 @@ var Drawer = React.createClass({
|
||||||
</div>
|
</div>
|
||||||
<DrawerItem href='/?discover' viewingPage={this.props.viewingPage} label="Discover" icon="icon-search" />
|
<DrawerItem href='/?discover' viewingPage={this.props.viewingPage} label="Discover" icon="icon-search" />
|
||||||
<DrawerItem href='/?publish' viewingPage={this.props.viewingPage} label="Publish" icon="icon-upload" />
|
<DrawerItem href='/?publish' viewingPage={this.props.viewingPage} label="Publish" icon="icon-upload" />
|
||||||
<DrawerItem href='/?files' viewingPage={this.props.viewingPage} label="My Files" icon='icon-cloud-download' />
|
<DrawerItem href='/?downloaded' viewingPage={this.props.viewingPage} label="My Files" icon='icon-cloud-download' />
|
||||||
<DrawerItem href="/?wallet" viewingPage={this.props.viewingPage} label="My Wallet" badge={lbry.formatCredits(this.state.balance) } icon="icon-bank" />
|
<DrawerItem href="/?wallet" viewingPage={this.props.viewingPage} label="My Wallet" badge={lbry.formatCredits(this.state.balance) } icon="icon-bank" />
|
||||||
<DrawerItem href='/?settings' viewingPage={this.props.viewingPage} label="Settings" icon='icon-gear' />
|
<DrawerItem href='/?settings' viewingPage={this.props.viewingPage} label="Settings" icon='icon-gear' />
|
||||||
<DrawerItem href='/?help' viewingPage={this.props.viewingPage} label="Help" icon='icon-question-circle' />
|
<DrawerItem href='/?help' viewingPage={this.props.viewingPage} label="Help" icon='icon-question-circle' />
|
||||||
|
|
36
js/lbry.js
36
js/lbry.js
|
@ -138,6 +138,10 @@ lbry.getClaimInfo = function(name, callback) {
|
||||||
lbry.call('get_claim_info', { name: name }, callback);
|
lbry.call('get_claim_info', { name: name }, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lbry.getMyClaim = function(name, callback) {
|
||||||
|
lbry.call('get_my_claim', { name: name }, callback);
|
||||||
|
}
|
||||||
|
|
||||||
lbry.getCostEstimate = function(name, callback) {
|
lbry.getCostEstimate = function(name, callback) {
|
||||||
lbry.call('get_est_cost', { name: name }, callback);
|
lbry.call('get_est_cost', { name: name }, callback);
|
||||||
}
|
}
|
||||||
|
@ -169,14 +173,42 @@ lbry.revealFile = function(path, callback) {
|
||||||
lbry.call('reveal', { path: path }, callback);
|
lbry.call('reveal', { path: path }, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
lbry.publish = function(params, callback, errorCallback) {
|
lbry.getFileInfoWhenListed = function(name, callback, timeoutCallback, tryNum=0) {
|
||||||
|
// Calls callback with file info when it appears in the list of files returned by lbry.getFilesInfo().
|
||||||
|
// If timeoutCallback is provided, it will be called if the file fails to appear.
|
||||||
|
lbry.getFilesInfo(function(filesInfo) {
|
||||||
|
for (var fileInfo of filesInfo) {
|
||||||
|
if (fileInfo.lbry_uri == name) {
|
||||||
|
callback(fileInfo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tryNum <= 200) {
|
||||||
|
setTimeout(function() { lbry.getFileInfoWhenListed(name, callback, timeoutCallback, tryNum + 1) }, 250);
|
||||||
|
} else if (timeoutCallback) {
|
||||||
|
timeoutCallback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
lbry.publish = function(params, fileListedCallback, publishedCallback, errorCallback) {
|
||||||
|
// Publishes a file.
|
||||||
|
// The optional fileListedCallback is called when the file becomes available in
|
||||||
|
// lbry.getFilesInfo() during the publish process.
|
||||||
|
|
||||||
// Use ES6 named arguments instead of directly passing param dict?
|
// Use ES6 named arguments instead of directly passing param dict?
|
||||||
lbry.call('publish', params, callback, (errorInfo) => {
|
lbry.call('publish', params, publishedCallback, (errorInfo) => {
|
||||||
errorCallback({
|
errorCallback({
|
||||||
name: fault.fault,
|
name: fault.fault,
|
||||||
message: fault.faultString,
|
message: fault.faultString,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
if (fileListedCallback) {
|
||||||
|
lbry.getFileInfoWhenListed(params.name, function(fileInfo) {
|
||||||
|
fileListedCallback(fileInfo);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lbry.getVersionInfo = function(callback) {
|
lbry.getVersionInfo = function(callback) {
|
||||||
|
|
|
@ -110,6 +110,7 @@ var MyFilesRow = React.createClass({
|
||||||
{this.props.completed ? 'Download complete' : (parseInt(this.props.ratioLoaded * 100) + '%')}
|
{this.props.completed ? 'Download complete' : (parseInt(this.props.ratioLoaded * 100) + '%')}
|
||||||
<div>{ pauseLink }</div>
|
<div>{ pauseLink }</div>
|
||||||
<div>{ watchButton }</div>
|
<div>{ watchButton }</div>
|
||||||
|
{this.props.available ? null : <p><em>This file is uploading to Reflector. Reflector is a service that hosts a copy of the file on LBRY's servers so that it's available even if no one with the file is online.</em></p>}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -131,34 +132,91 @@ var MyFilesRow = React.createClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
var MyFilesPage = React.createClass({
|
var MyFilesPage = React.createClass({
|
||||||
fileTimeout: null,
|
_fileTimeout: null,
|
||||||
|
_fileInfoCheckNum: 0,
|
||||||
|
_filesOwnership: {},
|
||||||
|
|
||||||
getInitialState: function() {
|
getInitialState: function() {
|
||||||
return {
|
return {
|
||||||
filesInfo: null,
|
filesInfo: null,
|
||||||
|
filesOwnershipLoaded: false,
|
||||||
|
filesAvailable: {},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getDefaultProps: function() {
|
||||||
|
return {
|
||||||
|
show: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
document.title = "My Files";
|
document.title = "My Files";
|
||||||
},
|
},
|
||||||
componentWillMount: function() {
|
componentWillMount: function() {
|
||||||
|
this.getFilesOwnership();
|
||||||
this.updateFilesInfo();
|
this.updateFilesInfo();
|
||||||
},
|
},
|
||||||
componentWillUnmount: function() {
|
componentWillUnmount: function() {
|
||||||
if (this.fileTimeout)
|
if (this._fileTimeout)
|
||||||
{
|
{
|
||||||
clearTimeout(this.fileTimeout);
|
clearTimeout(this._fileTimeout);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getFilesOwnership: function() {
|
||||||
|
lbry.getFilesInfo((filesInfo) => {
|
||||||
|
var ownershipLoadedCount = 0;
|
||||||
|
for (let i = 0; i < filesInfo.length; i++) {
|
||||||
|
let fileInfo = filesInfo[i];
|
||||||
|
lbry.getMyClaim(fileInfo.lbry_uri, (claim) => {
|
||||||
|
this._filesOwnership[fileInfo.lbry_uri] = !!claim;
|
||||||
|
ownershipLoadedCount++;
|
||||||
|
if (ownershipLoadedCount >= filesInfo.length) {
|
||||||
|
this.setState({
|
||||||
|
filesOwnershipLoaded: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
updateFilesInfo: function() {
|
updateFilesInfo: function() {
|
||||||
lbry.getFilesInfo((filesInfo) => {
|
lbry.getFilesInfo((filesInfo) => {
|
||||||
|
if (!filesInfo) {
|
||||||
|
filesInfo = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(this._fileInfoCheckNum % 5)) {
|
||||||
|
// Time to update file availability status
|
||||||
|
|
||||||
|
for (let fileInfo of filesInfo) {
|
||||||
|
let name = fileInfo.lbry_uri;
|
||||||
|
|
||||||
|
lbry.search(name, (results) => {
|
||||||
|
var result = results[0];
|
||||||
|
|
||||||
|
var available = result.name == name && result.available;
|
||||||
|
|
||||||
|
if (typeof this.state.filesAvailable[name] === 'undefined' || available != this.state.filesAvailable[name]) {
|
||||||
|
var newFilesAvailable = Object.assign({}, this.state.filesAvailable);
|
||||||
|
newFilesAvailable[name] = available;
|
||||||
|
this.setState({
|
||||||
|
filesAvailable: newFilesAvailable,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._fileInfoCheckNum += 1;
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
filesInfo: (filesInfo ? filesInfo : []),
|
filesInfo: filesInfo,
|
||||||
});
|
});
|
||||||
this.fileTimeout = setTimeout(() => { this.updateFilesInfo() }, 1000);
|
|
||||||
|
this._fileTimeout = setTimeout(() => { this.updateFilesInfo() }, 1000);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
if (this.state.filesInfo === null) {
|
if (this.state.filesInfo === null || !this.state.filesOwnershipLoaded) {
|
||||||
return (
|
return (
|
||||||
<main className="page">
|
<main className="page">
|
||||||
<BusyMessage message="Loading" />
|
<BusyMessage message="Loading" />
|
||||||
|
@ -176,7 +234,8 @@ var MyFilesPage = React.createClass({
|
||||||
let {completed, written_bytes, total_bytes, lbry_uri, file_name, download_path,
|
let {completed, written_bytes, total_bytes, lbry_uri, file_name, download_path,
|
||||||
stopped, metadata} = fileInfo;
|
stopped, metadata} = fileInfo;
|
||||||
|
|
||||||
if (!metadata || seenUris[lbry_uri])
|
if (!metadata || seenUris[lbry_uri] || (this.props.show == 'downloaded' && this._filesOwnership[lbry_uri]) ||
|
||||||
|
(this.props.show == 'published' && !this._filesOwnership[lbry_uri]))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +260,8 @@ var MyFilesPage = React.createClass({
|
||||||
|
|
||||||
content.push(<MyFilesRow key={lbry_uri} lbryUri={lbry_uri} title={title || ('lbry://' + lbry_uri)} completed={completed} stopped={stopped}
|
content.push(<MyFilesRow key={lbry_uri} lbryUri={lbry_uri} title={title || ('lbry://' + lbry_uri)} completed={completed} stopped={stopped}
|
||||||
ratioLoaded={ratioLoaded} imgUrl={thumbnail} path={download_path}
|
ratioLoaded={ratioLoaded} imgUrl={thumbnail} path={download_path}
|
||||||
showWatchButton={showWatchButton} pending={pending} />);
|
showWatchButton={showWatchButton} pending={pending}
|
||||||
|
available={this.state.filesAvailable[lbry_uri]} />);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -86,11 +86,11 @@ var PublishPage = React.createClass({
|
||||||
|
|
||||||
console.log(publishArgs);
|
console.log(publishArgs);
|
||||||
lbry.publish(publishArgs, (message) => {
|
lbry.publish(publishArgs, (message) => {
|
||||||
this.handlePublishSuccess();
|
this.handlePublishStarted();
|
||||||
this.setState({
|
this.setState({
|
||||||
submitting: false,
|
submitting: false,
|
||||||
});
|
});
|
||||||
}, (error) => {
|
}, null, (error) => {
|
||||||
this.handlePublishError(error);
|
this.handlePublishError(error);
|
||||||
this.setState({
|
this.setState({
|
||||||
submitting: false,
|
submitting: false,
|
||||||
|
@ -131,10 +131,10 @@ var PublishPage = React.createClass({
|
||||||
submitting: false,
|
submitting: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
handlePublishSuccess: function() {
|
handlePublishStarted: function() {
|
||||||
alert(`Your file ${this.refs.meta_title.getValue()} has been published to LBRY at the address lbry://${this.state.name}!\n\n` +
|
alert(`Your file ${this.refs.meta_title.getValue()} has been published to LBRY at the address lbry://${this.state.name}!\n\n` +
|
||||||
`You will now be taken to your My Files page, where your newly published file will be listed. Your file will take a few minutes to appear for other LBRY users; until then it will be listed as "pending."`);
|
`You will now be taken to your My Files page, where your newly published file will be listed. Your file will take a few minutes to appear for other LBRY users; until then it will be listed as "pending."`);
|
||||||
window.location = "?files";
|
window.location = "?published";
|
||||||
},
|
},
|
||||||
handlePublishError: function(error) {
|
handlePublishError: function(error) {
|
||||||
alert(`The following error occurred when attempting to publish your file:\n\n` +
|
alert(`The following error occurred when attempting to publish your file:\n\n` +
|
||||||
|
|
Loading…
Reference in a new issue