PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / blocks / shared / audioPresets / Edit.js
presto-player / src / admin / blocks / shared / audioPresets Last commit date
Behavior.js 2 years ago Controls.js 4 years ago Edit.js 2 weeks ago Edit.scss 2 weeks ago Preset.js 4 years ago Preview.js 3 years ago Style.js 2 weeks ago Style.scss 2 weeks ago index.js 2 weeks ago index.scss 2 weeks ago
Edit.js
352 lines
1 /**
2 * WordPress dependencies
3 */
4 const { __ } = wp.i18n;
5 const {
6 TextControl,
7 BaseControl,
8 Icon,
9 Notice,
10 Button,
11 Flex,
12 FlexItem,
13 SelectControl,
14 FlexBlock,
15 Modal,
16 } = wp.components;
17 const { useState, useEffect } = wp.element;
18 const { useSelect, dispatch } = wp.data;
19
20 import { snackbarNotice } from "@/admin/blocks/util";
21 import Menu from "@/admin/ui/Menu";
22 import "./Edit.scss";
23 import Preview from "./Preview";
24 import Behavior from "./Behavior";
25 import Controls from "./Controls";
26 import Style from "./Style";
27 import ActionBar from "../presets/ActionBar";
28 import CTA from "../presets/CTA";
29 import Email from "../presets/Email";
30
31 function EditPlayerPreset({
32 type = "new",
33 closeModal,
34 addPreset,
35 onSave,
36 updatePreset,
37 name = "",
38 attributes,
39 preset = {
40 "play-large": true,
41 rewind: true,
42 play: true,
43 "fast-forward": true,
44 progress: true,
45 "current-time": true,
46 mute: true,
47 volume: true,
48 speed: false,
49 pip: false,
50 // behavior
51 save_player_position: false,
52 reset_on_end: false,
53 sticky_scroll: false,
54 // style
55 hide_logo: false,
56 border_radius: 0,
57 skin: "default",
58 background_color: "",
59 control_color: "",
60
61 // features
62 cta: {},
63 email_collection: {},
64 action_bar: {},
65 },
66 }) {
67 const [loading, setLoading] = useState(false);
68 const [error, setError] = useState("");
69 const [menu, setMenu] = useState("");
70 const [thisName, setThisName] = useState(name);
71 const [state, setState] = useState(preset);
72 const branding = useSelect((select) => {
73 return select("presto-player/player").branding();
74 });
75
76 const [value, setValue] = useState("");
77
78 const genericError = {
79 message: __(
80 "The preset could not be saved. Please reload the page and try again.",
81 "presto-player"
82 ),
83 };
84
85 //you tube feature
86 const youtube = useSelect((select) => {
87 return select("presto-player/player").youtube();
88 });
89
90 useEffect(() => {
91 setValue(youtube.channel_id);
92 }, [youtube?.channel_id]);
93
94 // update state
95 const updateState = (updated = {}) => {
96 setState({ ...state, ...updated });
97 };
98
99 const putPreset = async () => {
100 setLoading(true);
101 try {
102 const data = {
103 ...state,
104 ...{ name: thisName },
105 };
106 let saved = await wp.apiFetch({
107 method: "POST",
108 url: wp.url.addQueryArgs(
109 `${prestoPlayer.root}${prestoPlayer.prestoVersionString}audio-preset/${preset.id}`,
110 { _method: "PUT" }
111 ),
112 data,
113 });
114
115 if (!saved) {
116 throw genericError;
117 }
118
119 // update or create here
120 updatePreset(saved);
121 closeModal();
122 !!onSave && onSave(saved);
123 snackbarNotice({ message: __("Preset updated!", "presto-player") });
124 } catch (e) {
125 setError(e?.message ? e.message : genericError);
126 } finally {
127 setLoading(false);
128 }
129
130 // youtube id save
131 dispatch("presto-player/player").updateYoutube({ channel_id: value });
132
133 const data = {
134 ...youtube,
135 ...{ channel_id: value },
136 };
137
138 try {
139 let response = await wp.apiFetch({
140 path: "wp/v2/settings",
141 method: "POST",
142 data: {
143 presto_player_youtube: data,
144 },
145 });
146 if (response?.presto_player_youtube) {
147 dispatch("presto-player/player").setYoutube(
148 response?.presto_player_youtube
149 );
150 onClose();
151 }
152 } catch (e) {
153 console.log(e);
154 }
155 };
156
157 const createPreset = async () => {
158 setLoading(true);
159 try {
160 let saved = await wp.apiFetch({
161 method: "POST",
162 url:
163 prestoPlayer.root + prestoPlayer.prestoVersionString + "audio-preset",
164 data: {
165 ...{ name: thisName },
166 ...state,
167 },
168 });
169 if (!saved) {
170 throw genericError;
171 }
172
173 // update or create here
174 addPreset(saved);
175 closeModal();
176 !!onSave && onSave(saved);
177 snackbarNotice({ message: __("Preset created!", "presto-player") });
178 } catch (e) {
179 setError(e?.message ? e.message : genericError);
180 } finally {
181 setLoading(false);
182 }
183 };
184
185 // validate and save
186 const save = () => {
187 if (!thisName) {
188 setError(__("You must enter a name for the preset.", "presto-player"));
189 return;
190 }
191 return type === "edit" ? putPreset() : createPreset();
192 };
193
194 const tabs = [
195 {
196 name: "controls",
197 title: __("Controls", "presto-player"),
198 icon: <Icon icon="admin-settings" />,
199 component: <Controls updateState={updateState} state={state} />,
200 },
201 {
202 name: "behavior",
203 title: __("Behavior", "presto-player"),
204 icon: <Icon icon="admin-generic" />,
205 component: <Behavior updateState={updateState} state={state} />,
206 },
207 {
208 name: "style",
209 title: __("Style", "presto-player"),
210 icon: <Icon icon="admin-customizer" />,
211 component: <Style updateState={updateState} state={state} />,
212 },
213 {
214 name: "email",
215 title: __("Email Capture", "presto-player"),
216 icon: <Icon icon="email" />,
217 component: <Email updateState={updateState} state={state} />,
218 },
219 {
220 name: "cta",
221 title: __("Call To Action", "presto-player"),
222 icon: <Icon icon="megaphone" />,
223 component: <CTA updateState={updateState} state={state} />,
224 },
225 {
226 name: "action_bar",
227 title: __("Action Bar", "presto-player"),
228 icon: <Icon icon="cover-image" />,
229 component: (
230 <ActionBar
231 updateState={updateState}
232 state={state}
233 value={value}
234 setValue={setValue}
235 />
236 ),
237 },
238 ];
239
240 return (
241 <Modal
242 title={
243 type == "edit"
244 ? __("Edit A Audio Preset", "presto-player")
245 : __("Create A New Audio Preset", "presto-player")
246 }
247 onRequestClose={closeModal}
248 className="presto-player__modal-presets"
249 overlayClassName="presto-player__modal-presets-overlay"
250 >
251 <div className="presto-player__preset-options" data-cy="preset-modal">
252 <TextControl
253 value={thisName}
254 hideLabelFromVision={true}
255 label={__("Preset Name", "presto-player")}
256 onChange={(name) => setThisName(name)}
257 placeholder={__("Enter a preset name...", "presto-player")}
258 className="presto-player__modal--style-name"
259 autoFocus
260 />
261
262 <Flex align="stretch" className="presto-player__style-preview-area">
263 <FlexItem className="presto-player__style-sidebar">
264 <div>
265 <Menu
266 items={tabs}
267 title={__("Customize", "presto-player")}
268 onSelect={setMenu}
269 >
270 {(item) => item.component}
271 </Menu>
272 </div>
273 </FlexItem>
274 <FlexBlock className="presto-player__style-preview-panel">
275 <div
276 style={{ position: "absolute", top: 0, left: 0, padding: "20px" }}
277 >
278 <SelectControl
279 label={__("Skin", "presto-player")}
280 labelPosition="side"
281 value={state?.skin}
282 hideLabelFromVision={true}
283 options={[
284 { label: __("Basic", "presto-player"), value: "default" },
285 { label: __("Stacked", "presto-player"), value: "stacked" },
286 ]}
287 onChange={(skin) => {
288 updateState({ skin });
289 }}
290 />
291 </div>
292 {/*
293 Disable the audio tag so the user clicking on it won't play the
294 audio when the controls are enabled.
295 */}
296
297 <Preview
298 poster={attributes.poster}
299 src={attributes.src}
300 state={state}
301 branding={branding}
302 menu={menu}
303 mediaTitle={attributes.title}
304 />
305 </FlexBlock>
306 </Flex>
307
308 <br />
309
310 {error && (
311 <BaseControl>
312 <Notice
313 className="presto-player__modal--error-notice"
314 status="error"
315 isDismissible={false}
316 style={{ margin: 0 }}
317 >
318 {error.replace(/(<([^>]+)>)/gi, "")}
319 </Notice>
320 </BaseControl>
321 )}
322 <div
323 className="presto-audio-presets-edit__footer"
324 >
325 <div
326 className="presto-audio-presets-edit__meta"
327 >
328 Preset ID: {preset.id}
329 </div>
330 <div>
331 <Button isTertiary onClick={closeModal} style={{ margin: "0 6px" }}>
332 {__("Cancel", "presto-player")}
333 </Button>
334 <Button
335 isPrimary
336 isBusy={loading}
337 disabled={loading}
338 onClick={save}
339 data-cy="submit-preset"
340 >
341 {type == "edit"
342 ? __("Update Preset", "presto-player")
343 : __("Create Preset", "presto-player")}
344 </Button>
345 </div>
346 </div>
347 </div>
348 </Modal>
349 );
350 }
351 export default EditPlayerPreset;
352