PluginProbe ʕ •ᴥ•ʔ
GenerateBlocks / 2.1.1
GenerateBlocks v2.1.1
trunk 1.0 1.0.1 1.0.2 1.1.0 1.1.1 1.1.2 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.7.0 1.7.1 1.7.2 1.7.3 1.8.0 1.8.1 1.8.2 1.8.3 1.9.0 1.9.1 2.0.0 2.0.1 2.0.2 2.1.0 2.1.1 2.1.2 2.2.0 2.2.1 2.3.0
generateblocks / src / blocks / image / edit.js
generateblocks / src / blocks / image Last commit date
components 1 year ago css 2 years ago attributes.js 1 year ago edit.js 2 years ago editor.scss 3 years ago index.js 1 year ago save.js 4 years ago transforms.js 1 year ago
edit.js
207 lines
1 import './editor.scss';
2 import ImageContentRenderer from './components/ImageContentRenderer';
3 import { compose } from '@wordpress/compose';
4 import withDynamicContent from '../../extend/dynamic-content/hoc/withDynamicContent';
5 import { withDeviceType, withUniqueId } from '../../hoc';
6 import ComponentCSS from './components/ComponentCSS';
7 import { useDispatch, useSelect } from '@wordpress/data';
8 import { useEffect, useState } from '@wordpress/element';
9 import { store as noticesStore } from '@wordpress/notices';
10 import ImageSettingsControls from './components/inspector-controls/ImageSettingsControl';
11 import { InspectorAdvancedControls, store as blockEditorStore } from '@wordpress/block-editor';
12 import { useEntityProp } from '@wordpress/core-data';
13 import { getBlobByURL, isBlobURL, revokeBlobURL } from '@wordpress/blob';
14 import HTMLAnchor from '../../components/html-anchor';
15 import { pick } from 'lodash';
16 import { withBlockContext } from '../../block-context';
17 import GenerateBlocksInspectorControls from '../../extend/inspector-control';
18 import { applyFilters } from '@wordpress/hooks';
19 import getDeviceType from '../../utils/get-device-type';
20 import withImageLegacyMigration from '../../hoc/withImageLegacyMigration';
21 import withSetAttributes from '../../hoc/withSetAttributes';
22
23 function ImageEdit( props ) {
24 const {
25 attributes,
26 setAttributes,
27 context,
28 ContentRenderer = ImageContentRenderer,
29 } = props;
30
31 const {
32 useDynamicData,
33 dynamicContentType,
34 sizeSlug,
35 mediaId,
36 mediaUrl,
37 anchor,
38 } = attributes;
39
40 const deviceType = getDeviceType();
41 const { createErrorNotice } = useDispatch( noticesStore );
42 const [ temporaryURL, setTemporaryURL ] = useState();
43 const postType = 'post-type' === attributes.dynamicSource ? attributes.postType : context.postType;
44 const postId = 'post-type' === attributes.dynamicSource ? attributes.postId : context.postId;
45 const [ featuredImage ] = useEntityProp( 'postType', postType, 'featured_media', postId );
46 const isTemporaryImage = ( id, url ) => ! id && isBlobURL( url );
47
48 const { mediaUpload } = useSelect( ( select ) => {
49 const { getSettings } = select( blockEditorStore );
50 return pick( getSettings(), [ 'imageDefaultSize', 'mediaUpload' ] );
51 }, [] );
52
53 const onSelectImage = ( image ) => {
54 if ( ! image || ! image.url ) {
55 setAttributes( {
56 mediaUrl: undefined,
57 mediaId: undefined,
58 title: undefined,
59 alt: undefined,
60 } );
61
62 return;
63 }
64
65 if ( isBlobURL( image.url ) ) {
66 setTemporaryURL( image.url );
67 return;
68 }
69
70 setTemporaryURL();
71
72 if (
73 !! image &&
74 (
75 ! useDynamicData ||
76 (
77 !! useDynamicData &&
78 ! dynamicContentType
79 )
80 )
81 ) {
82 const imageUrl = ( image?.sizes && image?.sizes[ sizeSlug ]?.url ) || image?.url;
83
84 setAttributes( {
85 mediaId: image?.id,
86 mediaUrl: imageUrl,
87 alt: image?.alt,
88 title: image?.title,
89 } );
90 }
91 };
92
93 const onSelectURL = ( newURL ) => {
94 if ( newURL !== mediaUrl ) {
95 setAttributes( {
96 mediaUrl: newURL,
97 mediaId: undefined,
98 title: '',
99 alt: '',
100 } );
101 }
102 };
103
104 const onUploadError = ( message ) => {
105 createErrorNotice( message[ 2 ], { type: 'snackbar' } );
106 };
107
108 const onResetImage = () => {
109 setAttributes( {
110 mediaId: undefined,
111 mediaUrl: '',
112 alt: '',
113 title: '',
114 width: '',
115 widthTablet: '',
116 widthMobile: '',
117 height: '',
118 heightTablet: '',
119 heightMobile: '',
120 } );
121 };
122
123 useEffect( () => {
124 if ( ! sizeSlug ) {
125 setAttributes( { sizeSlug: 'full' } );
126 }
127 }, [] );
128
129 let isTemp = isTemporaryImage( mediaId, mediaUrl );
130
131 // Upload a temporary image on mount.
132 useEffect( () => {
133 if ( ! isTemp ) {
134 return;
135 }
136
137 const file = getBlobByURL( mediaUrl );
138
139 if ( file ) {
140 mediaUpload( {
141 filesList: [ file ],
142 onFileChange: ( [ img ] ) => {
143 onSelectImage( img );
144 },
145 allowedTypes: [ 'image' ],
146 onError: ( message ) => {
147 isTemp = false;
148 onUploadError( message );
149 },
150 } );
151 }
152 }, [] );
153
154 // If an image is temporary, revoke the Blob url when it is uploaded (and is
155 // no longer temporary).
156 useEffect( () => {
157 if ( isTemp ) {
158 setTemporaryURL( mediaUrl );
159 return;
160 }
161 revokeBlobURL( temporaryURL );
162 }, [ isTemp, mediaUrl ] );
163
164 return (
165 <>
166 <GenerateBlocksInspectorControls
167 attributes={ attributes }
168 setAttributes={ setAttributes }
169 >
170 { applyFilters( 'generateblocks.editor.settingsPanel', undefined, { ...props, device: deviceType } ) }
171
172 <ImageSettingsControls
173 attributes={ attributes }
174 setAttributes={ setAttributes }
175 deviceType={ deviceType }
176 />
177 </GenerateBlocksInspectorControls>
178
179 <InspectorAdvancedControls>
180 <HTMLAnchor { ...props } anchor={ anchor } />
181 </InspectorAdvancedControls>
182
183 <ComponentCSS { ...props } deviceType={ deviceType } />
184
185 <ContentRenderer
186 { ...props }
187 temporaryURL={ temporaryURL }
188 featuredImage={ featuredImage }
189 onSelectImage={ onSelectImage }
190 onSelectURL={ onSelectURL }
191 onUploadError={ onUploadError }
192 onResetImage={ onResetImage }
193 deviceType={ deviceType }
194 />
195 </>
196 );
197 }
198
199 export default compose(
200 withSetAttributes,
201 withDeviceType,
202 withBlockContext,
203 withDynamicContent,
204 withUniqueId,
205 withImageLegacyMigration
206 )( ImageEdit );
207