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 / overlays / Edit.js
presto-player / src / admin / blocks / shared / overlays Last commit date
components 2 weeks ago Edit.js 2 weeks ago Edit.scss 2 weeks ago index.js 2 weeks ago index.scss 2 weeks ago
Edit.js
215 lines
1 /**
2 * WordPress dependencies
3 */
4 const { __ } = wp.i18n;
5 const { Button, Flex, FlexItem, FlexBlock, Modal } = wp.components;
6 const { useState, useEffect } = wp.element;
7 const { useSelect } = wp.data;
8 import { nanoid } from "nanoid";
9
10 import "./Edit.scss";
11 import Preview from "../Preview";
12 import Overlay from "./components/Overlay";
13
14 const EditOverlay = ({
15 closeModal,
16 attributes,
17 setAttributes,
18 updateOverlayAttribute,
19 }) => {
20 const [loading, setLoading] = useState(false);
21 const [currentTime, setCurrentTime] = useState("");
22 const { overlays, preset, src, poster, previewSrc } = attributes;
23
24 const branding = useSelect((select) => {
25 return select("presto-player/player").branding();
26 });
27
28 const state = useSelect((select) =>
29 select("presto-player/player").getPreset(preset)
30 );
31
32 // maybe add a default so it's not empty.
33 useEffect(() => {
34 if (!overlays.length) {
35 addOverlay();
36 }
37 }, []);
38
39 // update an existing overlay.
40 const updateOverlay = (overlay, data = {}) => {
41 let itemIndex = overlays.indexOf(overlay);
42 let updated = overlays.map((item, index) => {
43 // This isn't the item we care about - keep it as-is
44 if (index !== itemIndex) {
45 return item;
46 }
47 // Otherwise, this is the one we want - return an updated value
48 return {
49 ...item,
50 ...data,
51 };
52 });
53
54 setAttributes({ overlays: updated });
55 };
56
57 // remove overlay.
58 const removeOverlay = (overlay) => {
59 let index = overlays.indexOf(overlay);
60 setAttributes({ overlays: overlays.filter((_, i) => i !== index) });
61 };
62
63 // add overlay with custom default.
64 const addOverlay = () => {
65 let defaultOverlay = {
66 startTime: "0:00",
67 endTime: "0:05",
68 text: __("Here's a link to click!", "presto-player"),
69 link: {},
70 position: "top-right",
71 color: "#fff",
72 backgroundColor: "#000",
73 opacity: 75,
74 };
75
76 if (overlays[overlays.length - 1]) {
77 const lastOverlay = overlays[overlays.length - 1];
78 defaultOverlay = { ...lastOverlay }; // make a shallow clone.
79 }
80
81 defaultOverlay.id = nanoid(10);
82
83 setAttributes({
84 overlays: [...(overlays || []), ...[defaultOverlay]],
85 });
86 };
87
88 // sort the overlays by time.
89 const sorted = () => {
90 return (overlays || []).sort(function (a, b) {
91 if (
92 parseInt(a.startTime.split(":")[0]) -
93 parseInt(b.startTime.split(":")[0]) ===
94 0
95 ) {
96 return (
97 parseInt(a.startTime.split(":")[1]) -
98 parseInt(b.startTime.split(":")[1])
99 );
100 } else {
101 return (
102 parseInt(a.startTime.split(":")[0]) -
103 parseInt(b.startTime.split(":")[0])
104 );
105 }
106 });
107 };
108
109 // make sure we always update.
110 const updateCurrentTimeState = (time) => {
111 setCurrentTime("");
112 process.nextTick(() => {
113 setCurrentTime(time);
114 });
115 };
116
117 // validate and save
118 const save = () => {
119 setLoading(true);
120 updateOverlayAttribute(overlays);
121 setLoading(false);
122 closeModal();
123 };
124
125 return (
126 <Modal
127 title={__("Manage Video Overlays", "presto-player")}
128 onRequestClose={closeModal}
129 className="presto-player__modal-presets"
130 overlayClassName="presto-player__modal-presets-overlay"
131 shouldCloseOnClickOutside={false}
132 >
133 <div className="presto-player__preset-options" data-cy="preset-modal">
134 <Flex align="stretch" className="presto-player__style-preview-area">
135 <FlexItem className="presto-player__style-sidebar">
136 <div className="presto-overlays-edit__item">
137 {sorted().map((overlay, i) => {
138 return (
139 <Overlay
140 key={`${i}-${overlay.startTime}`}
141 overlayIndex={i}
142 className="presto-player__overlay"
143 startTime={overlay.startTime}
144 endTime={overlay.endTime}
145 text={overlay.text}
146 link={overlay.link}
147 position={overlay.position}
148 color={overlay.color}
149 backgroundColor={overlay.backgroundColor}
150 opacity={overlay.opacity}
151 overlay={overlay}
152 update={(data) => {
153 updateOverlay(overlay, data);
154 }}
155 remove={() => {
156 removeOverlay(overlay);
157 }}
158 updateCurrentTime={(data) => {
159 updateCurrentTimeState(data);
160 }}
161 />
162 );
163 })}
164 <Button isPrimary onClick={addOverlay}>
165 {__("Add An Overlay", "presto-player")}
166 </Button>
167 </div>
168 </FlexItem>
169 <FlexBlock className="presto-player__style-preview-panel">
170 <Preview
171 preload="auto"
172 currentTime={currentTime}
173 src={previewSrc || src}
174 isDisabled={false}
175 state={{
176 ...state,
177 lazy_load_youtube: false, // don't lazy load.
178 invert_time: false,
179 }}
180 branding={branding}
181 poster={poster}
182 overlays={overlays}
183 />
184 </FlexBlock>
185 </Flex>
186
187 <br />
188
189 <div
190 className="presto-overlays-edit__footer"
191 >
192 <div
193 className="presto-overlays-edit__meta"
194 ></div>
195 <div>
196 <Button isTertiary onClick={closeModal} style={{ margin: "0 6px" }}>
197 {__("Cancel", "presto-player")}
198 </Button>
199 <Button
200 isPrimary
201 isBusy={loading}
202 disabled={loading}
203 onClick={save}
204 data-cy="submit-preset"
205 >
206 {__("Save Overlays", "presto-player")}
207 </Button>
208 </div>
209 </div>
210 </div>
211 </Modal>
212 );
213 };
214 export default EditOverlay;
215