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