// @flow import * as MODALS from 'constants/modal_types'; import * as THUMBNAIL_STATUSES from 'constants/thumbnail_upload_statuses'; import Lbry from 'lbry'; import { DOMAIN } from 'config'; import * as React from 'react'; import { FormField } from 'component/common/form'; import FileSelector from 'component/common/file-selector'; import Button from 'component/button'; import ThumbnailMissingImage from './thumbnail-missing.png'; import ThumbnailBrokenImage from './thumbnail-broken.png'; type Props = { filePath: ?string, fileInfos: { [string]: FileListItem }, myClaimForUri: ?StreamClaim, thumbnail: ?string, formDisabled: boolean, uploadThumbnailStatus: string, thumbnailPath: ?string, thumbnailError: ?string, thumbnailParam: ?string, thumbnailParamError: boolean, thumbnailParamStatus: string, openModal: (id: string, {}) => void, updatePublishForm: ({}) => void, updateThumbnailParams: ({}) => void, resetThumbnailStatus: () => void, }; function SelectThumbnail(props: Props) { const { filePath, fileInfos, myClaimForUri, formDisabled, uploadThumbnailStatus: status, openModal, updatePublishForm, thumbnailParam, thumbnailParamStatus, updateThumbnailParams, thumbnailPath, resetThumbnailStatus, } = props; const publishForm = !updateThumbnailParams; const thumbnail = publishForm ? props.thumbnail : thumbnailParam; const thumbnailError = publishForm ? props.thumbnailError : props.thumbnailParamError; const accept = '.png, .jpg, .jpeg, .gif'; const manualInput = status === THUMBNAIL_STATUSES.API_DOWN || status === THUMBNAIL_STATUSES.MANUAL; const thumbUploaded = status === THUMBNAIL_STATUSES.COMPLETE && thumbnail; const isUrlInput = thumbnail !== ThumbnailMissingImage && thumbnail !== ThumbnailBrokenImage; const outpoint = myClaimForUri ? `${myClaimForUri.txid}:${myClaimForUri.nout}` : undefined; const fileInfo = outpoint ? fileInfos[outpoint] : undefined; const downloadPath = fileInfo ? fileInfo.download_path : undefined; const actualFilePath = filePath || downloadPath; let isSupportedVideo = false; if (typeof actualFilePath === 'string') { isSupportedVideo = Lbry.getMediaType(null, actualFilePath) === 'video'; } else if (actualFilePath && actualFilePath.type) { isSupportedVideo = actualFilePath.type.split('/')[0] === 'video'; } function handleThumbnailChange(e: SyntheticInputEvent<*>) { const newThumbnail = e.target.value.replace(' ', ''); if (updateThumbnailParams) { updateThumbnailParams({ thumbnail_url: newThumbnail }); } else { updatePublishForm({ thumbnail: newThumbnail }); } } React.useEffect(() => { if (updateThumbnailParams && status !== thumbnailParamStatus) { updateThumbnailParams({ thumbnail_status: status }); } }, [status, thumbnailParamStatus, updateThumbnailParams]); let thumbnailSrc; if (!thumbnail) { thumbnailSrc = ThumbnailMissingImage; } else if (thumbnailError) { thumbnailSrc = (manualInput && ThumbnailBrokenImage) || (status !== THUMBNAIL_STATUSES.COMPLETE && ThumbnailMissingImage); } else { thumbnailSrc = thumbnail; } /* Note: We are using backgroundImage instead of an to zoom if the selected thumbnail isn't the proper aspect ratio. This is to avoid blackbars on the side of images and inconsistent thumbnails We still need to render the image to see if there is an error loading the url */ const thumbPreview = (
{__('Upload complete.')}
{__('Uploading thumbnail')}...
} {!thumbUploaded && ({manualInput ? __('Enter a URL for your thumbnail.') : __('Upload your thumbnail to %domain%. Recommended ratio is 16:9, 2MB max.', { domain: DOMAIN })}
)} > ); } export default SelectThumbnail;