diff --git a/packages/decap-cms-core/src/components/Collection/Entries/EntryCard.js b/packages/decap-cms-core/src/components/Collection/Entries/EntryCard.js index 99b4361201b1..55e96fdbc662 100644 --- a/packages/decap-cms-core/src/components/Collection/Entries/EntryCard.js +++ b/packages/decap-cms-core/src/components/Collection/Entries/EntryCard.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import styled from '@emotion/styled'; import { connect } from 'react-redux'; import { Link } from 'react-router-dom'; @@ -86,7 +86,7 @@ const CardBody = styled.div` } `; -const CardImage = styled.div` +const StyledImage = styled.div` background-image: url(${props => props.src}); background-position: center center; background-size: cover; @@ -131,6 +131,16 @@ const WorkflowBadge = styled.span` }}; `; +function CardImage({ getAsset, value, field }) { + const [asset, setAsset] = useState(null); + + useEffect(() => { + setAsset(value ? getAsset(value, field) : null); + }, [value, field, getAsset]); + + return asset ? : null; +} + function EntryCard({ path, summary, @@ -192,7 +202,7 @@ function EntryCard({ - {image ? : null} + {image ? : null} ); diff --git a/packages/decap-cms-widget-file/src/withFileControl.js b/packages/decap-cms-widget-file/src/withFileControl.js index 115f129dc2aa..839375d610db 100644 --- a/packages/decap-cms-widget-file/src/withFileControl.js +++ b/packages/decap-cms-widget-file/src/withFileControl.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import styled from '@emotion/styled'; @@ -61,8 +61,19 @@ const StyledImage = styled.img` object-fit: contain; `; -function Image(props) { - return ; +function Image({ value, field, getAsset }) { + const [asset, setAsset] = useState(null); + + useEffect(() => { + if (value) { + const newAsset = getAsset(value, field); + setAsset(newAsset); + } else { + setAsset(null); + } + }, [value, field, getAsset]); + + return asset ? : null; } function SortableImageButtons({ onRemove, onReplace }) { @@ -89,7 +100,7 @@ function SortableImage(props) { return (
- + { const { getAsset, value, field } = this.props; const items = valueListToSortableArray(value); + if (isMultiple(value)) { return ( - + ); }; diff --git a/packages/decap-cms-widget-image/src/ImagePreview.js b/packages/decap-cms-widget-image/src/ImagePreview.js index 36d8f7c0cd3e..f34f90636b94 100644 --- a/packages/decap-cms-widget-image/src/ImagePreview.js +++ b/packages/decap-cms-widget-image/src/ImagePreview.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import styled from '@emotion/styled'; import { List } from 'immutable'; @@ -11,13 +11,26 @@ const StyledImage = styled(({ src }) => ; + const [asset, setAsset] = useState(null); + + useEffect(() => { + if (!value) { + setAsset(null); + return; + } + + if (typeof File !== 'undefined' && value instanceof File) { + const objectUrl = URL.createObjectURL(value); + setAsset(objectUrl); + + return () => URL.revokeObjectURL(objectUrl); + } + + const newAsset = getAsset(value, field); + setAsset(newAsset); + }, [value, field, getAsset]); + + return asset ? : null; } function ImagePreviewContent(props) { diff --git a/packages/decap-cms-widget-object/src/ObjectPreview.js b/packages/decap-cms-widget-object/src/ObjectPreview.js index 439db4a7196a..5209503eb75e 100644 --- a/packages/decap-cms-widget-object/src/ObjectPreview.js +++ b/packages/decap-cms-widget-object/src/ObjectPreview.js @@ -1,5 +1,5 @@ import React from 'react'; -import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; import { WidgetPreviewContainer } from 'decap-cms-ui-default'; import { fromJS } from 'immutable'; @@ -15,7 +15,7 @@ function ObjectPreview({ field }) { } ObjectPreview.propTypes = { - field: PropTypes.node, + field: ImmutablePropTypes.map, }; export default ObjectPreview;