2018-03-26 23:32:43 +02:00
// @flow
import * as React from 'react' ;
2018-06-14 23:31:27 +02:00
import { isNameValid , buildURI , regexInvalidURI , THUMBNAIL _STATUSES } from 'lbry-redux' ;
2018-03-26 23:32:43 +02:00
import { Form , FormField , FormRow , FormFieldPrice , Submit } from 'component/common/form' ;
import Button from 'component/button' ;
import ChannelSection from 'component/selectChannel' ;
import classnames from 'classnames' ;
import type { PublishParams , UpdatePublishFormData } from 'redux/reducers/publish' ;
import FileSelector from 'component/common/file-selector' ;
2018-04-02 18:39:00 +02:00
import SelectThumbnail from 'component/selectThumbnail' ;
2018-03-26 23:32:43 +02:00
import { COPYRIGHT , OTHER } from 'constants/licenses' ;
2018-03-30 07:37:09 +02:00
import { CHANNEL _NEW , CHANNEL _ANONYMOUS , MINIMUM _PUBLISH _BID } from 'constants/claim' ;
2018-03-26 23:32:43 +02:00
import * as icons from 'constants/icons' ;
2018-05-25 20:05:30 +02:00
import type { Claim } from 'types/claim' ;
2018-03-30 07:37:09 +02:00
import BidHelpText from './internal/bid-help-text' ;
import LicenseType from './internal/license-type' ;
2018-03-26 23:32:43 +02:00
type Props = {
publish : PublishParams => void ,
filePath : ? string ,
bid : ? number ,
editingURI : ? string ,
title : ? string ,
thumbnail : ? string ,
2018-04-02 15:53:29 +02:00
uploadThumbnailStatus : ? string ,
2018-06-08 06:05:45 +02:00
thumbnailPath : ? string ,
2018-03-26 23:32:43 +02:00
description : ? string ,
language : string ,
nsfw : boolean ,
contentIsFree : boolean ,
price : {
amount : number ,
currency : string ,
} ,
channel : string ,
name : ? string ,
tosAccepted : boolean ,
updatePublishForm : UpdatePublishFormData => void ,
bid : number ,
nameError : ? string ,
isResolvingUri : boolean ,
winningBidForClaimUri : number ,
2018-05-25 20:05:30 +02:00
myClaimForUri : ? Claim ,
2018-03-26 23:32:43 +02:00
licenseType : string ,
otherLicenseDescription : ? string ,
licenseUrl : ? string ,
copyrightNotice : ? string ,
uri : ? string ,
bidError : ? string ,
publishing : boolean ,
balance : number ,
2018-06-12 07:11:17 +02:00
isStillEditing : boolean ,
2018-03-26 23:32:43 +02:00
clearPublish : ( ) => void ,
resolveUri : string => void ,
scrollToTop : ( ) => void ,
2018-07-30 20:24:40 +02:00
prepareEdit : ( { } ) => void ,
2018-04-02 15:53:29 +02:00
resetThumbnailStatus : ( ) => void ,
2018-03-26 23:32:43 +02:00
} ;
class PublishForm extends React . PureComponent < Props > {
constructor ( props : Props ) {
2017-06-30 10:45:54 +02:00
super ( props ) ;
2018-03-26 23:32:43 +02:00
( this : any ) . handleFileChange = this . handleFileChange . bind ( this ) ;
( this : any ) . checkIsFormValid = this . checkIsFormValid . bind ( this ) ;
( this : any ) . renderFormErrors = this . renderFormErrors . bind ( this ) ;
( this : any ) . handlePublish = this . handlePublish . bind ( this ) ;
( this : any ) . handleCancelPublish = this . handleCancelPublish . bind ( this ) ;
( this : any ) . handleNameChange = this . handleNameChange . bind ( this ) ;
( this : any ) . handleChannelChange = this . handleChannelChange . bind ( this ) ;
( this : any ) . editExistingClaim = this . editExistingClaim . bind ( this ) ;
( this : any ) . getNewUri = this . getNewUri . bind ( this ) ;
}
2018-04-02 15:53:29 +02:00
componentWillMount ( ) {
2018-07-18 17:46:21 +02:00
const { thumbnail } = this . props ;
2018-07-17 19:43:43 +02:00
if ( ! thumbnail ) {
2018-06-13 06:19:39 +02:00
this . props . resetThumbnailStatus ( ) ;
}
2018-04-02 15:53:29 +02:00
}
2018-04-04 01:17:40 +02:00
getNewUri ( name : string , channel : string ) {
const { resolveUri } = this . props ;
// If they are midway through a channel creation, treat it as anonymous until it completes
const channelName = channel === CHANNEL _ANONYMOUS || channel === CHANNEL _NEW ? '' : channel ;
2018-03-26 23:32:43 +02:00
2018-04-04 01:17:40 +02:00
let uri ;
try {
uri = buildURI ( { contentName : name , channelName } ) ;
} catch ( e ) {
// something wrong with channel or name
2017-06-30 10:45:54 +02:00
}
2018-04-04 01:17:40 +02:00
if ( uri ) {
resolveUri ( uri ) ;
return uri ;
2017-08-26 04:09:56 +02:00
}
2018-04-04 01:17:40 +02:00
return '' ;
2017-08-26 04:09:56 +02:00
}
2018-03-26 23:32:43 +02:00
handleFileChange ( filePath : string , fileName : string ) {
2018-04-03 06:05:11 +02:00
const { updatePublishForm , channel , name } = this . props ;
const newFileParams : {
filePath : string ,
name ? : string ,
2018-04-04 01:17:40 +02:00
uri ? : string ,
2018-04-03 06:05:11 +02:00
} = { filePath } ;
2017-06-30 10:45:54 +02:00
2018-04-03 06:05:11 +02:00
if ( ! name ) {
const parsedFileName = fileName . replace ( regexInvalidURI , '' ) ;
const uri = this . getNewUri ( parsedFileName , channel ) ;
newFileParams . name = parsedFileName ;
2018-04-04 01:17:40 +02:00
newFileParams . uri = uri ;
2018-03-26 23:32:43 +02:00
}
2018-04-03 06:05:11 +02:00
updatePublishForm ( newFileParams ) ;
2017-06-30 10:45:54 +02:00
}
2018-03-26 23:32:43 +02:00
handleNameChange ( name : ? string ) {
const { channel , updatePublishForm } = this . props ;
2017-06-30 10:45:54 +02:00
2018-03-26 23:32:43 +02:00
if ( ! name ) {
updatePublishForm ( { name , nameError : undefined } ) ;
2017-06-30 10:45:54 +02:00
return ;
}
2018-03-26 23:32:43 +02:00
if ( ! isNameValid ( name , false ) ) {
updatePublishForm ( {
name ,
nameError : _ _ ( 'LBRY names must contain only letters, numbers and dashes.' ) ,
} ) ;
2017-06-30 10:45:54 +02:00
return ;
}
2018-03-26 23:32:43 +02:00
const uri = this . getNewUri ( name , channel ) ;
updatePublishForm ( {
2017-12-21 22:08:54 +01:00
name ,
2017-06-30 10:45:54 +02:00
uri ,
2018-03-26 23:32:43 +02:00
nameError : undefined ,
2017-06-30 10:45:54 +02:00
} ) ;
}
2018-03-26 23:32:43 +02:00
handleChannelChange ( channelName : string ) {
2018-05-25 20:05:30 +02:00
const { name , updatePublishForm } = this . props ;
2018-05-16 01:01:53 +02:00
const form = { channel : channelName } ;
2018-05-25 20:05:30 +02:00
2018-03-26 23:32:43 +02:00
if ( name ) {
2018-05-16 01:01:53 +02:00
form . uri = this . getNewUri ( name , channelName ) ;
2017-06-30 10:45:54 +02:00
}
2018-05-16 01:01:53 +02:00
updatePublishForm ( form ) ;
2017-06-30 10:45:54 +02:00
}
2018-03-26 23:32:43 +02:00
handleBidChange ( bid : number ) {
2018-07-02 20:48:25 +02:00
const { balance , updatePublishForm , myClaimForUri } = this . props ;
let previousBidAmount = 0 ;
if ( myClaimForUri ) {
previousBidAmount = myClaimForUri . amount ;
}
const totalAvailableBidAmount = previousBidAmount + balance ;
2017-06-30 10:45:54 +02:00
2018-03-26 23:32:43 +02:00
let bidError ;
2018-06-18 08:34:59 +02:00
if ( bid === 0 ) {
bidError = _ _ ( 'Deposit cannot be 0' ) ;
2018-07-02 20:48:25 +02:00
} else if ( totalAvailableBidAmount === bid ) {
2018-06-18 08:34:59 +02:00
bidError = _ _ ( 'Please decrease your deposit to account for transaction fees' ) ;
2018-07-02 20:48:25 +02:00
} else if ( totalAvailableBidAmount < bid ) {
2018-06-18 08:34:59 +02:00
bidError = _ _ ( 'Deposit cannot be higher than your balance' ) ;
2018-03-26 23:32:43 +02:00
} else if ( bid <= MINIMUM _PUBLISH _BID ) {
2018-06-18 08:34:59 +02:00
bidError = _ _ ( 'Your deposit must be higher' ) ;
2018-03-26 23:32:43 +02:00
}
2017-06-30 10:45:54 +02:00
2018-03-26 23:32:43 +02:00
updatePublishForm ( { bid , bidError } ) ;
2017-06-30 10:45:54 +02:00
}
2018-04-06 08:22:35 +02:00
editExistingClaim ( myClaimForUri : ? { } , uri : string ) {
const { prepareEdit , scrollToTop } = this . props ;
2018-04-04 01:17:40 +02:00
if ( myClaimForUri ) {
2018-04-06 08:22:35 +02:00
prepareEdit ( myClaimForUri , uri ) ;
2018-04-04 01:17:40 +02:00
scrollToTop ( ) ;
2017-06-30 10:45:54 +02:00
}
2018-04-04 01:17:40 +02:00
}
2017-06-30 10:45:54 +02:00
2018-04-04 01:17:40 +02:00
handleCancelPublish ( ) {
const { clearPublish , scrollToTop } = this . props ;
scrollToTop ( ) ;
clearPublish ( ) ;
}
handlePublish ( ) {
const {
filePath ,
2018-06-13 05:28:06 +02:00
copyrightNotice ,
2018-04-04 01:17:40 +02:00
licenseType ,
licenseUrl ,
otherLicenseDescription ,
2018-04-04 01:46:03 +02:00
myClaimForUri ,
2018-06-13 05:28:06 +02:00
publish ,
2018-04-04 01:17:40 +02:00
} = this . props ;
let publishingLicense ;
switch ( licenseType ) {
case COPYRIGHT :
publishingLicense = copyrightNotice ;
break ;
case OTHER :
publishingLicense = otherLicenseDescription ;
break ;
default :
publishingLicense = licenseType ;
2017-06-30 10:45:54 +02:00
}
2018-04-04 01:17:40 +02:00
const publishingLicenseUrl = licenseType === COPYRIGHT ? '' : licenseUrl ;
const publishParams = {
filePath ,
2018-06-13 05:28:06 +02:00
bid : this . props . bid ,
title : this . props . title ,
thumbnail : this . props . thumbnail ,
description : this . props . description ,
language : this . props . language ,
nsfw : this . props . nsfw ,
2018-04-04 01:17:40 +02:00
license : publishingLicense ,
licenseUrl : publishingLicenseUrl ,
otherLicenseDescription ,
copyrightNotice ,
2018-06-13 05:28:06 +02:00
name : this . props . name ,
contentIsFree : this . props . contentIsFree ,
price : this . props . price ,
uri : this . props . uri ,
channel : this . props . channel ,
isStillEditing : this . props . isStillEditing ,
2018-04-04 01:17:40 +02:00
} ;
2018-04-04 01:46:03 +02:00
// Editing a claim
if ( ! filePath && myClaimForUri ) {
const { source } = myClaimForUri . value . stream ;
2018-04-04 19:18:52 +02:00
publishParams . sources = source ;
2018-04-04 01:46:03 +02:00
}
2018-04-04 01:17:40 +02:00
publish ( publishParams ) ;
2017-06-30 10:45:54 +02:00
}
2018-03-26 23:32:43 +02:00
checkIsFormValid ( ) {
2018-07-02 18:37:07 +02:00
const {
name ,
nameError ,
title ,
bid ,
bidError ,
tosAccepted ,
editingURI ,
isStillEditing ,
filePath ,
2018-08-10 06:50:26 +02:00
uploadThumbnailStatus ,
2018-07-02 18:37:07 +02:00
} = this . props ;
// If they are editing, they don't need a new file chosen
2018-08-13 21:57:23 +02:00
const formValidLessFile =
name &&
! nameError &&
title &&
bid &&
! bidError &&
tosAccepted &&
! ( uploadThumbnailStatus === THUMBNAIL _STATUSES . IN _PROGRESS ) ;
2018-07-02 18:37:07 +02:00
return editingURI && ! filePath ? isStillEditing && formValidLessFile : formValidLessFile ;
2017-07-22 11:10:37 +02:00
}
2018-03-26 23:32:43 +02:00
renderFormErrors ( ) {
2018-07-02 18:37:07 +02:00
const {
name ,
nameError ,
title ,
bid ,
bidError ,
tosAccepted ,
editingURI ,
filePath ,
isStillEditing ,
2018-08-10 06:50:26 +02:00
uploadThumbnailStatus ,
2018-07-02 18:37:07 +02:00
} = this . props ;
const isFormValid = this . checkIsFormValid ( ) ;
2017-06-30 10:45:54 +02:00
2018-06-28 22:12:17 +02:00
// These are extra help
// If there is an error it will be presented as an inline error as well
2018-03-26 23:32:43 +02:00
return (
2018-07-02 18:37:07 +02:00
! isFormValid && (
< div className = "card__content card__subtitle form-field__error" >
{ ! title && < div > { _ _ ( 'A title is required' ) } < / div > }
{ ! name && < div > { _ _ ( 'A URL is required' ) } < / div > }
{ name && nameError && < div > { _ _ ( 'The URL you created is not valid' ) } < / div > }
{ ! bid && < div > { _ _ ( 'A bid amount is required' ) } < / div > }
{ ! ! bid && bidError && < div > { bidError } < / div > }
2018-08-10 06:50:26 +02:00
{ uploadThumbnailStatus === THUMBNAIL _STATUSES . IN _PROGRESS
&& < div > { _ _ ( 'Please wait for thumbnail to finish uploading' ) } < / div > }
2018-07-02 18:37:07 +02:00
{ ! tosAccepted && < div > { _ _ ( 'You must agree to the terms of service' ) } < / div > }
{ ! ! editingURI &&
! isStillEditing &&
! filePath && < div > { _ _ ( 'You need to reselect a file after changing the LBRY URL' ) } < / div > }
< / div >
)
2018-03-26 23:32:43 +02:00
) ;
2017-06-30 10:45:54 +02:00
}
render ( ) {
2018-03-26 23:32:43 +02:00
const {
filePath ,
editingURI ,
title ,
thumbnail ,
2018-04-02 15:53:29 +02:00
uploadThumbnailStatus ,
2018-03-26 23:32:43 +02:00
description ,
language ,
nsfw ,
contentIsFree ,
price ,
channel ,
name ,
tosAccepted ,
updatePublishForm ,
bid ,
nameError ,
isResolvingUri ,
winningBidForClaimUri ,
myClaimForUri ,
licenseType ,
otherLicenseDescription ,
licenseUrl ,
copyrightNotice ,
uri ,
bidError ,
publishing ,
clearPublish ,
2018-06-08 06:05:45 +02:00
thumbnailPath ,
resetThumbnailStatus ,
2018-06-12 07:11:17 +02:00
isStillEditing ,
2018-03-26 23:32:43 +02:00
} = this . props ;
const formDisabled = ( ! filePath && ! editingURI ) || publishing ;
const formValid = this . checkIsFormValid ( ) ;
let submitLabel ;
if ( isStillEditing ) {
submitLabel = ! publishing ? _ _ ( 'Edit' ) : _ _ ( 'Editing...' ) ;
} else {
submitLabel = ! publishing ? _ _ ( 'Publish' ) : _ _ ( 'Publishing...' ) ;
2017-09-05 03:03:48 +02:00
}
2017-06-30 10:45:54 +02:00
return (
2018-03-26 23:32:43 +02:00
< Form onSubmit = { this . handlePublish } >
2018-06-28 22:13:59 +02:00
< section className = { classnames ( 'card card--section' , { 'card--disabled' : publishing } ) } >
2018-03-26 23:32:43 +02:00
< div className = "card__title" > { _ _ ( 'Content' ) } < / div >
< div className = "card__subtitle" >
2018-07-02 18:37:07 +02:00
{ isStillEditing ? _ _ ( 'Editing a claim' ) : _ _ ( 'What are you publishing?' ) }
2018-07-30 20:24:40 +02:00
{ ' ' } { _ _ (
2018-07-30 21:24:00 +02:00
'Read our'
2018-07-30 20:24:40 +02:00
) } { ' ' }
< Button button = "link" label = { _ _ ( 'FAQ' ) } href = "https://lbry.io/faq/how-to-publish" / > { ' ' }
{ _ _ (
'to learn more.'
) }
2018-03-26 23:32:43 +02:00
< / div >
{ ( filePath || ! ! editingURI ) && (
< div className = "card-media__internal-links" >
< Button
button = "inverse"
icon = { icons . CLOSE }
label = { _ _ ( 'Clear' ) }
onClick = { clearPublish }
2017-06-30 10:45:54 +02:00
/ >
< / div >
2018-03-26 23:32:43 +02:00
) }
2018-07-18 17:46:21 +02:00
< div className = "card__content" >
< FileSelector currentPath = { filePath } onFileChosen = { this . handleFileChange } / >
{ ! ! isStillEditing &&
name && (
< p className = "card__content card__subtitle" >
{ _ _ ( "If you don't choose a file, the file from your existing claim" ) }
{ ` " ${ name } " ` }
{ _ _ ( 'will be used.' ) }
< / p >
) }
< / div >
2018-03-26 23:32:43 +02:00
< / section >
< div className = { classnames ( { 'card--disabled' : formDisabled } ) } >
< section className = "card card--section" >
< FormRow >
< FormField
stretch
type = "text"
name = "content_title"
label = { _ _ ( 'Title' ) }
placeholder = { _ _ ( 'Titular Title' ) }
disabled = { formDisabled }
value = { title }
onChange = { e => updatePublishForm ( { title : e . target . value } ) }
/ >
< / FormRow >
< FormRow padded >
< FormField
stretch
type = "markdown"
name = "content_description"
label = { _ _ ( 'Description' ) }
placeholder = { _ _ ( 'Description of your content' ) }
value = { description }
disabled = { formDisabled }
onChange = { text => updatePublishForm ( { description : text } ) }
/ >
< / FormRow >
2017-06-30 10:45:54 +02:00
< / section >
2018-06-08 06:05:45 +02:00
< section className = "card card--section" >
< div className = "card__title" > { _ _ ( 'Thumbnail' ) } < / div >
< div className = "card__subtitle" >
2018-06-14 23:31:27 +02:00
{ uploadThumbnailStatus === THUMBNAIL _STATUSES . API _DOWN ? (
2018-06-26 19:25:54 +02:00
_ _ ( 'Enter a URL for your thumbnail.' )
2018-06-13 18:27:07 +02:00
) : (
2018-07-30 20:24:40 +02:00
< React.Fragment >
{ _ _ ( 'Upload your thumbnail (.png/.jpg/.jpeg/.gif) to' ) } { ' ' }
< Button button = "link" label = { _ _ ( 'spee.ch' ) } href = "https://spee.ch/about" / > . { ' ' }
{ _ _ ( 'Recommended size: 800x450 (16:9)' ) }
< / React.Fragment >
) }
2018-06-08 06:05:45 +02:00
< / div >
< SelectThumbnail
thumbnailPath = { thumbnailPath }
thumbnail = { thumbnail }
uploadThumbnailStatus = { uploadThumbnailStatus }
updatePublishForm = { updatePublishForm }
formDisabled = { formDisabled }
resetThumbnailStatus = { resetThumbnailStatus }
/ >
< / section >
2018-03-26 23:32:43 +02:00
< section className = "card card--section" >
< div className = "card__title" > { _ _ ( 'Price' ) } < / div >
< div className = "card__subtitle" > { _ _ ( 'How much will this content cost?' ) } < / div >
2017-06-30 10:45:54 +02:00
< div className = "card__content" >
2018-03-26 23:32:43 +02:00
< FormField
2017-06-30 10:45:54 +02:00
type = "radio"
2018-03-26 23:32:43 +02:00
name = "content_free"
postfix = { _ _ ( 'Free' ) }
checked = { contentIsFree }
disabled = { formDisabled }
onChange = { ( ) => updatePublishForm ( { contentIsFree : true } ) }
2017-06-30 10:45:54 +02:00
/ >
< FormField
type = "radio"
2018-03-26 23:32:43 +02:00
name = "content_cost"
postfix = { _ _ ( 'Choose price' ) }
checked = { ! contentIsFree }
disabled = { formDisabled }
onChange = { ( ) => updatePublishForm ( { contentIsFree : false } ) }
2017-06-30 10:45:54 +02:00
/ >
2018-04-12 01:41:53 +02:00
{ ! contentIsFree && (
< FormFieldPrice
name = "content_cost_amount"
min = "0"
price = { price }
onChange = { newPrice => updatePublishForm ( { price : newPrice } ) }
/ >
) }
2018-03-26 23:32:43 +02:00
{ price . currency !== 'LBC' && (
< p className = "form-field__help" >
2017-11-21 20:51:12 +01:00
{ _ _ (
2017-12-21 22:08:54 +01:00
'All content fees are charged in LBC. For non-LBC payment methods, the number of credits charged will be adjusted based on the value of LBRY credits at the time of purchase.'
2017-11-21 20:51:12 +01:00
) }
2018-03-26 23:32:43 +02:00
< / p >
) }
2017-10-14 21:41:04 +02:00
< / div >
< / section >
2017-06-30 10:45:54 +02:00
2018-03-26 23:32:43 +02:00
< section className = "card card--section" >
< div className = "card__title" > { _ _ ( 'Anonymous or under a channel?' ) } < / div >
< p className = "card__subtitle" >
{ _ _ ( 'This is a username or handle that your content can be found under.' ) } { ' ' }
{ _ _ ( 'Ex. @Marvel, @TheBeatles, @BooksByJoe' ) }
< / p >
< ChannelSection channel = { channel } onChannelChange = { this . handleChannelChange } / >
< / section >
2017-11-21 20:51:12 +01:00
2018-03-26 23:32:43 +02:00
< section className = "card card--section" >
< div className = "card__title" > { _ _ ( 'Where can people find this content?' ) } < / div >
< p className = "card__subtitle" >
{ _ _ (
'The LBRY URL is the exact address where people find your content (ex. lbry://myvideo).'
) } { ' ' }
< Button button = "link" label = { _ _ ( 'Learn more' ) } href = "https://lbry.io/faq/naming" / >
< / p >
< div className = "card__content" >
< FormRow >
< FormField
stretch
prefix = { ` lbry:// ${
2018-04-04 01:17:40 +02:00
! channel || channel === CHANNEL _ANONYMOUS || channel === CHANNEL _NEW
? ''
: ` ${ channel } / `
2018-07-30 20:24:40 +02:00
} ` }
2017-11-21 20:51:12 +01:00
type = "text"
2018-03-26 23:32:43 +02:00
name = "content_name"
placeholder = "myname"
value = { name }
onChange = { event => this . handleNameChange ( event . target . value ) }
error = { nameError }
helper = {
< BidHelpText
2018-06-12 07:11:17 +02:00
isStillEditing = { isStillEditing }
uri = { uri }
2018-03-26 23:32:43 +02:00
editingURI = { editingURI }
isResolvingUri = { isResolvingUri }
winningBidForClaimUri = { winningBidForClaimUri }
2018-04-06 08:22:35 +02:00
myClaimForUri = { myClaimForUri }
2018-03-26 23:32:43 +02:00
onEditMyClaim = { this . editExistingClaim }
/ >
}
2017-11-21 20:51:12 +01:00
/ >
2018-03-26 23:32:43 +02:00
< / FormRow >
< / div >
< div className = { classnames ( 'card__content' , { 'card--disabled' : ! name } ) } >
< FormField
className = "input--price-amount"
type = "number"
name = "content_bid"
step = "any"
label = { _ _ ( 'Deposit' ) }
postfix = "LBC"
value = { bid }
error = { bidError }
min = "0"
disabled = { ! name }
onChange = { event => this . handleBidChange ( parseFloat ( event . target . value ) ) }
helper = { _ _ ( 'This LBC remains yours and the deposit can be undone at any time.' ) }
placeholder = { winningBidForClaimUri ? winningBidForClaimUri + 0.1 : 0.1 }
/ >
2017-06-30 10:45:54 +02:00
< / div >
< / section >
2018-03-26 23:32:43 +02:00
< section className = "card card--section" >
< FormRow >
< FormField
type = "checkbox"
name = "content_is_mature"
postfix = { _ _ ( 'Mature audiences only' ) }
checked = { nsfw }
onChange = { event => updatePublishForm ( { nsfw : event . target . checked } ) }
2017-06-30 10:45:54 +02:00
/ >
2018-03-26 23:32:43 +02:00
< / FormRow >
< FormRow padded >
< FormField
label = { _ _ ( 'Language' ) }
type = "select"
name = "content_language"
value = { language }
onChange = { event => updatePublishForm ( { language : event . target . value } ) }
>
< 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 >
< / FormField >
< / FormRow >
< LicenseType
licenseType = { licenseType }
otherLicenseDescription = { otherLicenseDescription }
licenseUrl = { licenseUrl }
copyrightNotice = { copyrightNotice }
handleLicenseChange = { ( newLicenseType , newLicenseUrl ) =>
updatePublishForm ( {
licenseType : newLicenseType ,
licenseUrl : newLicenseUrl ,
} )
}
handleLicenseDescriptionChange = { event =>
updatePublishForm ( {
otherLicenseDescription : event . target . value ,
} )
}
handleLicenseUrlChange = { event =>
updatePublishForm ( { licenseUrl : event . target . value } )
}
handleCopyrightNoticeChange = { event =>
updatePublishForm ( { copyrightNotice : event . target . value } )
}
/ >
2017-06-30 10:45:54 +02:00
< / section >
2018-03-26 23:32:43 +02:00
< section className = "card card--section" >
< div className = "card__title" > { _ _ ( 'Terms of Service' ) } < / div >
2017-06-30 10:45:54 +02:00
< div className = "card__content" >
2018-03-26 23:32:43 +02:00
< FormField
name = "lbry_tos"
type = "checkbox"
checked = { tosAccepted }
postfix = {
2017-06-30 10:45:54 +02:00
< span >
2017-12-21 22:08:54 +01:00
{ _ _ ( 'I agree to the' ) } { ' ' }
2018-03-26 23:32:43 +02:00
< Button
button = "link"
2017-06-30 10:45:54 +02:00
href = "https://www.lbry.io/termsofservice"
2017-12-21 22:08:54 +01:00
label = { _ _ ( 'LBRY terms of service' ) }
2017-06-30 10:45:54 +02:00
/ >
< / span >
}
2018-03-26 23:32:43 +02:00
onChange = { event => updatePublishForm ( { tosAccepted : event . target . checked } ) }
2017-06-30 10:45:54 +02:00
/ >
< / div >
< / section >
2018-03-26 23:32:43 +02:00
< div className = "card__actions" >
2018-06-13 06:28:26 +02:00
< Submit
label = { submitLabel }
disabled = {
2018-06-14 23:31:27 +02:00
formDisabled ||
! formValid ||
uploadThumbnailStatus === THUMBNAIL _STATUSES . IN _PROGRESS
2018-06-13 06:28:26 +02:00
}
/ >
2018-03-26 23:32:43 +02:00
< Button button = "alt" onClick = { this . handleCancelPublish } label = { _ _ ( 'Cancel' ) } / >
2017-06-30 10:45:54 +02:00
< / div >
2018-03-26 23:32:43 +02:00
{ ! formDisabled && ! formValid && this . renderFormErrors ( ) }
< / div >
< / Form >
2017-06-30 10:45:54 +02:00
) ;
}
}
export default PublishForm ;