2019-07-02 19:54:42 +02:00
// @flow
import React , { useState } from 'react' ;
import { Form , FormField } from 'component/common/form' ;
2019-07-23 10:05:51 +02:00
import Button from 'component/button' ;
2019-07-22 17:47:48 +02:00
import SelectAsset from 'component/selectAsset' ;
import TagSelect from 'component/tagsSelect' ;
2019-07-02 19:54:42 +02:00
type Props = {
2019-08-15 13:36:03 +02:00
claim : ChannelClaim ,
2019-07-02 19:54:42 +02:00
title : ? string ,
amount : string ,
2019-09-23 17:02:30 +02:00
coverUrl : ? string ,
thumbnailUrl : ? string ,
2019-07-02 19:54:42 +02:00
location : { search : string } ,
description : string ,
website : string ,
email : string ,
balance : number ,
tags : Array < string > ,
locations : Array < string > ,
languages : Array < string > ,
updateChannel : any => void ,
updateThumb : string => void ,
updateCover : string => void ,
2019-07-23 10:05:51 +02:00
setEditing : boolean => void ,
2019-07-02 19:54:42 +02:00
} ;
function ChannelForm ( props : Props ) {
const {
2019-08-15 13:36:03 +02:00
claim ,
2019-07-02 19:54:42 +02:00
title ,
2019-09-23 17:02:30 +02:00
coverUrl ,
2019-07-02 19:54:42 +02:00
description ,
website ,
email ,
2019-09-23 17:02:30 +02:00
thumbnailUrl ,
2019-07-02 19:54:42 +02:00
tags ,
locations ,
languages ,
amount ,
2019-07-23 10:05:51 +02:00
setEditing ,
2019-07-02 19:54:42 +02:00
updateChannel ,
updateThumb ,
updateCover ,
} = props ;
2019-08-15 13:36:03 +02:00
const { claim _id : claimId } = claim ;
2019-07-02 19:54:42 +02:00
// fill this in with sdk data
const channelParams = {
2019-09-23 17:02:30 +02:00
website ,
email ,
coverUrl ,
thumbnailUrl ,
description ,
title ,
amount ,
claim _id : claimId ,
2019-07-02 19:54:42 +02:00
languages : languages || [ ] ,
locations : locations || [ ] ,
2019-07-18 19:04:30 +02:00
tags : tags
? tags . map ( tag => {
return { name : tag } ;
} )
: [ ] ,
2019-07-02 19:54:42 +02:00
} ;
const [ params , setParams ] = useState ( channelParams ) ;
const [ bidError , setBidError ] = useState ( '' ) ;
const MINIMUM _PUBLISH _BID = 0.00000001 ;
// If a user changes tabs, update the url so it stays on the same page if they refresh.
// We don't want to use links here because we can't animate the tab change and using links
// would alter the Tab label's role attribute, which should stay role="tab" to work with keyboards/screen readers.
const handleBidChange = ( bid : number ) => {
const { balance , amount } = props ;
const totalAvailableBidAmount = parseFloat ( amount ) + parseFloat ( balance ) ;
setParams ( { ... params , amount : bid } ) ;
setBidError ( '' ) ;
if ( bid <= 0.0 || isNaN ( bid ) ) {
setBidError ( _ _ ( 'Deposit cannot be 0' ) ) ;
} else if ( totalAvailableBidAmount === bid ) {
setBidError ( _ _ ( 'Please decrease your deposit to account for transaction fees' ) ) ;
} else if ( totalAvailableBidAmount < bid ) {
setBidError ( _ _ ( 'Deposit cannot be higher than your balance' ) ) ;
} else if ( bid <= MINIMUM _PUBLISH _BID ) {
setBidError ( _ _ ( 'Your deposit must be higher' ) ) ;
}
} ;
2019-09-23 17:02:30 +02:00
const handleThumbnailChange = ( thumbnailUrl : string ) => {
setParams ( { ... params , thumbnailUrl } ) ;
updateThumb ( thumbnailUrl ) ;
2019-07-02 19:54:42 +02:00
} ;
2019-09-23 17:02:30 +02:00
const handleCoverChange = ( coverUrl : string ) => {
setParams ( { ... params , coverUrl } ) ;
updateCover ( coverUrl ) ;
2019-07-02 19:54:42 +02:00
} ;
// TODO clear and bail after submit
return (
< section className = { 'card--section' } >
2019-07-23 10:05:51 +02:00
< div className = "card__subtitle" >
2019-07-02 19:54:42 +02:00
< p > { _ _ ( 'We can explain...' ) } < / p >
< p >
{ _ _ (
2019-07-23 10:05:51 +02:00
"We know this page won't win any design awards, we just wanted to release a very basic version that works so people can use it right now. There is a much nicer version being worked on."
2019-07-02 19:54:42 +02:00
) }
< / p >
< / div >
2019-09-23 17:02:30 +02:00
< Form
onSubmit = { ( ) => {
updateChannel ( params ) ;
setEditing ( false ) ;
} }
>
2019-07-21 23:31:22 +02:00
< SelectAsset
onUpdate = { v => handleThumbnailChange ( v ) }
2019-09-23 17:02:30 +02:00
currentValue = { params . thumbnailUrl }
2019-07-21 23:31:22 +02:00
assetName = { 'Thumbnail' }
recommended = { '(300 x 300)' }
/ >
< SelectAsset
onUpdate = { v => handleCoverChange ( v ) }
2019-09-23 17:02:30 +02:00
currentValue = { params . coverUrl }
2019-07-21 23:31:22 +02:00
assetName = { 'Cover' }
recommended = { '(1000 x 160)' }
/ >
< FormField
type = "text"
name = "channel_title2"
label = { _ _ ( 'Title' ) }
placeholder = { _ _ ( 'Titular Title' ) }
disabled = { false }
value = { params . title }
onChange = { e => setParams ( { ... params , title : e . target . value } ) }
/ >
< FormField
className = "form-field--price-amount"
type = "number"
name = "content_bid2"
step = "any"
label = { _ _ ( 'Deposit (LBC)' ) }
postfix = "LBC"
value = { params . amount }
error = { bidError }
min = "0.0"
disabled = { false }
onChange = { event => handleBidChange ( parseFloat ( event . target . value ) ) }
placeholder = { 0.1 }
/ >
< FormField
type = "text"
name = "channel_website2"
label = { _ _ ( 'Website' ) }
placeholder = { _ _ ( 'aprettygoodsite.com' ) }
disabled = { false }
value = { params . website }
onChange = { e => setParams ( { ... params , website : e . target . value } ) }
/ >
< FormField
type = "text"
name = "content_email2"
label = { _ _ ( 'Email' ) }
placeholder = { _ _ ( 'yourstruly@example.com' ) }
disabled = { false }
value = { params . email }
onChange = { e => setParams ( { ... params , email : e . target . value } ) }
/ >
< FormField
type = "markdown"
name = "content_description2"
label = { _ _ ( 'Description' ) }
placeholder = { _ _ ( 'Description of your content' ) }
value = { params . description }
disabled = { false }
onChange = { text => setParams ( { ... params , description : text } ) }
/ >
< TagSelect
2019-09-27 20:56:15 +02:00
title = { _ _ ( 'Add Tags' ) }
2019-07-21 23:31:22 +02:00
suggestMature
help = { _ _ ( 'The better your tags are, the easier it will be for people to discover your channel.' ) }
empty = { _ _ ( 'No tags added' ) }
onSelect = { newTag => {
if ( ! params . tags . map ( savedTag => savedTag . name ) . includes ( newTag . name ) ) {
setParams ( { ... params , tags : [ ... params . tags , newTag ] } ) ;
} else {
// If it already exists and the user types it in, remove it
setParams ( { ... params , tags : params . tags . filter ( tag => tag . name !== newTag . name ) } ) ;
}
} }
onRemove = { clickedTag => {
const newTags = params . tags . slice ( ) . filter ( tag => tag . name !== clickedTag . name ) ;
setParams ( { ... params , tags : newTags } ) ;
} }
tagsChosen = { params . tags || [ ] }
/ >
< div className = { 'card__actions' } >
2019-09-23 17:02:30 +02:00
< Button button = "primary" label = { _ _ ( 'Submit' ) } type = "submit" / >
< Button button = "link" label = { _ _ ( 'Cancel' ) } / >
2019-07-02 19:54:42 +02:00
< / div >
< / Form >
< / section >
) ;
}
export default ChannelForm ;