var publishNumberStyle = { width: '50px', }, publishFieldLabelStyle = { display: 'inline-block', width: '118px', textAlign: 'right', verticalAlign: 'top', }, publishFieldStyle = { width: '330px', }; var PublishPage = React.createClass({ _requiredFields: ['name', 'file', 'bid', '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 = {}; metadata.fee[this.state.feeCurrency] = { amount: parseFloat(this.state.feeAmount), address: address, }; doPublish(); }); } else { doPublish(); } }, getInitialState: function() { this._tempFilePath = null; return { name: '', bid: '', feeAmount: '', feeCurrency: '', 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.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 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.getClaimInfo(name, (claimInfo) => { this.setState({ name: name, nameResolved: true, claimValue: parseFloat(claimInfo.amount), }); }); } }); }, handleBidChange: function(event) { this.setState({ bid: event.target.value, }); }, handleFeeAmountChange: function(event) { this.setState({ feeAmount: event.target.value, }); }, handleFeeCurrencyChange: function(event) { this.setState({ feeCurrency: 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?

If you choose to price this content in dollars, the number of credits charged will be adjusted based on the value of LBRY credits at the time of purchase.

Your Content

Additional Content Information (Optional)

); } });