2019-07-02 19:54:42 +02:00
|
|
|
// @flow
|
|
|
|
import React, { useState } from 'react';
|
2019-11-14 18:00:01 +01:00
|
|
|
import { 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';
|
2019-11-13 19:11:51 +01:00
|
|
|
import { MINIMUM_PUBLISH_BID } from 'constants/claim';
|
2019-11-22 22:13:00 +01:00
|
|
|
import TagsSearch from 'component/tagsSearch';
|
2020-06-12 17:18:04 +02:00
|
|
|
import { FF_MAX_CHARS_IN_DESCRIPTION } from 'constants/form-field';
|
2020-06-21 18:51:06 +02:00
|
|
|
import ErrorText from 'component/common/error-text';
|
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>,
|
2020-06-21 18:51:06 +02:00
|
|
|
updateChannel: any => Promise<any>,
|
2019-07-02 19:54:42 +02:00
|
|
|
updateThumb: string => void,
|
|
|
|
updateCover: string => void,
|
2020-06-21 18:51:06 +02:00
|
|
|
doneEditing: () => void,
|
|
|
|
updateError: string,
|
2020-06-22 17:19:55 +02:00
|
|
|
updatingChannel: boolean,
|
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,
|
2020-06-21 18:51:06 +02:00
|
|
|
doneEditing,
|
2019-07-02 19:54:42 +02:00
|
|
|
updateChannel,
|
|
|
|
updateThumb,
|
|
|
|
updateCover,
|
2020-06-21 18:51:06 +02:00
|
|
|
updateError,
|
2020-06-22 17:19:55 +02:00
|
|
|
updatingChannel,
|
2019-07-02 19:54:42 +02:00
|
|
|
} = 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('');
|
|
|
|
|
|
|
|
// 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'));
|
2019-11-13 19:11:51 +01:00
|
|
|
} else if (bid < MINIMUM_PUBLISH_BID) {
|
2019-07-02 19:54:42 +02:00
|
|
|
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
|
|
|
};
|
2019-11-14 18:00:01 +01:00
|
|
|
|
|
|
|
const handleSubmit = () => {
|
2020-06-21 18:51:06 +02:00
|
|
|
updateChannel(params).then(success => {
|
|
|
|
if (success) {
|
|
|
|
doneEditing();
|
|
|
|
}
|
|
|
|
});
|
2019-11-14 18:00:01 +01:00
|
|
|
};
|
2020-03-13 23:15:37 +01:00
|
|
|
|
2019-07-02 19:54:42 +02:00
|
|
|
// TODO clear and bail after submit
|
|
|
|
return (
|
2020-06-21 18:51:06 +02:00
|
|
|
<div className="card">
|
|
|
|
<section className={'section card--section'}>
|
|
|
|
<SelectAsset
|
|
|
|
onUpdate={v => handleThumbnailChange(v)}
|
|
|
|
currentValue={params.thumbnailUrl}
|
|
|
|
assetName={'Thumbnail'}
|
|
|
|
recommended={__('Recommended ratio is 1:1')}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<SelectAsset
|
|
|
|
onUpdate={v => handleCoverChange(v)}
|
|
|
|
currentValue={params.coverUrl}
|
|
|
|
assetName={'Cover'}
|
|
|
|
recommended={__('Recommended ratio is 6.25:1')}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<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 })}
|
|
|
|
textAreaMaxLength={FF_MAX_CHARS_IN_DESCRIPTION}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TagsSearch
|
|
|
|
suggestMature
|
|
|
|
disableAutoFocus
|
|
|
|
tagsPassedIn={params.tags || []}
|
|
|
|
label={__('Tags Selected')}
|
|
|
|
onRemove={clickedTag => {
|
|
|
|
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) });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
<div className={'section__actions'}>
|
2020-06-22 17:19:55 +02:00
|
|
|
<Button
|
|
|
|
button="primary"
|
|
|
|
label={updatingChannel ? __('Submitting...') : __('Submit')}
|
|
|
|
onClick={handleSubmit}
|
|
|
|
/>
|
2020-06-21 18:51:06 +02:00
|
|
|
<Button button="link" label={__('Cancel')} onClick={doneEditing} />
|
|
|
|
</div>
|
|
|
|
{updateError && updateError.length ? (
|
|
|
|
<ErrorText>{updateError}</ErrorText>
|
|
|
|
) : (
|
|
|
|
<p className="help">
|
|
|
|
{__('After submitting, you will not see the changes immediately. Please check back in a few minutes.')}
|
|
|
|
</p>
|
|
|
|
)}
|
|
|
|
</section>
|
|
|
|
</div>
|
2019-07-02 19:54:42 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ChannelForm;
|