// @flow import React, { useState } from 'react'; import { FormField } from 'component/common/form'; import Button from 'component/button'; import SelectAsset from 'component/selectAsset'; import { MINIMUM_PUBLISH_BID } from 'constants/claim'; import TagsSearch from 'component/tagsSearch'; import { FF_MAX_CHARS_IN_DESCRIPTION } from 'constants/form-field'; import ErrorText from 'component/common/error-text'; type Props = { claim: ChannelClaim, title: ?string, amount: string, coverUrl: ?string, thumbnailUrl: ?string, location: { search: string }, description: string, website: string, email: string, balance: number, tags: Array, locations: Array, languages: Array, updateChannel: any => Promise, updateThumb: string => void, updateCover: string => void, doneEditing: () => void, updateError: string, updatingChannel: boolean, }; function ChannelForm(props: Props) { const { claim, title, coverUrl, description, website, email, thumbnailUrl, tags, locations, languages, amount, doneEditing, updateChannel, updateThumb, updateCover, updateError, updatingChannel, } = props; const { claim_id: claimId } = claim; // fill this in with sdk data const channelParams = { website, email, coverUrl, thumbnailUrl, description, title, amount, claim_id: claimId, languages: languages || [], locations: locations || [], tags: tags ? tags.map(tag => { return { name: tag }; }) : [], }; const [params, setParams] = useState(channelParams); const [bidError, setBidError] = useState(''); // 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')); } }; const handleThumbnailChange = (thumbnailUrl: string) => { setParams({ ...params, thumbnailUrl }); updateThumb(thumbnailUrl); }; const handleCoverChange = (coverUrl: string) => { setParams({ ...params, coverUrl }); updateCover(coverUrl); }; const handleSubmit = () => { updateChannel(params).then(success => { if (success) { doneEditing(); } }); }; // TODO clear and bail after submit return (
handleThumbnailChange(v)} currentValue={params.thumbnailUrl} assetName={'Thumbnail'} recommended={__('Recommended ratio is 1:1')} /> handleCoverChange(v)} currentValue={params.coverUrl} assetName={'Cover'} recommended={__('Recommended ratio is 6.25:1')} /> setParams({ ...params, title: e.target.value })} /> handleBidChange(parseFloat(event.target.value))} placeholder={0.1} /> setParams({ ...params, website: e.target.value })} /> setParams({ ...params, email: e.target.value })} /> setParams({ ...params, description: text })} textAreaMaxLength={FF_MAX_CHARS_IN_DESCRIPTION} /> { const newTags = params.tags.slice().filter(tag => tag.name !== clickedTag.name); setParams({ ...params, tags: newTags }); }} onSelect={newTags => { newTags.forEach(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) }); } }); }} />
{updateError && updateError.length ? ( {updateError} ) : (

{__('After submitting, you will not see the changes immediately. Please check back in a few minutes.')}

)}
); } export default ChannelForm;