PluginProbe
BeyondWords – AI audio for publishers / 6.0.3
BeyondWords – AI audio for publishers v6.0.3
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 4.7.0 All 43 releases
speechkit / src / Component / Post / GenerateAudio / index.js

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

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