PromucFlow_constructor/app/client/src/components/designSystems/appsmith/ImageComponent.tsx

81 lines
1.6 KiB
TypeScript
Raw Normal View History

2019-11-05 05:09:50 +00:00
import * as React from "react";
import { ComponentProps } from "./BaseComponent";
import styled from "styled-components";
export interface StyledImageProps {
2019-11-14 17:06:32 +00:00
defaultImageUrl: string;
imageUrl?: string;
backgroundColor?: string;
2019-11-14 17:06:32 +00:00
}
export const StyledImage = styled.div<
StyledImageProps & {
imageError: boolean;
}
>`
position: relative;
display: flex;
flex-direction: "row";
background: ${props => props.backgroundColor};
background-image: url("${props =>
props.imageError ? props.defaultImageUrl : props.imageUrl}");
background-position: center;
background-repeat: no-repeat;
background-size: contain;
height: 100%;
width: 100%;
2019-11-05 05:09:50 +00:00
`;
class ImageComponent extends React.Component<
ImageComponentProps,
{
imageError: boolean;
}
> {
constructor(props: ImageComponentProps) {
super(props);
this.state = {
imageError: false,
};
}
2019-11-05 05:09:50 +00:00
render() {
2019-12-03 04:41:10 +00:00
return (
<StyledImage
className={this.props.isLoading ? "bp3-skeleton" : ""}
imageError={this.state.imageError}
2019-12-03 04:41:10 +00:00
{...this.props}
>
<img
style={{
display: "none",
}}
alt={this.props.widgetName}
src={this.props.imageUrl}
onError={this.onImageError}
onLoad={this.onImageLoad}
></img>
</StyledImage>
2019-12-03 04:41:10 +00:00
);
2019-11-05 05:09:50 +00:00
}
onImageError = () => {
this.setState({
imageError: true,
});
};
onImageLoad = () => {
this.setState({
imageError: false,
});
};
2019-11-05 05:09:50 +00:00
}
export interface ImageComponentProps extends ComponentProps {
imageUrl: string;
defaultImageUrl: string;
2019-12-03 04:41:10 +00:00
isLoading: boolean;
2019-11-05 05:09:50 +00:00
}
export default ImageComponent;