saleor-dashboard/src/components/ImageUpload/ImageUpload.tsx

114 lines
3.2 KiB
TypeScript
Raw Normal View History

2019-06-19 14:40:52 +00:00
import {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import { fade } from "@material-ui/core/styles/colorManipulator";
import Typography from "@material-ui/core/Typography";
import classNames from "classnames";
2019-08-09 10:26:22 +00:00
import React from "react";
import { FormattedMessage } from "react-intl";
2019-06-19 14:40:52 +00:00
import ImageIcon from "../../icons/Image";
import Dropzone from "../Dropzone";
interface ImageUploadProps {
children?: (props: { isDragActive: boolean }) => React.ReactNode;
className?: string;
disableClick?: boolean;
isActiveClassName?: string;
iconContainerClassName?: string;
iconContainerActiveClassName?: string;
onImageUpload: (file: File) => void;
}
2019-10-28 16:16:49 +00:00
const styles = theme =>
2019-06-19 14:40:52 +00:00
createStyles({
containerDragActive: {
background: fade(theme.palette.primary.main, 0.1),
color: theme.palette.primary.main
},
fileField: {
display: "none"
},
imageContainer: {
background: "#ffffff",
border: "1px solid #eaeaea",
2019-10-28 16:16:49 +00:00
borderRadius: theme.spacing(),
2019-06-19 14:40:52 +00:00
height: 148,
justifySelf: "start",
overflow: "hidden",
2019-10-28 16:16:49 +00:00
padding: theme.spacing(2),
2019-06-19 14:40:52 +00:00
position: "relative",
transition: theme.transitions.duration.standard + "s",
width: 148
},
photosIcon: {
height: "64px",
margin: "0 auto",
width: "64px"
},
photosIconContainer: {
2019-10-28 16:16:49 +00:00
padding: theme.spacing(5, 0),
2019-06-19 14:40:52 +00:00
textAlign: "center"
},
uploadText: {
2019-10-28 16:16:49 +00:00
color: theme.typography.body1.color,
2019-10-21 09:55:21 +00:00
fontSize: 12,
fontWeight: 600,
2019-06-19 14:40:52 +00:00
textTransform: "uppercase"
}
});
export const ImageUpload = withStyles(styles, { name: "ImageUpload" })(
({
children,
classes,
className,
disableClick,
isActiveClassName,
iconContainerActiveClassName,
iconContainerClassName,
onImageUpload
}: ImageUploadProps & WithStyles<typeof styles>) => (
<Dropzone
disableClick={disableClick}
onDrop={files => onImageUpload(files[0])}
>
{({ isDragActive, getInputProps, getRootProps }) => (
<>
<div
{...getRootProps()}
className={classNames({
[classes.photosIconContainer]: true,
[classes.containerDragActive]: isDragActive,
[className]: !!className,
[isActiveClassName]: !!isActiveClassName && isDragActive
})}
>
<div
className={classNames({
[iconContainerClassName]: !!iconContainerClassName,
[iconContainerActiveClassName]:
!!iconContainerActiveClassName && isDragActive
})}
>
<input {...getInputProps()} className={classes.fileField} />
<ImageIcon className={classes.photosIcon} />
2019-10-21 09:55:21 +00:00
<Typography className={classes.uploadText}>
<FormattedMessage
defaultMessage="Drop here to upload"
description="image upload"
/>
2019-06-19 14:40:52 +00:00
</Typography>
</div>
</div>
{children && children({ isDragActive })}
</>
)}
</Dropzone>
)
);
ImageUpload.displayName = "ImageUpload";
export default ImageUpload;