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;