From b256a4396b2669e0e1a30e6cb1c26a644745f860 Mon Sep 17 00:00:00 2001
From: saltrafael <76502841+saltrafael@users.noreply.github.com>
Date: Tue, 24 Aug 2021 21:28:23 -0300
Subject: [PATCH] Thumbnail upload fixes (#6860)
more improvements, fix url, do the same for cover
remember url, error if invalid
unneeded addition
Fix delayed message
Lint
Allow empty values (placeholder and Gerbil)
Fix filepath crash
Fix button
---
ui/component/channelEdit/view.jsx | 53 ++++++++++++---
ui/component/channelThumbnail/view.jsx | 36 ++++------
ui/component/common/file-selector.jsx | 15 +---
ui/component/selectAsset/view.jsx | 68 +++++++------------
ui/component/selectThumbnail/view.jsx | 11 +--
ui/modal/modalConfirmThumbnailUpload/view.jsx | 11 +--
ui/modal/modalImageUpload/index.js | 6 +-
ui/modal/modalImageUpload/view.jsx | 4 +-
ui/scss/component/_channel.scss | 2 +-
9 files changed, 97 insertions(+), 109 deletions(-)
diff --git a/ui/component/channelEdit/view.jsx b/ui/component/channelEdit/view.jsx
index 61c9df69f..0ba9e4bac 100644
--- a/ui/component/channelEdit/view.jsx
+++ b/ui/component/channelEdit/view.jsx
@@ -22,6 +22,8 @@ import SUPPORTED_LANGUAGES from 'constants/supported_languages';
import WalletSpendableBalanceHelp from 'component/walletSpendableBalanceHelp';
import { SIMPLE_SITE } from 'config';
import { sortLanguageMap } from 'util/default-languages';
+import ThumbnailBrokenImage from 'component/selectThumbnail/thumbnail-broken.png';
+import Gerbil from 'component/channelThumbnail/gerbil.png';
const LANG_NONE = 'none';
@@ -52,7 +54,7 @@ type Props = {
onDone: () => void,
openModal: (
id: string,
- { onUpdate: (string) => void, assetName: string, helpText: string, currentValue: string, title: string }
+ { onUpdate: (string, boolean) => void, assetName: string, helpText: string, currentValue: string, title: string }
) => void,
uri: string,
disabled: boolean,
@@ -90,7 +92,9 @@ function ChannelForm(props: Props) {
} = props;
const [nameError, setNameError] = React.useState(undefined);
const [bidError, setBidError] = React.useState('');
+ const [isUpload, setIsUpload] = React.useState({ cover: false, thumbnail: false });
const [coverError, setCoverError] = React.useState(false);
+ const [thumbError, setThumbError] = React.useState(false);
const { claim_id: claimId } = claim || {};
const [params, setParams]: [any, (any) => void] = React.useState(getChannelParams());
const { channelName } = parseURI(uri);
@@ -112,10 +116,12 @@ function ChannelForm(props: Props) {
creatingChannel ||
updatingChannel ||
nameError ||
+ thumbError ||
+ coverError ||
bidError ||
(isNewChannel && !params.name)
);
- }, [isClaimingInitialRewards, creatingChannel, updatingChannel, nameError, bidError, isNewChannel, params]);
+ }, [isClaimingInitialRewards, creatingChannel, updatingChannel, nameError, thumbError, coverError, bidError, isNewChannel, params.name]);
function getChannelParams() {
// fill this in with sdk data
@@ -195,12 +201,16 @@ function ChannelForm(props: Props) {
setParams({ ...params, languages: langs });
}
- function handleThumbnailChange(thumbnailUrl: string) {
+ function handleThumbnailChange(thumbnailUrl: string, uploadSelected: boolean) {
setParams({ ...params, thumbnailUrl });
+ setIsUpload({ ...isUpload, thumbnail: uploadSelected });
+ setThumbError(false);
}
- function handleCoverChange(coverUrl: string) {
+ function handleCoverChange(coverUrl: string, uploadSelected: boolean) {
setParams({ ...params, coverUrl });
+ setIsUpload({ ...isUpload, cover: uploadSelected });
+ setCoverError(false);
}
function handleSubmit() {
@@ -225,6 +235,9 @@ function ChannelForm(props: Props) {
if (errorMsg && errorMsg.includes(LIMIT_ERR_PARTIAL_MSG)) {
errorMsg = __('Transaction limit reached. Try reducing the Description length.');
}
+ if ((!isUpload.thumbnail && thumbError) || (!isUpload.cover && coverError)) {
+ errorMsg = __('Invalid %error_type%', { error_type: (thumbError && 'thumbnail') || (coverError && 'cover image') });
+ }
React.useEffect(() => {
let nameError;
@@ -247,6 +260,17 @@ function ChannelForm(props: Props) {
}
}, [hasClaimedInitialRewards, claimInitialRewards]);
+ const coverSrc = coverError ? ThumbnailBrokenImage : params.coverUrl;
+
+ let thumbnailPreview;
+ if (!params.thumbnailUrl) {
+ thumbnailPreview = Gerbil;
+ } else if (thumbError) {
+ thumbnailPreview = ThumbnailBrokenImage;
+ } else {
+ thumbnailPreview = params.thumbnailUrl;
+ }
+
// TODO clear and bail after submit
return (
<>
@@ -258,7 +282,7 @@ function ChannelForm(props: Props) {
title={__('Cover')}
onClick={() =>
openModal(MODALS.IMAGE_UPLOAD, {
- onUpdate: (coverUrl) => handleCoverChange(coverUrl),
+ onUpdate: (coverUrl, isUpload) => handleCoverChange(coverUrl, isUpload),
title: __('Edit Cover Image'),
helpText: __('(6.25:1)'),
assetName: __('Cover Image'),
@@ -270,11 +294,16 @@ function ChannelForm(props: Props) {
/>
{params.coverUrl &&
- (coverError ? (
+ (coverError && isUpload.cover ? (
{__('This will be visible in a few minutes.')}
) : (
- setCoverError(true)} />
- ))}
+ setCoverError(true)}
+ />
+ )
+ )}
@@ -130,12 +128,7 @@ class SelectThumbnail extends React.PureComponent
{
)}
{status === THUMBNAIL_STATUSES.COMPLETE && thumbnail && (
-
- {__('This will be visible in a few minutes.')}
-
+
{__('Upload complete.')}
diff --git a/ui/modal/modalConfirmThumbnailUpload/view.jsx b/ui/modal/modalConfirmThumbnailUpload/view.jsx
index f03569e39..4f2380b27 100644
--- a/ui/modal/modalConfirmThumbnailUpload/view.jsx
+++ b/ui/modal/modalConfirmThumbnailUpload/view.jsx
@@ -13,13 +13,16 @@ type Props = {
class ModalConfirmThumbnailUpload extends React.PureComponent
{
upload() {
const { upload, updatePublishForm, closeModal, file } = this.props;
- upload(file);
- updatePublishForm({ thumbnailPath: file.path });
- closeModal();
+ if (file) {
+ upload(file);
+ updatePublishForm({ thumbnailPath: file.path });
+ closeModal();
+ }
}
render() {
const { closeModal, file } = this.props;
+ const filePath = file && (file.path || file.name);
return (
{
>
- {file.path || file.name}
+ {filePath}
);
}
diff --git a/ui/modal/modalImageUpload/index.js b/ui/modal/modalImageUpload/index.js
index 8a7428e4e..f44a80f8c 100644
--- a/ui/modal/modalImageUpload/index.js
+++ b/ui/modal/modalImageUpload/index.js
@@ -2,10 +2,8 @@ import { connect } from 'react-redux';
import { doHideModal } from 'redux/actions/app';
import ModalImageUpload from './view';
-const perform = dispatch => () => ({
- closeModal: () => {
- dispatch(doHideModal());
- },
+const perform = dispatch => ({
+ closeModal: () => dispatch(doHideModal()),
});
export default connect(null, perform)(ModalImageUpload);
diff --git a/ui/modal/modalImageUpload/view.jsx b/ui/modal/modalImageUpload/view.jsx
index dc0ad52a2..c5f5e3871 100644
--- a/ui/modal/modalImageUpload/view.jsx
+++ b/ui/modal/modalImageUpload/view.jsx
@@ -8,7 +8,7 @@ type Props = {
currentValue: string,
title: string,
helpText: string,
- onUpdate: string => void,
+ onUpdate: (string, boolean) => void,
assetName: string,
};
@@ -18,7 +18,7 @@ function ModalImageUpload(props: Props) {
return (
onUpdate(v)}
+ onUpdate={(a, b) => onUpdate(a, b)}
currentValue={currentValue}
assetName={assetName}
recommended={helpText}
diff --git a/ui/scss/component/_channel.scss b/ui/scss/component/_channel.scss
index 00d48c7bc..28df3462a 100644
--- a/ui/scss/component/_channel.scss
+++ b/ui/scss/component/_channel.scss
@@ -84,7 +84,7 @@ $actions-z-index: 2;
margin-right: var(--spacing-xs);
}
-.chanel-thumbnail--waiting {
+.channel-thumbnail--waiting {
background-color: var(--color-gray-5);
border-radius: var(--border-radius);
padding-top: 4rem;