2017-06-06 23:19:12 +02:00
import React from "react" ;
import lbry from "lbry" ;
import lbryuri from "lbryuri" ;
import { FormField , FormRow } from "component/form.js" ;
import Link from "component/link" ;
import rewards from "rewards" ;
import Modal from "component/modal" ;
2016-11-22 21:19:08 +01:00
2017-06-08 06:42:19 +02:00
class PublishPage extends React . PureComponent {
2017-05-17 10:10:25 +02:00
constructor ( props ) {
super ( props ) ;
2016-07-26 12:09:09 +02:00
2017-06-06 23:19:12 +02:00
this . _requiredFields = [ "meta_title" , "name" , "bid" , "tos_agree" ] ;
2017-05-17 10:10:25 +02:00
this . state = {
channels : null ,
2017-06-06 23:19:12 +02:00
rawName : "" ,
name : "" ,
2017-05-17 10:10:25 +02:00
bid : 10 ,
hasFile : false ,
2017-06-06 23:19:12 +02:00
feeAmount : "" ,
feeCurrency : "USD" ,
channel : "anonymous" ,
newChannelName : "@" ,
2017-05-17 10:10:25 +02:00
newChannelBid : 10 ,
nameResolved : null ,
myClaimExists : null ,
topClaimValue : 0.0 ,
myClaimValue : 0.0 ,
myClaimMetadata : null ,
2017-06-06 23:19:12 +02:00
copyrightNotice : "" ,
otherLicenseDescription : "" ,
otherLicenseUrl : "" ,
2017-05-17 10:10:25 +02:00
uploadProgress : 0.0 ,
uploaded : false ,
errorMessage : null ,
submitting : false ,
creatingChannel : false ,
modal : null ,
} ;
}
_updateChannelList ( channel ) {
2017-04-10 10:06:15 +02:00
// Calls API to update displayed list of channels. If a channel name is provided, will select
// that channel at the same time (used immediately after creating a channel)
2017-06-06 23:19:12 +02:00
lbry . channel _list _mine ( ) . then ( channels => {
2017-06-08 23:15:34 +02:00
this . props . claimFirstChannelReward ( ) ;
2017-04-10 10:06:15 +02:00
this . setState ( {
channels : channels ,
2017-06-06 23:19:12 +02:00
... ( channel ? { channel } : { } ) ,
2017-04-10 10:06:15 +02:00
} ) ;
} ) ;
2017-05-17 10:10:25 +02:00
}
handleSubmit ( event ) {
2017-06-06 23:19:12 +02:00
if ( typeof event !== "undefined" ) {
2016-10-19 08:36:42 +02:00
event . preventDefault ( ) ;
}
2016-07-21 08:58:06 +02:00
this . setState ( {
submitting : true ,
} ) ;
2017-04-12 16:55:19 +02:00
let checkFields = this . _requiredFields ;
2016-09-17 07:45:42 +02:00
if ( ! this . state . myClaimExists ) {
2017-06-06 23:19:12 +02:00
checkFields . unshift ( "file" ) ;
2016-08-08 11:53:41 +02:00
}
2017-04-12 16:55:19 +02:00
let missingFieldFound = false ;
2016-08-08 11:53:41 +02:00
for ( let fieldName of checkFields ) {
2017-04-12 16:55:19 +02:00
const field = this . refs [ fieldName ] ;
if ( field ) {
2017-06-06 23:19:12 +02:00
if ( field . getValue ( ) === "" || field . getValue ( ) === false ) {
2017-04-12 16:55:19 +02:00
field . showRequiredError ( ) ;
if ( ! missingFieldFound ) {
field . focus ( ) ;
missingFieldFound = true ;
}
} else {
field . clearError ( ) ;
2016-07-26 12:09:09 +02:00
}
}
}
2017-02-08 20:11:58 +01:00
if ( missingFieldFound ) {
2016-07-26 12:09:09 +02:00
this . setState ( {
submitting : false ,
} ) ;
2016-07-27 13:46:48 +02:00
return ;
2016-07-26 12:09:09 +02:00
}
2016-07-20 08:25:22 +02:00
2016-08-23 07:03:03 +02:00
if ( this . state . nameIsMine ) {
// Pre-populate with existing metadata
2016-09-17 07:45:42 +02:00
var metadata = Object . assign ( { } , this . state . myClaimMetadata ) ;
2017-06-06 23:19:12 +02:00
if ( this . refs . file . getValue ( ) !== "" ) {
2016-08-23 07:03:03 +02:00
delete metadata . sources ;
}
} else {
var metadata = { } ;
}
2016-08-27 08:18:19 +02:00
2017-06-06 23:19:12 +02:00
for ( let metaField of [
"title" ,
"description" ,
"thumbnail" ,
"license" ,
"license_url" ,
"language" ,
] ) {
var value = this . refs [ "meta_" + metaField ] . getValue ( ) ;
if ( value !== "" ) {
2016-07-26 12:09:09 +02:00
metadata [ metaField ] = value ;
}
}
2017-05-23 21:51:47 +02:00
metadata . nsfw = parseInt ( this . refs . meta _nsfw . getValue ( ) ) === 1 ;
2017-04-13 22:40:29 +02:00
const licenseUrl = this . refs . meta _license _url . getValue ( ) ;
2016-07-27 17:57:18 +02:00
if ( licenseUrl ) {
metadata . license _url = licenseUrl ;
}
2016-07-20 08:25:22 +02:00
2016-07-21 08:58:06 +02:00
var doPublish = ( ) => {
2016-08-08 11:53:41 +02:00
var publishArgs = {
name : this . state . name ,
2016-07-21 08:58:06 +02:00
bid : parseFloat ( this . state . bid ) ,
metadata : metadata ,
2017-06-06 23:19:12 +02:00
... ( this . state . channel != "new" && this . state . channel != "anonymous"
? { channel _name : this . state . channel }
: { } ) ,
2016-08-08 11:53:41 +02:00
} ;
2017-06-06 23:19:12 +02:00
if ( this . refs . file . getValue ( ) !== "" ) {
publishArgs . file _path = this . refs . file . getValue ( ) ;
2016-08-08 11:53:41 +02:00
}
2017-04-10 14:32:40 +02:00
2017-06-15 02:21:31 +02:00
lbry . publishDeprecated (
2017-06-06 23:19:12 +02:00
publishArgs ,
message => {
this . handlePublishStarted ( ) ;
} ,
null ,
error => {
this . handlePublishError ( error ) ;
}
) ;
2016-07-21 08:58:06 +02:00
} ;
2016-07-20 08:25:22 +02:00
if ( this . state . isFee ) {
2017-06-06 23:19:12 +02:00
lbry . wallet _unused _address ( ) . then ( address => {
2017-06-06 17:14:08 +02:00
metadata . fee = {
currency : this . state . feeCurrency ,
2016-07-30 07:47:37 +02:00
amount : parseFloat ( this . state . feeAmount ) ,
address : address ,
2016-07-21 08:58:06 +02:00
} ;
2016-07-20 08:25:22 +02:00
2016-07-21 08:58:06 +02:00
doPublish ( ) ;
} ) ;
} else {
doPublish ( ) ;
}
2017-05-17 10:10:25 +02:00
}
handlePublishStarted ( ) {
2016-10-21 09:56:37 +02:00
this . setState ( {
2017-06-06 23:19:12 +02:00
modal : "publishStarted" ,
2016-10-21 09:56:37 +02:00
} ) ;
2017-05-17 10:10:25 +02:00
}
handlePublishStartedConfirmed ( ) {
2017-06-06 23:19:12 +02:00
this . props . navigate ( "/published" ) ;
2017-05-17 10:10:25 +02:00
}
handlePublishError ( error ) {
2016-10-21 09:56:37 +02:00
this . setState ( {
submitting : false ,
2017-06-06 23:19:12 +02:00
modal : "error" ,
2016-10-21 09:56:37 +02:00
errorMessage : error . message ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleNameChange ( event ) {
2016-09-01 09:30:12 +02:00
var rawName = event . target . value ;
2016-07-15 14:04:47 +02:00
2016-09-01 09:30:12 +02:00
if ( ! rawName ) {
2016-07-15 14:04:47 +02:00
this . setState ( {
2017-06-06 23:19:12 +02:00
rawName : "" ,
name : "" ,
2016-07-15 14:04:47 +02:00
nameResolved : false ,
2016-07-20 08:25:22 +02:00
} ) ;
2016-07-15 14:04:47 +02:00
return ;
}
2017-05-19 01:14:26 +02:00
if ( ! lbryuri . isValidName ( rawName , false ) ) {
2017-06-06 23:19:12 +02:00
this . refs . name . showError (
_ _ ( "LBRY names must contain only letters, numbers and dashes." )
) ;
2016-11-18 10:01:25 +01:00
return ;
}
2017-04-14 19:44:06 +02:00
const name = rawName . toLowerCase ( ) ;
2016-11-18 09:49:16 +01:00
this . setState ( {
rawName : rawName ,
2017-04-14 19:44:06 +02:00
name : name ,
nameResolved : null ,
myClaimExists : null ,
2016-11-18 09:49:16 +01:00
} ) ;
2017-06-06 23:19:12 +02:00
const myClaimInfo = Object . values ( this . props . myClaims ) . find (
claim => claim . name === name
) ;
2017-05-19 01:14:26 +02:00
this . setState ( {
myClaimExists : ! ! myClaimInfo ,
} ) ;
2017-06-06 23:19:12 +02:00
lbry . resolve ( { uri : name } ) . then (
claimInfo => {
if ( name != this . state . name ) {
return ;
}
2017-04-14 19:44:06 +02:00
2017-06-06 23:19:12 +02:00
if ( ! claimInfo ) {
this . setState ( {
nameResolved : false ,
} ) ;
} else {
const topClaimIsMine =
myClaimInfo && myClaimInfo . amount >= claimInfo . amount ;
const newState = {
nameResolved : true ,
topClaimValue : parseFloat ( claimInfo . amount ) ,
myClaimExists : ! ! myClaimInfo ,
myClaimValue : myClaimInfo ? parseFloat ( myClaimInfo . amount ) : null ,
myClaimMetadata : myClaimInfo ? myClaimInfo . value : null ,
topClaimIsMine : topClaimIsMine ,
} ;
if ( topClaimIsMine ) {
newState . bid = myClaimInfo . amount ;
} else if ( this . state . myClaimMetadata ) {
// Just changed away from a name we have a claim on, so clear pre-fill
newState . bid = "" ;
}
this . setState ( newState ) ;
}
} ,
( ) => {
// Assume an error means the name is available
2017-04-11 06:12:34 +02:00
this . setState ( {
2017-06-06 23:19:12 +02:00
name : name ,
2017-04-11 06:12:34 +02:00
nameResolved : false ,
2017-06-06 23:19:12 +02:00
myClaimExists : false ,
2016-07-15 14:04:47 +02:00
} ) ;
2017-05-19 01:14:26 +02:00
}
2017-06-06 23:19:12 +02:00
) ;
2017-05-17 10:10:25 +02:00
}
handleBidChange ( event ) {
2016-07-15 14:04:47 +02:00
this . setState ( {
2016-07-20 08:25:22 +02:00
bid : event . target . value ,
2016-07-15 14:04:47 +02:00
} ) ;
2017-05-17 10:10:25 +02:00
}
handleFeeAmountChange ( event ) {
2016-07-15 14:04:47 +02:00
this . setState ( {
2016-07-30 07:47:37 +02:00
feeAmount : event . target . value ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleFeeCurrencyChange ( event ) {
2016-07-30 07:47:37 +02:00
this . setState ( {
feeCurrency : event . target . value ,
2016-07-20 08:25:22 +02:00
} ) ;
2017-05-17 10:10:25 +02:00
}
handleFeePrefChange ( feeEnabled ) {
2016-07-20 08:25:22 +02:00
this . setState ( {
2017-06-06 23:19:12 +02:00
isFee : feeEnabled ,
2016-07-15 14:04:47 +02:00
} ) ;
2017-05-17 10:10:25 +02:00
}
handleLicenseChange ( event ) {
2017-06-06 23:19:12 +02:00
var licenseType = event . target . options [
event . target . selectedIndex
] . getAttribute ( "data-license-type" ) ;
2016-09-20 12:40:24 +02:00
var newState = {
2017-06-06 23:19:12 +02:00
copyrightChosen : licenseType == "copyright" ,
otherLicenseChosen : licenseType == "other" ,
2016-09-20 12:40:24 +02:00
} ;
2017-06-06 23:19:12 +02:00
if ( licenseType == "copyright" ) {
newState . copyrightNotice = _ _ ( "All rights reserved." ) ;
2016-09-20 12:40:24 +02:00
}
this . setState ( newState ) ;
2017-05-17 10:10:25 +02:00
}
handleCopyrightNoticeChange ( event ) {
2016-09-20 12:40:24 +02:00
this . setState ( {
copyrightNotice : event . target . value ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleOtherLicenseDescriptionChange ( event ) {
2016-09-20 12:40:24 +02:00
this . setState ( {
otherLicenseDescription : event . target . value ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleOtherLicenseUrlChange ( event ) {
2016-09-20 12:40:24 +02:00
this . setState ( {
otherLicenseUrl : event . target . value ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleChannelChange ( event ) {
2017-04-08 14:30:17 +02:00
const channel = event . target . value ;
this . setState ( {
channel : channel ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleNewChannelNameChange ( event ) {
2017-06-06 23:19:12 +02:00
const newChannelName = event . target . value . startsWith ( "@" )
? event . target . value
: "@" + event . target . value ;
if (
newChannelName . length > 1 &&
! lbryuri . isValidName ( newChannelName . substr ( 1 ) , false )
) {
this . refs . newChannelName . showError (
_ _ ( "LBRY channel names must contain only letters, numbers and dashes." )
) ;
2017-04-08 14:30:17 +02:00
return ;
2017-04-12 16:55:19 +02:00
} else {
2017-06-06 23:19:12 +02:00
this . refs . newChannelName . clearError ( ) ;
2017-04-08 14:30:17 +02:00
}
this . setState ( {
newChannelName : newChannelName ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleNewChannelBidChange ( event ) {
2017-04-08 14:30:17 +02:00
this . setState ( {
newChannelBid : event . target . value ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleTOSChange ( event ) {
2017-04-14 01:39:59 +02:00
this . setState ( {
TOSAgreed : event . target . checked ,
} ) ;
2017-05-17 10:10:25 +02:00
}
handleCreateChannelClick ( event ) {
2017-04-10 10:08:43 +02:00
if ( this . state . newChannelName . length < 5 ) {
2017-06-06 23:19:12 +02:00
this . refs . newChannelName . showError (
_ _ ( "LBRY channel names must be at least 4 characters in length." )
) ;
2017-04-10 10:08:43 +02:00
return ;
}
2017-04-08 14:30:17 +02:00
this . setState ( {
creatingChannel : true ,
} ) ;
2017-04-10 10:06:15 +02:00
const newChannelName = this . state . newChannelName ;
2017-06-06 23:19:12 +02:00
lbry
. channel _new ( {
channel _name : newChannelName ,
2017-06-09 01:25:42 +02:00
amount : parseFloat ( this . state . newChannelBid ) ,
2017-06-06 23:19:12 +02:00
} )
. then (
( ) => {
setTimeout ( ( ) => {
this . setState ( {
creatingChannel : false ,
} ) ;
this . _updateChannelList ( newChannelName ) ;
} , 5000 ) ;
} ,
error => {
// TODO: better error handling
this . refs . newChannelName . showError (
_ _ ( "Unable to create channel due to an internal error." )
) ;
this . setState ( {
creatingChannel : false ,
} ) ;
}
) ;
2017-05-17 10:10:25 +02:00
}
getLicenseUrl ( ) {
2016-09-20 12:40:24 +02:00
if ( ! this . refs . meta _license ) {
2017-06-06 23:19:12 +02:00
return "" ;
2016-09-20 12:40:24 +02:00
} else if ( this . state . otherLicenseChosen ) {
return this . state . otherLicenseUrl ;
} else {
2017-06-06 23:19:12 +02:00
return (
this . refs . meta _license . getSelectedElement ( ) . getAttribute ( "data-url" ) ||
""
) ;
2016-09-20 12:40:24 +02:00
}
2017-05-17 10:10:25 +02:00
}
componentWillMount ( ) {
2017-06-09 12:38:18 +02:00
this . props . fetchClaimListMine ( ) ;
2017-04-10 10:06:15 +02:00
this . _updateChannelList ( ) ;
2017-05-17 10:10:25 +02:00
}
onFileChange ( ) {
2017-04-10 20:12:07 +02:00
if ( this . refs . file . getValue ( ) ) {
2017-06-06 23:19:12 +02:00
this . setState ( { hasFile : true } ) ;
2017-04-10 20:12:07 +02:00
} else {
2017-06-06 23:19:12 +02:00
this . setState ( { hasFile : false } ) ;
2017-04-10 20:12:07 +02:00
}
2017-05-17 10:10:25 +02:00
}
getNameBidHelpText ( ) {
2017-04-10 20:12:07 +02:00
if ( ! this . state . name ) {
2017-05-22 14:29:30 +02:00
return _ _ ( "Select a URL for this publish." ) ;
2017-04-14 19:44:06 +02:00
} else if ( this . state . nameResolved === false ) {
2017-05-22 14:29:30 +02:00
return _ _ ( "This URL is unused." ) ;
2017-04-10 20:12:07 +02:00
} else if ( this . state . myClaimExists ) {
2017-06-06 23:19:12 +02:00
return _ _ (
"You have already used this URL. Publishing to it again will update your previous publish."
) ;
2017-04-10 20:12:07 +02:00
} else if ( this . state . topClaimValue ) {
2017-06-19 14:58:39 +02:00
if ( this . state . topClaimValue === 1 ) {
return (
< span >
{ _ _ (
2017-06-20 14:08:52 +02:00
'A deposit of at least one credit is required to win "%s". However, you can still get a permanent URL for any amount.' ,
this . state . name
2017-06-19 14:58:39 +02:00
) }
< / span >
) ;
} else {
return (
< span >
{ _ _ (
2017-06-20 14:08:52 +02:00
'A deposit of at least "%s" credits is required to win "%s". However, you can still get a permanent URL for any amount.' ,
this . state . topClaimValue ,
this . state . name
2017-06-19 14:58:39 +02:00
) }
< / span >
) ;
}
2017-04-10 20:12:07 +02:00
} else {
2017-06-06 23:19:12 +02:00
return "" ;
2017-04-10 20:12:07 +02:00
}
2017-05-17 10:10:25 +02:00
}
closeModal ( ) {
2017-04-12 16:55:19 +02:00
this . setState ( {
modal : null ,
} ) ;
2017-05-17 10:10:25 +02:00
}
render ( ) {
2017-04-08 14:30:17 +02:00
if ( this . state . channels === null ) {
return null ;
}
2017-06-06 23:19:12 +02:00
const lbcInputHelp = _ _ (
"This LBC remains yours and the deposit can be undone at any time."
) ;
2017-04-12 16:55:19 +02:00
2016-05-23 17:14:21 +02:00
return (
2017-05-01 02:15:21 +02:00
< main className = "main--single-column" >
2017-06-06 23:19:12 +02:00
< form
onSubmit = { event => {
this . handleSubmit ( event ) ;
} }
>
2016-10-19 04:30:57 +02:00
< section className = "card" >
2017-04-10 14:32:40 +02:00
< div className = "card__title-primary" >
2017-05-22 14:29:30 +02:00
< h4 > { _ _ ( "Content" ) } < / h4 >
2017-04-10 20:12:07 +02:00
< div className = "card__subtitle" >
2017-05-22 14:29:30 +02:00
{ _ _ ( "What are you publishing?" ) }
2017-04-10 20:12:07 +02:00
< / div >
2017-04-10 14:32:40 +02:00
< / div >
< div className = "card__content" >
2017-06-06 23:19:12 +02:00
< FormRow
name = "file"
label = "File"
ref = "file"
type = "file"
onChange = { event => {
this . onFileChange ( event ) ;
} }
helper = {
this . state . myClaimExists
? _ _ (
"If you don't choose a file, the file from your existing claim will be used."
)
: null
}
/ >
2016-10-19 04:30:57 +02:00
< / div >
2017-06-06 23:19:12 +02:00
{ ! this . state . hasFile
? ""
: < div >
< div className = "card__content" >
< FormRow
label = { _ _ ( "Title" ) }
type = "text"
ref = "meta_title"
name = "title"
placeholder = { _ _ ( "Title" ) }
/ >
< / div >
< div className = "card__content" >
< FormRow
type = "text"
label = { _ _ ( "Thumbnail URL" ) }
ref = "meta_thumbnail"
name = "thumbnail"
placeholder = "http://spee.ch/mylogo"
/ >
< / div >
< div className = "card__content" >
< FormRow
label = { _ _ ( "Description" ) }
type = "textarea"
ref = "meta_description"
name = "description"
placeholder = { _ _ ( "Description of your content" ) }
/ >
< / div >
< div className = "card__content" >
< FormRow
label = { _ _ ( "Language" ) }
type = "select"
defaultValue = "en"
ref = "meta_language"
name = "language"
>
< option value = "en" > { _ _ ( "English" ) } < / option >
< option value = "zh" > { _ _ ( "Chinese" ) } < / option >
< option value = "fr" > { _ _ ( "French" ) } < / option >
< option value = "de" > { _ _ ( "German" ) } < / option >
< option value = "jp" > { _ _ ( "Japanese" ) } < / option >
< option value = "ru" > { _ _ ( "Russian" ) } < / option >
< option value = "es" > { _ _ ( "Spanish" ) } < / option >
< / FormRow >
< / div >
< div className = "card__content" >
< FormRow
type = "select"
label = { _ _ ( "Maturity" ) }
defaultValue = "en"
ref = "meta_nsfw"
name = "nsfw"
>
{ /* <option value=""></option> */ }
< option value = "0" > { _ _ ( "All Ages" ) } < / option >
< option value = "1" > { _ _ ( "Adults Only" ) } < / option >
< / FormRow >
< / div >
< / div > }
2016-10-19 04:30:57 +02:00
< / section >
2016-05-23 17:14:21 +02:00
2017-04-08 14:30:17 +02:00
< section className = "card" >
2017-04-10 20:12:07 +02:00
< div className = "card__title-primary" >
2017-05-22 14:29:30 +02:00
< h4 > { _ _ ( "Access" ) } < / h4 >
2017-04-10 20:12:07 +02:00
< div className = "card__subtitle" >
2017-05-22 14:29:30 +02:00
{ _ _ ( "How much does this content cost?" ) }
2017-04-10 20:12:07 +02:00
< / div >
2017-04-08 14:30:17 +02:00
< / div >
2017-04-10 14:32:40 +02:00
< div className = "card__content" >
2017-04-10 20:12:07 +02:00
< div className = "form-row__label-row" >
2017-05-22 14:29:30 +02:00
< label className = "form-row__label" > { _ _ ( "Price" ) } < / label >
2016-10-19 04:30:57 +02:00
< / div >
2017-06-06 23:19:12 +02:00
< FormRow
label = { _ _ ( "Free" ) }
type = "radio"
name = "isFree"
value = "1"
onChange = { ( ) => {
this . handleFeePrefChange ( false ) ;
} }
defaultChecked = { ! this . state . isFee }
/ >
< FormField
type = "radio"
name = "isFree"
label = { ! this . state . isFee ? _ _ ( "Choose price..." ) : _ _ ( "Price " ) }
onChange = { ( ) => {
this . handleFeePrefChange ( true ) ;
} }
defaultChecked = { this . state . isFee }
/ >
< span className = { ! this . state . isFee ? "hidden" : "" } >
< FormField
type = "number"
className = "form-field__input--inline"
step = "0.01"
placeholder = "1.00"
2017-06-09 01:25:42 +02:00
min = "0.01"
2017-06-06 23:19:12 +02:00
onChange = { event => this . handleFeeAmountChange ( event ) }
/ >
{ " " }
< FormField
type = "select"
onChange = { event => {
this . handleFeeCurrencyChange ( event ) ;
} }
>
< option value = "USD" > { _ _ ( "US Dollars" ) } < / option >
< option value = "LBC" > { _ _ ( "LBRY credits" ) } < / option >
< / FormField >
< / span >
{ this . state . isFee
? < div className = "form-field__helper" >
{ _ _ (
"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."
) }
< / div >
: "" }
< FormRow
label = "License"
type = "select"
ref = "meta_license"
name = "license"
onChange = { event => {
this . handleLicenseChange ( event ) ;
} }
>
< option / >
2017-05-22 14:29:30 +02:00
< option > { _ _ ( "Public Domain" ) } < / option >
2017-06-06 23:19:12 +02:00
< option data - url = "https://creativecommons.org/licenses/by/4.0/legalcode" >
{ _ _ ( "Creative Commons Attribution 4.0 International" ) }
< / option >
< option data - url = "https://creativecommons.org/licenses/by-sa/4.0/legalcode" >
{ _ _ (
"Creative Commons Attribution-ShareAlike 4.0 International"
) }
< / option >
< option data - url = "https://creativecommons.org/licenses/by-nd/4.0/legalcode" >
{ _ _ (
"Creative Commons Attribution-NoDerivatives 4.0 International"
) }
< / option >
< option data - url = "https://creativecommons.org/licenses/by-nc/4.0/legalcode" >
{ _ _ (
"Creative Commons Attribution-NonCommercial 4.0 International"
) }
< / option >
< option data - url = "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" >
{ _ _ (
"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International"
) }
< / option >
< option data - url = "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" >
{ _ _ (
"Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International"
) }
< / option >
< option
data - license - type = "copyright"
{ ... ( this . state . copyrightChosen
? { value : this . state . copyrightNotice }
: { } ) }
>
{ _ _ ( "Copyrighted..." ) }
< / option >
< option
data - license - type = "other"
{ ... ( this . state . otherLicenseChosen
? { value : this . state . otherLicenseDescription }
: { } ) }
>
{ _ _ ( "Other..." ) }
< / option >
2017-04-10 20:12:07 +02:00
< / FormRow >
2017-06-06 23:19:12 +02:00
< FormField
type = "hidden"
ref = "meta_license_url"
name = "license_url"
value = { this . getLicenseUrl ( ) }
/ >
2017-04-10 20:12:07 +02:00
{ this . state . copyrightChosen
2017-06-06 23:19:12 +02:00
? < FormRow
label = { _ _ ( "Copyright notice" ) }
type = "text"
name = "copyright-notice"
value = { this . state . copyrightNotice }
onChange = { event => {
this . handleCopyrightNoticeChange ( event ) ;
} }
/ >
2017-04-10 20:12:07 +02:00
: null }
2017-06-06 23:19:12 +02:00
{ this . state . otherLicenseChosen
? < FormRow
label = { _ _ ( "License description" ) }
type = "text"
name = "other-license-description"
onChange = { event => {
this . handleOtherLicenseDescriptionChange ( ) ;
} }
/ >
2017-04-10 20:12:07 +02:00
: null }
2017-06-06 23:19:12 +02:00
{ this . state . otherLicenseChosen
? < FormRow
label = { _ _ ( "License URL" ) }
type = "text"
name = "other-license-url"
onChange = { event => {
this . handleOtherLicenseUrlChange ( event ) ;
} }
/ >
2017-04-10 20:12:07 +02:00
: null }
2016-08-08 05:31:21 +02:00
< / div >
2016-10-19 04:30:57 +02:00
< / section >
< section className = "card" >
2017-04-10 20:12:07 +02:00
< div className = "card__title-primary" >
2017-05-22 14:29:30 +02:00
< h4 > { _ _ ( "Identity" ) } < / h4 >
2017-04-10 20:12:07 +02:00
< div className = "card__subtitle" >
2017-05-22 14:29:30 +02:00
{ _ _ ( "Who created this content?" ) }
2016-10-19 04:30:57 +02:00
< / div >
2016-08-08 05:31:21 +02:00
< / div >
2017-04-10 20:12:07 +02:00
< div className = "card__content" >
2017-06-06 23:19:12 +02:00
< FormRow
type = "select"
tabIndex = "1"
onChange = { event => {
this . handleChannelChange ( event ) ;
} }
value = { this . state . channel }
>
< option key = "anonymous" value = "anonymous" >
{ _ _ ( "Anonymous" ) }
< / option >
{ this . state . channels . map ( ( { name } ) =>
< option key = { name } value = { name } > { name } < / option >
) }
2017-05-22 14:29:30 +02:00
< option key = "new" value = "new" > { _ _ ( "New identity..." ) } < / option >
2017-04-10 20:12:07 +02:00
< / FormRow >
2016-10-19 04:30:57 +02:00
< / div >
2017-06-06 23:19:12 +02:00
{ this . state . channel == "new"
? < div className = "card__content" >
< FormRow
label = { _ _ ( "Name" ) }
type = "text"
onChange = { event => {
this . handleNewChannelNameChange ( event ) ;
} }
ref = { newChannelName => {
this . refs . newChannelName = newChannelName ;
} }
value = { this . state . newChannelName }
/ >
< FormRow
label = { _ _ ( "Deposit" ) }
2017-06-19 14:58:39 +02:00
postfix = { _ _ ( "LBC" ) }
2017-06-06 23:19:12 +02:00
step = "0.01"
2017-06-09 01:25:42 +02:00
min = "0"
2017-06-06 23:19:12 +02:00
type = "number"
helper = { lbcInputHelp }
onChange = { event => {
this . handleNewChannelBidChange ( event ) ;
} }
value = { this . state . newChannelBid }
/ >
< div className = "form-row-submit" >
< Link
button = "primary"
label = {
! this . state . creatingChannel
? _ _ ( "Create identity" )
: _ _ ( "Creating identity..." )
}
onClick = { event => {
this . handleCreateChannelClick ( event ) ;
} }
disabled = { this . state . creatingChannel }
/ >
< / div >
2016-10-19 04:30:57 +02:00
< / div >
: null }
< / section >
2016-07-20 08:25:22 +02:00
2016-10-19 04:30:57 +02:00
< section className = "card" >
2017-04-10 20:12:07 +02:00
< div className = "card__title-primary" >
2017-05-22 14:29:30 +02:00
< h4 > { _ _ ( "Address" ) } < / h4 >
2017-06-06 23:19:12 +02:00
< div className = "card__subtitle" >
{ _ _ ( "Where should this content permanently reside?" ) }
{ " " }
< Link
label = { _ _ ( "Read more" ) }
href = "https://lbry.io/faq/naming"
/ > .
< / div >
2017-04-10 20:12:07 +02:00
< / div >
< div className = "card__content" >
2017-06-06 23:19:12 +02:00
< FormRow
prefix = "lbry://"
type = "text"
ref = "name"
placeholder = "myname"
value = { this . state . rawName }
onChange = { event => {
this . handleNameChange ( event ) ;
} }
helper = { this . getNameBidHelpText ( ) }
/ >
2016-10-19 04:30:57 +02:00
< / div >
2017-06-06 23:19:12 +02:00
{ this . state . rawName
? < div className = "card__content" >
< FormRow
ref = "bid"
type = "number"
step = "0.01"
label = { _ _ ( "Deposit" ) }
postfix = "LBC"
onChange = { event => {
this . handleBidChange ( event ) ;
} }
value = { this . state . bid }
placeholder = {
this . state . nameResolved
? this . state . topClaimValue + 10
: 100
}
helper = { lbcInputHelp }
/ >
< / div >
: "" }
2016-10-19 04:30:57 +02:00
< / section >
2016-05-23 17:14:21 +02:00
2017-04-14 01:39:59 +02:00
< section className = "card" >
< div className = "card__title-primary" >
2017-05-22 14:29:30 +02:00
< h4 > { _ _ ( "Terms of Service" ) } < / h4 >
2017-04-14 01:39:59 +02:00
< / div >
< div className = "card__content" >
2017-06-06 23:19:12 +02:00
< FormRow
label = {
< span >
{ _ _ ( "I agree to the" ) }
{ " " }
< Link
href = "https://www.lbry.io/termsofservice"
label = { _ _ ( "LBRY terms of service" ) }
checked = { this . state . TOSAgreed }
/ >
< / span >
}
type = "checkbox"
name = "tos_agree"
ref = { field => {
this . refs . tos _agree = field ;
} }
onChange = { event => {
this . handleTOSChange ( event ) ;
} }
/ >
2017-04-14 01:39:59 +02:00
< / div >
< / section >
2016-10-19 04:30:57 +02:00
< div className = "card-series-submit" >
2017-06-06 23:19:12 +02:00
< Link
button = "primary"
label = {
! this . state . submitting ? _ _ ( "Publish" ) : _ _ ( "Publishing..." )
}
onClick = { event => {
this . handleSubmit ( event ) ;
} }
disabled = { this . state . submitting }
/ >
< Link
button = "cancel"
onClick = { this . props . back }
label = { _ _ ( "Cancel" ) }
/ >
2017-03-01 00:23:49 +01:00
< input type = "submit" className = "hidden" / >
2016-10-19 04:30:57 +02:00
< / div >
< / form >
2016-10-21 09:56:37 +02:00
2017-06-06 23:19:12 +02:00
< Modal
isOpen = { this . state . modal == "publishStarted" }
contentLabel = { _ _ ( "File published" ) }
onConfirmed = { event => {
this . handlePublishStartedConfirmed ( event ) ;
} }
>
< p >
{ _ _ ( "Your file has been published to LBRY at the address" ) }
{ " " } < code > lbry : //{this.state.name}</code>!
< / p >
< p >
{ _ _ (
'The file will take a few minutes to appear for other LBRY users. Until then it will be listed as "pending" under your published files.'
) }
< / p >
2016-10-21 09:56:37 +02:00
< / Modal >
2017-06-06 23:19:12 +02:00
< Modal
isOpen = { this . state . modal == "error" }
contentLabel = { _ _ ( "Error publishing file" ) }
onConfirmed = { event => {
this . closeModal ( event ) ;
} }
>
{ _ _ (
"The following error occurred when attempting to publish your file"
) } : { this . state . errorMessage }
2016-10-21 09:56:37 +02:00
< / Modal >
2016-10-19 04:30:57 +02:00
< / main >
2016-05-23 17:14:21 +02:00
) ;
}
2017-05-17 10:10:25 +02:00
}
2016-11-22 21:19:08 +01:00
export default PublishPage ;