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