PluginProbe
BeyondWords – AI audio for publishers / 4.6.0
BeyondWords – AI audio for publishers v4.6.0
7.2.0 7.1.0 trunk 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.1.0 4.1.1 4.1.2 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.3.0 4.4.0 4.5.0 4.5.1 4.6.0 4.6.1 4.6.2 All 44 releases
speechkit / src / Component / Post / GenerateAudio / index.js

index.js in BeyondWords – AI audio for publishers 4.6.0, at src/Component/Post/GenerateAudio/index.js

212 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * WordPress dependencies
3 */
4 import { __ } from '@wordpress/i18n';
5 import { CheckboxControl } from '@wordpress/components';
6 import { compose } from '@wordpress/compose';
7 import { withDispatch, withSelect } from '@wordpress/data';
8 import { Fragment, useEffect } from '@wordpress/element';
9
10 /**
11 * Internal dependencies
12 */
13 import GenerateAudioCheck from './check';
14
15 export function GenerateAudio( {
16 generateAudio,
17 generateAudioEdited,
18 setGenerateAudio,
19 wrapper,
20 } ) {
21 const Wrapper = wrapper || Fragment;
22
23 // Set "Generate audio" to "1" in the store when it has been preselected
24 useEffect( () => {
25 if ( ! generateAudioEdited && generateAudio ) {
26 setGenerateAudio( generateAudio );
27 }
28 }, [ generateAudioEdited, generateAudio ] );
29
30 return (
31 <GenerateAudioCheck>
32 <Wrapper>
33 <CheckboxControl
34 className="beyondwords--generate-audio"
35 label={ __( 'Generate audio', 'speechkit' ) }
36 checked={ generateAudio }
37 onChange={ () => {
38 setGenerateAudio( ! generateAudio );
39 } }
40 />
41 </Wrapper>
42 </GenerateAudioCheck>
43 );
44 }
45
46 export default compose( [
47 withSelect( ( select ) => {
48 const {
49 getCurrentPostAttribute,
50 getCurrentPostType,
51 getEditedPostAttribute,
52 getPostEdits,
53 } = select( 'core/editor' );
54
55 const { getGenerateAudioEdited } = select( 'beyondwords/interactions' );
56 const { getSettings } = select( 'beyondwords/settings' );
57
58 /**
59 * Get the Generate audio value.
60 *
61 * This is a little complex because it is also controlled (auto-checked/unchecked)
62 * based on the assigned Categories, and we need to be able to override it.
63 */
64 const getGenerateAudio = () => {
65 const { meta } = getPostEdits();
66
67 // Has "Generate audio" been edited in this session (manually checked or unchecked)?
68 if (
69 getGenerateAudioEdited() &&
70 meta &&
71 'beyondwords_generate_audio' in meta
72 ) {
73 return meta.beyondwords_generate_audio === '1';
74 }
75
76 // Check various custom fields in the saved post
77 const {
78 /* eslint-disable-next-line camelcase */
79 beyondwords_generate_audio,
80 /* eslint-disable-next-line camelcase */
81 speechkit_generate_audio,
82 /* eslint-disable-next-line camelcase */
83 publish_post_to_speechkit,
84 } = getCurrentPostAttribute( 'meta' );
85
86 if (
87 /* eslint-disable-next-line camelcase */
88 beyondwords_generate_audio === '1' ||
89 /* eslint-disable-next-line camelcase */
90 speechkit_generate_audio === '1' ||
91 /* eslint-disable-next-line camelcase */
92 publish_post_to_speechkit === '1'
93 ) {
94 return true;
95 }
96
97 if (
98 /* eslint-disable-next-line camelcase */
99 beyondwords_generate_audio === '0' ||
100 /* eslint-disable-next-line camelcase */
101 speechkit_generate_audio === '0' ||
102 /* eslint-disable-next-line camelcase */
103 publish_post_to_speechkit === '0'
104 ) {
105 return false;
106 }
107
108 return null;
109 };
110
111 /**
112 * Should we preselect "Generate audio", based on the plugin setting?
113 */
114 const getShouldPreselect = () => {
115 const settings = getSettings();
116
117 // Do we have settings?
118 if ( ! settings ) {
119 return false;
120 }
121
122 const preselect =
123 typeof settings.preselect === 'object' &&
124 settings.preselect !== null
125 ? settings.preselect
126 : {};
127
128 const postType = getCurrentPostType();
129
130 // Exit if the current post type does not exist in the plugin settings
131 if ( false === postType in preselect ) {
132 return false;
133 }
134
135 // Is the current post type checked in the plugin settings
136 // If it is checked at post-level then we preselect Generate audio regardless
137 // of the applied taxonomies
138 if ( preselect[ postType ] === '1' ) {
139 return true;
140 }
141
142 // Get the Post edits
143 const postEdits = getPostEdits();
144
145 // Check that categories have been edited?
146 // todo support multiple taxonomies
147 if ( ! Array.isArray( postEdits.categories ) ) {
148 return false;
149 }
150
151 // Handle cases where preselect[ postType ] is not an object
152 // This can happen when the plugin setting is empty or corrupt
153 if (
154 typeof preselect[ postType ] !== 'object' ||
155 preselect[ postType ] === null
156 ) {
157 return false;
158 }
159
160 // Get all Post categories
161 const categories = getEditedPostAttribute( 'categories' );
162
163 // Do any Post categories match the plugin settings?
164 const hasMatchingCategories = categories.some( ( x ) => {
165 // todo support multiple taxonomies
166 if ( false === 'category' in preselect[ postType ] ) {
167 return false;
168 }
169 // todo support multiple taxonomies
170 return preselect[ postType ].category.includes( String( x ) );
171 } );
172
173 if ( hasMatchingCategories ) {
174 return true;
175 }
176
177 // todo Do any Post OTHER TAXONOMIES match the plugin settings?
178
179 return false;
180 };
181
182 const generateAudio = getGenerateAudio();
183
184 return {
185 generateAudio:
186 generateAudio === null ? getShouldPreselect() : generateAudio,
187 generateAudioEdited: getGenerateAudioEdited(),
188 };
189 } ),
190 withDispatch( ( dispatch ) => {
191 const { editPost } = dispatch( 'core/editor' );
192 const { setGenerateAudioEdited } = dispatch(
193 'beyondwords/interactions'
194 );
195
196 return {
197 setGenerateAudio: ( generateAudio ) => {
198 // Update the Custom Field
199 editPost( {
200 meta: {
201 /* eslint-disable-next-line camelcase */
202 beyondwords_generate_audio: generateAudio ? '1' : '0',
203 },
204 } );
205 // Mark "Generate audio" as being (manually) edited, so other components
206 // know the checkbox has been changed from it's default value.
207 setGenerateAudioEdited( true );
208 },
209 };
210 } ),
211 ] )( GenerateAudio );
212