Skip to content

Commit a179405

Browse files
authored
Merge pull request #749 from 10up/feat/724
feat/724: Adds "Generate image" button to media upload components
2 parents becd5d9 + a1d3a7d commit a179405

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

.eslintrc.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"_": "readonly",
2020
"File": "readonly",
2121
"Headers": "readonly",
22-
"requestAnimationFrame": "readonly"
22+
"requestAnimationFrame": "readonly",
23+
"React": "readonly"
2324
},
2425
"extends": ["plugin:@wordpress/eslint-plugin/recommended"],
2526
"ignorePatterns": ["*.json"]

includes/Classifai/Features/ImageGeneration.php

+8
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ public function enqueue_admin_scripts( string $hook_suffix = '' ) {
209209
true
210210
);
211211

212+
wp_enqueue_script(
213+
'classifai-extend-image-blocks',
214+
CLASSIFAI_PLUGIN_URL . 'dist/extend-image-blocks.js',
215+
get_asset_info( 'extend-image-blocks', 'dependencies' ),
216+
get_asset_info( 'extend-image-blocks', 'version' ),
217+
true
218+
);
219+
212220
/**
213221
* Filter the default attribution added to generated images.
214222
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { Button } from '@wordpress/components';
2+
import { _nx } from '@wordpress/i18n';
3+
import { useBlockProps } from '@wordpress/block-editor';
4+
5+
const allowedCoreBlocks = [
6+
'core/image',
7+
'core/gallery',
8+
'core/media-text',
9+
'core/cover',
10+
];
11+
12+
/**
13+
* Adds a `Generate image` button to the media-related blocks.
14+
* @see {@link https://github.com/10up/classifai/issues/724}
15+
*
16+
* @param {React.ReactNode} Component The Wrapped Media upload component.
17+
* @return {React.ReactNode} The transformed Media upload component.
18+
*/
19+
function addImageGenerationLink( Component ) {
20+
return function ( props ) {
21+
const { render, ...rest } = props;
22+
let blockProps;
23+
24+
try {
25+
blockProps = useBlockProps();
26+
} catch ( e ) {
27+
return <Component { ...props } />;
28+
}
29+
30+
const { 'data-type': blockName } = blockProps;
31+
32+
if ( ! allowedCoreBlocks.includes( blockName ) ) {
33+
return <Component { ...props } />;
34+
}
35+
36+
let isSingle = 1;
37+
38+
if ( blockName && 'core/gallery' === blockName ) {
39+
isSingle = Infinity;
40+
}
41+
42+
return (
43+
<>
44+
<Component
45+
{ ...rest }
46+
mode="generate"
47+
render={ ( { open } ) => (
48+
<Button variant="tertiary" onClick={ open }>
49+
{ _nx(
50+
'Generate image',
51+
'Generate images',
52+
isSingle,
53+
'Image or gallery upload',
54+
'classifai'
55+
) }
56+
</Button>
57+
) }
58+
/>
59+
<Component { ...props } />
60+
</>
61+
);
62+
};
63+
}
64+
65+
wp.hooks.addFilter(
66+
'editor.MediaUpload',
67+
'classifai/image-generation-link',
68+
addImageGenerationLink
69+
);

webpack.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module.exports = {
4242
'generate-image-media-upload': [
4343
'./src/js/media-modal/views/generate-image-media-upload.js',
4444
],
45+
'extend-image-blocks': './src/js/extend-image-block-generate-image.js',
4546
},
4647
module: {
4748
rules: [

0 commit comments

Comments
 (0)