2022-01-28 12:34:20 +00:00
|
|
|
import { CircularProgress } from "@material-ui/core";
|
2019-06-19 14:40:52 +00:00
|
|
|
import EditIcon from "@material-ui/icons/Edit";
|
2022-01-28 12:34:20 +00:00
|
|
|
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
|
2019-11-28 15:17:39 +00:00
|
|
|
import classNames from "classnames";
|
|
|
|
import React from "react";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2019-12-03 15:28:40 +00:00
|
|
|
const useStyles = makeStyles(
|
|
|
|
theme => ({
|
2021-03-17 13:07:48 +00:00
|
|
|
media: {
|
2019-12-03 15:28:40 +00:00
|
|
|
height: "100%",
|
|
|
|
objectFit: "contain",
|
|
|
|
userSelect: "none",
|
|
|
|
width: "100%"
|
|
|
|
},
|
2021-03-17 13:07:48 +00:00
|
|
|
mediaContainer: {
|
2019-12-03 15:28:40 +00:00
|
|
|
"&:hover, &.dragged": {
|
2021-03-17 13:07:48 +00:00
|
|
|
"& $mediaOverlay": {
|
2019-12-03 15:28:40 +00:00
|
|
|
display: "block"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
background: theme.palette.background.paper,
|
|
|
|
border: `1px solid ${theme.palette.divider}`,
|
|
|
|
borderRadius: theme.spacing(),
|
|
|
|
height: 148,
|
|
|
|
overflow: "hidden",
|
|
|
|
padding: theme.spacing(2),
|
|
|
|
position: "relative",
|
|
|
|
width: 148
|
|
|
|
},
|
2021-03-17 13:07:48 +00:00
|
|
|
mediaOverlay: {
|
2019-12-03 15:28:40 +00:00
|
|
|
background: "rgba(0, 0, 0, 0.6)",
|
|
|
|
cursor: "move",
|
|
|
|
display: "none",
|
|
|
|
height: 148,
|
|
|
|
left: 0,
|
|
|
|
position: "absolute",
|
|
|
|
top: 0,
|
|
|
|
width: 148
|
|
|
|
},
|
2021-03-17 13:07:48 +00:00
|
|
|
mediaOverlayShadow: {
|
|
|
|
"&mediaOverlay": {
|
2019-12-03 15:28:40 +00:00
|
|
|
alignItems: "center",
|
|
|
|
display: "flex",
|
|
|
|
justifyContent: "center"
|
2019-10-30 14:34:24 +00:00
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
},
|
2021-03-17 13:07:48 +00:00
|
|
|
mediaOverlayToolbar: {
|
2019-11-28 15:17:39 +00:00
|
|
|
display: "flex",
|
2019-12-03 15:28:40 +00:00
|
|
|
justifyContent: "flex-end"
|
2019-11-28 15:17:39 +00:00
|
|
|
}
|
2019-12-03 15:28:40 +00:00
|
|
|
}),
|
2021-03-17 13:07:48 +00:00
|
|
|
{ name: "MediaTile" }
|
2019-12-03 15:28:40 +00:00
|
|
|
);
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2021-03-17 13:07:48 +00:00
|
|
|
interface MediaTileProps {
|
|
|
|
media: {
|
|
|
|
alt: string;
|
2019-06-19 14:40:52 +00:00
|
|
|
url: string;
|
2021-03-17 13:07:48 +00:00
|
|
|
type?: string;
|
|
|
|
oembedData?: string;
|
2019-06-19 14:40:52 +00:00
|
|
|
};
|
2019-11-28 15:17:39 +00:00
|
|
|
loading?: boolean;
|
2021-03-17 13:07:48 +00:00
|
|
|
onDelete?: () => void;
|
|
|
|
onEdit?: (event: React.ChangeEvent<any>) => void;
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
|
2021-03-17 13:07:48 +00:00
|
|
|
const MediaTile: React.FC<MediaTileProps> = props => {
|
|
|
|
const { loading, onDelete, onEdit, media } = props;
|
2019-10-30 14:34:24 +00:00
|
|
|
const classes = useStyles(props);
|
2021-03-17 13:07:48 +00:00
|
|
|
const parsedMediaOembedData = media?.oembedData
|
|
|
|
? JSON.parse(media.oembedData)
|
|
|
|
: null;
|
|
|
|
const mediaUrl = parsedMediaOembedData?.thumbnail_url || media.url;
|
2019-10-30 14:34:24 +00:00
|
|
|
|
|
|
|
return (
|
2022-02-11 11:28:55 +00:00
|
|
|
<div className={classes.mediaContainer} data-test-id="product-image">
|
2019-11-28 15:17:39 +00:00
|
|
|
<div
|
2021-03-17 13:07:48 +00:00
|
|
|
className={classNames(classes.mediaOverlay, {
|
|
|
|
[classes.mediaOverlayShadow]: loading
|
2019-11-28 15:17:39 +00:00
|
|
|
})}
|
|
|
|
>
|
|
|
|
{loading ? (
|
|
|
|
<CircularProgress size={32} />
|
|
|
|
) : (
|
2021-03-17 13:07:48 +00:00
|
|
|
<div className={classes.mediaOverlayToolbar}>
|
|
|
|
{onEdit && (
|
2022-01-28 12:34:20 +00:00
|
|
|
<IconButton variant="secondary" color="primary" onClick={onEdit}>
|
2019-11-28 15:17:39 +00:00
|
|
|
<EditIcon />
|
|
|
|
</IconButton>
|
|
|
|
)}
|
2021-03-17 13:07:48 +00:00
|
|
|
{onDelete && (
|
|
|
|
<IconButton color="primary" onClick={onDelete}>
|
2019-11-28 15:17:39 +00:00
|
|
|
<DeleteIcon />
|
|
|
|
</IconButton>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
)}
|
2019-06-19 14:40:52 +00:00
|
|
|
</div>
|
2021-03-17 13:07:48 +00:00
|
|
|
<img className={classes.media} src={mediaUrl} alt={media.alt} />
|
2019-06-19 14:40:52 +00:00
|
|
|
</div>
|
2019-10-30 14:34:24 +00:00
|
|
|
);
|
|
|
|
};
|
2021-03-17 13:07:48 +00:00
|
|
|
MediaTile.displayName = "MediaTile";
|
|
|
|
export default MediaTile;
|