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