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