var publishNumberStyle = { width: '50px', }, publishFieldLabelStyle = { display: 'inline-block', width: '118px', textAlign: 'right', verticalAlign: 'top', }, publishFieldStyle = { width: '330px', }; var PublishPage = React.createClass({ _requiredFields: ['name', 'file', 'meta_title', 'meta_author', 'meta_license', 'meta_description'], handleSubmit: function() { this.setState({ submitting: true, }); var missingFieldFound = false; for (let fieldName of this._requiredFields) { var field = this.refs[fieldName]; if (field.getValue() === '') { field.warnRequired(); if (!missingFieldFound) { field.focus(); missingFieldFound = true; } } } if (missingFieldFound) { this.setState({ submitting: false, }); return; } var metadata = {ver: '0.0.2'}; for (let metaField of ['title', 'author', 'description', 'thumbnail', 'license', 'license_url', 'language', 'nsfw']) { var value = this.refs['meta_' + metaField].getValue(); if (value === '') { metadata[metaField] = value; } } /* metadata.license = {}; metadata.license.name = this.refs.meta_license.getValue(); var licenseUrl = this.refs.meta_license_url.getValue(); if (licenseUrl != '') { metadata.license.url = licenseUrl; } */ var licenseUrl = this.refs.meta_license_url.getValue(); if (licenseUrl) { metadata.license_url = licenseUrl; } var doPublish = () => { console.log({name: this.state.name, file_path: this._tempFilePath, bid: parseFloat(this.state.bid), metadata: metadata, }); lbry.publish({ name: this.state.name, file_path: this._tempFilePath, bid: parseFloat(this.state.bid), metadata: metadata, }, (message) => { this.handlePublishSuccess(); this.setState({ submitting: false, }); }, (error) => { this.handlePublishError(error); this.setState({ submitting: false, }); }); }; if (this.state.isFee) { lbry.getNewAddress((address) => { metadata.fee = { 'LBC': { amount: parseFloat(this.state.fee), address: address, }, }; doPublish(); }); } else { doPublish(); } }, getInitialState: function() { this._tempFilePath = null; return { name: '', bid: '', nameResolved: false, claimValue: 0.0, fileInfo: null, uploadProgress: 0.0, uploaded: false, tempFileReady: false, submitting: false, }; }, handlePublishSuccess: function() { alert(`Your file ${this.refs.meta_title.value} 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 should appear within a few minutes.`); window.location = "?files"; }, handlePublishError: function(error) { alert(`The following error occurred when attempting to publish your file:\n\n` + error.message); }, handleNameChange: function(event) { var name = event.target.value; if (!name) { this.setState({ name: '', nameResolved: false, }); return; } lbry.resolveName(name, (info) => { if (!info) { this.setState({ name: name, nameResolved: false, }); } else { lbry.search(name, (results) => { var claimValue = results[0].value; this.setState({ name: name, nameResolved: true, claimValue: parseFloat(claimValue), }); }); } }); }, handleBidChange: function(event) { this.setState({ bid: event.target.value, }); }, handleFeeChange: function(event) { this.setState({ fee: event.target.value, }); }, handleFileChange: function(event) { event.preventDefault(); var fileInput = event.target; this._tempFilePath = null; if (fileInput.files.length == 0) { // File was removed this.setState({ fileInfo: null, uploadProgress: 0.0, uploaded: false, tempFileReady: false, }); } else { var file = fileInput.files[0]; this.setState({ fileInfo: { name: file.name, size: file.size, }, uploadProgress: 0.0, uploaded: false, tempFileReady: false, }); var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', (event) => { this.setState({ uploadProgress: (event.loaded / event.total), }); }); xhr.upload.addEventListener('load', (event) => { this.setState({ uploaded: true, }); }); xhr.addEventListener('load', (event) => { this._tempFilePath = JSON.parse(xhr.responseText); this.setState({ tempFileReady: true, }); }) xhr.open('POST', '/upload', true); xhr.send(new FormData(fileInput.form)); } }, handleFeePrefChange: function(feeEnabled) { this.setState({ isFee: feeEnabled }); }, readyToPublish: function() { var bidFloat = parseFloat(this.state.bid); return (this.state.name && this.state.fileInfo && !isNaN(bidFloat) && (!this.state.claimValue || bidFloat > this.state.claimValue)); }, componentDidUpdate: function() { if (this.state.fileInfo && !this.state.tempFileReady) { // A file was chosen but the daemon hasn't finished processing it yet, i.e. it's loading, so // we're displaying a progress bar and need a value for it. // React can't unset the "value" prop (to show an "indeterminate" bar) after it's already // been set, so we have to manage it manually. if (!this.state.uploaded) { // Still uploading this.refs.progress.setAttribute('value', this.state.uploadProgress); } else { // Fully uploaded and waiting for server to finish processing, so set progress bar to "indeterminite" this.refs.progress.removeAttribute('value'); } } }, render: function() { return (

Publish Content

LBRY Name

lbry:// { (!this.state.name ? '' : (this.state.nameResolved ? This name is currently claimed for {lbry.formatCredits(this.state.claimValue)} credits : This name is available)) }
What LBRY name would you like to claim for this file?

Choose File

{ !this.state.fileInfo ? '' : (!this.state.tempFileReady ?
{!this.state.uploaded ? Importing file into LBRY... : Processing file...}
:
File ready for publishing!
) }

Bid Amount

Credits
How much would you like to bid for this name? { !this.state.nameResolved ? Since this name is not currently resolved, you may bid as low as you want, but higher bids help prevent others from claiming your name. : You must bid over {lbry.formatCredits(this.state.claimValue)} credits to claim this name. }

Fee

How much would you like to charge for this file?

Your Content

Additional Content Information (Optional)

); } });