in fronts-client/src/components/inputs/InputImage.tsx [306:488]
public render() {
const {
small = false,
input,
gridUrl: gridBaseUrl,
useDefault,
defaultImageUrl,
message = 'Replace image',
hasVideo,
disabled,
isSelected,
isInvalid,
criteria,
} = this.props;
const imageDims = this.getCurrentImageDimensions();
if (!gridBaseUrl) {
return (
<div>
<code>gridUrl</code> config value missing
</div>
);
}
const isImgFromGrid = defaultImageUrl
? regexToCheckGridImage.test(defaultImageUrl)
: false;
const hasImage = !useDefault && !!input.value && !!input.value.thumb;
const imageUrl =
!useDefault && input.value && input.value.thumb
? input.value.thumb
: defaultImageUrl;
// e.g. https://media.guim.co.uk/db6bf997dee6d43f8dca1ab9cd2c7402725434b6/0_214_3960_2376/500.jpg
const maybeDefaultImagePathParts =
defaultImageUrl && new URL(defaultImageUrl).pathname.split('/');
const maybeDefaultImageId = maybeDefaultImagePathParts?.[1]; // pathname starts with / so index 0 is empty string
const maybeDefaultCropId = maybeDefaultImagePathParts?.[2];
const gridUrl =
this.state.isRecropping && maybeDefaultImageId && maybeDefaultCropId
? `${gridBaseUrl}/images/${maybeDefaultImageId}/crop?seedCropId=${maybeDefaultCropId}&`
: `${gridBaseUrl}?`;
const gridModalUrl = `${gridUrl}${new URLSearchParams(
this.criteriaToGridQueryParams(),
).toString()}`;
const portraitImage = !!(
!useDefault &&
imageDims &&
imageDims.height > imageDims.width
);
const shouldShowPortrait =
criteria != null &&
this.compareAspectRatio(portraitCardImageCriteria, criteria);
const shouldShowLandscape54 =
criteria != null &&
this.compareAspectRatio(landscape5To4CardImageCriteria, criteria);
const showSquare =
criteria != null &&
this.compareAspectRatio(squareImageCriteria, criteria);
return (
<InputImageContainer
small={small}
isDragging={this.state.isDragging}
isSelected={isSelected}
isInvalid={isInvalid}
confirmDelete={this.state.confirmDelete}
>
<GridModal
url={gridModalUrl}
isOpen={this.state.modalOpen}
onClose={this.closeModal}
onMessage={this.onMessage}
/>
<DragIntentContainer
active
onIntentConfirm={() => this.setState({ isDragging: true })}
onDragIntentStart={() => this.setState({ isDragging: true })}
onDragIntentEnd={() => this.setState({ isDragging: false })}
>
<ImageContainer
small={small}
shouldShowPortrait={shouldShowPortrait}
shouldShowLandscape54={shouldShowLandscape54}
showSquare={showSquare}
>
<ImageComponent
style={{
backgroundImage: `url(${imageUrl}`,
}}
draggable
onDragStart={this.handleDragStart}
onDrop={this.handleDrop}
small={small}
portrait={portraitImage}
shouldShowLandscape54={shouldShowLandscape54}
showSquare={showSquare}
shouldShowPortrait={shouldShowPortrait}
>
{hasImage ? (
<>
<ButtonDelete
type="button"
priority="primary"
onClick={this.handleDelete}
disabled={disabled}
confirmDelete={this.state.confirmDelete}
>
<DeleteIconOptions>
{this.state.confirmDelete ? (
<ConfirmDeleteIcon size="s" />
) : (
<RubbishBinIcon size="s" />
)}
</DeleteIconOptions>
</ButtonDelete>
{isInvalid ? (
<ButtonWarning>
<IconWarning>
<WarningIcon size="s" />
</IconWarning>
</ButtonWarning>
) : null}
</>
) : (
<AddImageViaGridModalButton>
<AddImageButton
type="button"
onClick={this.openModal(false)}
small={small}
disabled={disabled}
>
<AddImageIcon size="l" />
{!!small ? null : <Label size="sm">{message}</Label>}
</AddImageButton>
{isImgFromGrid && (
<AddImageButton
type="button"
onClick={this.openModal(true)}
small={small}
disabled={disabled}
>
<CropIcon size="l" fill={theme.colors.white} />
{!!small ? null : <Label size="sm">Recrop image</Label>}
</AddImageButton>
)}
</AddImageViaGridModalButton>
)}
{hasVideo && useDefault && (
<VideoIconContainer title="This media has video content.">
<VideoIcon />
</VideoIconContainer>
)}
</ImageComponent>
{!!small ? null : (
<AddImageViaUrlInput>
<ImageUrlInput
name="paste-url"
placeholder=" Paste crop url"
defaultValue={
this.state.imageSrc || (input.value && input.value.origin)
}
onChange={this.handlePasteImgSrcChange}
onFocus={this.handleFocus}
ref={this.inputRef}
disabled={disabled}
/>
<InputLabel hidden htmlFor="paste-url">
Paste crop url
</InputLabel>
</AddImageViaUrlInput>
)}
</ImageContainer>
</DragIntentContainer>
{this.state.isDragging && <ImageDragIntentIndicator />}
{this.state.isValidating && <ValidatingSpinnerOverlay />}
</InputImageContainer>
);
}