Skip to content

Commit

Permalink
preview image middlware
Browse files Browse the repository at this point in the history
  • Loading branch information
dobri1408 committed Aug 21, 2024
1 parent c3630ca commit 5a0f8e9
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 5 deletions.
45 changes: 40 additions & 5 deletions src/Widgets/MapsWidget.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useMemo, useState } from 'react';
import React, { useMemo, useState, useEffect } from 'react';
import { useIntl, FormattedMessage, defineMessages } from 'react-intl';
import { Icon } from '@plone/volto/components';
import { Button, Modal, Grid, Label, Input, Message } from 'semantic-ui-react';
Expand All @@ -7,6 +7,7 @@ import { FormFieldWrapper, InlineForm } from '@plone/volto/components';
import { addPrivacyProtectionToSchema } from '@eeacms/volto-embed';
import EmbedMap from '@eeacms/volto-embed/EmbedMap/EmbedMap';
import { MapsSchema } from '@eeacms/volto-embed/Blocks/Maps/schema';
import { getBaseUrl } from '@plone/volto/helpers';

import clearSVG from '@plone/volto/icons/clear.svg';
import aheadSVG from '@plone/volto/icons/ahead.svg';
Expand All @@ -19,6 +20,17 @@ const messages = defineMessages({
},
});

function blobToBase64(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
}

function MapEditorModal({ id, onClose, onChange, ...rest }) {
const intl = useIntl();
const [value, setValue] = useState(rest.value || {});
Expand Down Expand Up @@ -189,14 +201,37 @@ function MapEditorModal({ id, onClose, onChange, ...rest }) {
}

export default function MapsWidget(props) {
const { id, title, description, error, value } = props;
const { id, title, description, error, value, onChange } = props;
const [mapEditor, setMapEditor] = useState(false);

function onChange(value) {
props.onChange(props.id, value);
function onChangeMap(value) {
onChange(id, value);
setMapEditor(false);
}

useEffect(() => {
if (value && value.url && value.preview_url_loaded != value.url) {
fetch(
`${getBaseUrl(
'',
)}/cors-proxy/https://screenshot.eea.europa.eu/api/v1/retrieve_image_for_url?url=${encodeURIComponent(
value.url,
)}&w=1920&h=1000&waitfor=4000`,
)
.then((e) => e.blob())
.then((myBlob) => {
blobToBase64(myBlob).then((base64String) => {
onChange(id, {
...value,
preview: base64String,
preview_url_loaded: value.url,
});
});
})
.catch(() => {});
}
}, [value, onChange]);

return (
<FormFieldWrapper {...props} columns={1}>
<div className="wrapper">
Expand All @@ -218,7 +253,7 @@ export default function MapsWidget(props) {
<MapEditorModal
id={id}
value={value || {}}
onChange={onChange}
onChange={onChangeMap}
onClose={() => setMapEditor(false)}
/>
)}
Expand Down
5 changes: 5 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import installBlocks from './Blocks';
import MapView from './Views/MapView';
import MapsViewWidget from './Widgets/MapsViewWidget';
import MapsWidget from './Widgets/MapsWidget';
import { preview_image } from './middlewares/preview_image';
export {
PrivacyProtection,
addPrivacyProtectionToSchema,
Expand All @@ -16,5 +17,9 @@ export default function applyConfig(config) {
...config.settings.allowed_cors_destinations,
'screenshot.eea.europa.eu',
];
config.settings.storeExtenders = [
...(config.settings.storeExtenders || []),
preview_image,
];
return [installBlocks].reduce((acc, apply) => apply(acc), config);
}
91 changes: 91 additions & 0 deletions src/middlewares/preview_image.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import {
CREATE_CONTENT,
UPDATE_CONTENT,
} from '@plone/volto/constants/ActionTypes';

export const preview_image = (middlewares) => [
(store) => (next) => async (action) => {
if (![CREATE_CONTENT, UPDATE_CONTENT].includes(action.type)) {
return next(action);
}
const state = store.getState();
const contentData = state.content.data;
const lastPreviewImage = Object.keys(action?.request?.data).includes(
'preview_image',
)
? action?.request?.data.preview_image
: contentData?.preview_image;
const type = action?.request?.data?.['@type'] || contentData['@type'];

if (
!contentData ||
type !== 'map_interactive' ||
contentData.preview_image_saved ||
!action?.request?.data?.maps?.preview
) {
return next(action);
}

if (
lastPreviewImage &&
lastPreviewImage !== 'preview_image_generated_map_interactive.png'
) {
if (action?.request?.data?.maps) {
const mapVisualizationData = {
...action.request.data.maps,
};
if (
mapVisualizationData.preview &&
mapVisualizationData.preview_url_loaded
)
delete mapVisualizationData.preview;
delete mapVisualizationData.preview_url_loaded;

return next({
...action,
request: {
...action.request,
data: {
...action.request.data,

maps: mapVisualizationData,
},
},
});
} else return next(action);
}

try {
const previewImage = {
preview_image: {
data: action.request.data.maps.preview.split(',')[1],
encoding: 'base64',
'content-type': 'image/png',
filename: 'preview_image_generated_map_interactive.png',
},
preview_image_saved: true,
};

const mapVisualizationData = {
...action.request.data.maps,
};
delete mapVisualizationData.preview;
delete mapVisualizationData.preview_url_loaded;

return next({
...action,
request: {
...action.request,
data: {
...action.request.data,
...previewImage,
maps: mapVisualizationData,
},
},
});
} catch (error) {
return next(action);
}
},
...middlewares,
];

0 comments on commit 5a0f8e9

Please sign in to comment.