@doyourjob/gravity-ui-page-constructor 5.31.179 → 5.31.180
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -19,6 +19,6 @@ const AboutHeaderBlock = ({ title, text, caption, image, logo }) => {
|
|
|
19
19
|
react_1.default.createElement("div", { className: b('wrap') },
|
|
20
20
|
react_1.default.createElement("div", { className: b('caption') }, caption),
|
|
21
21
|
react_1.default.createElement(components_1.Image, { src: logo, className: b('logo') })),
|
|
22
|
-
text && react_1.default.createElement(components_1.
|
|
22
|
+
text && (react_1.default.createElement(components_1.YFMWrapper, { content: text, modifiers: { constructor: true }, className: b('text') })))))));
|
|
23
23
|
};
|
|
24
24
|
exports.default = react_1.default.memo(AboutHeaderBlock);
|
|
@@ -23,8 +23,10 @@ const Audio = ({ url }) => {
|
|
|
23
23
|
const [duration, setDuration] = (0, react_1.useState)(0);
|
|
24
24
|
const [volume, setVolume] = (0, react_1.useState)(1);
|
|
25
25
|
const [isDragging, setIsDragging] = (0, react_1.useState)(false);
|
|
26
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
26
27
|
// FIX: сброс состояния при смене url
|
|
27
28
|
(0, react_1.useEffect)(() => {
|
|
29
|
+
setIsLoading(true);
|
|
28
30
|
setCurrentTime(0);
|
|
29
31
|
setDuration(0);
|
|
30
32
|
setIsPlaying(false);
|
|
@@ -141,11 +143,15 @@ const Audio = ({ url }) => {
|
|
|
141
143
|
}
|
|
142
144
|
};
|
|
143
145
|
const onDurationChange = () => setDuration(audio.duration);
|
|
146
|
+
const onCanPlay = () => setIsLoading(false);
|
|
147
|
+
const onWaiting = () => setIsLoading(true);
|
|
144
148
|
audio.addEventListener('play', onPlay);
|
|
145
149
|
audio.addEventListener('pause', onPause);
|
|
146
150
|
audio.addEventListener('ended', onEnded);
|
|
147
151
|
audio.addEventListener('timeupdate', onTimeUpdate);
|
|
148
152
|
audio.addEventListener('durationchange', onDurationChange);
|
|
153
|
+
audio.addEventListener('canplay', onCanPlay);
|
|
154
|
+
audio.addEventListener('waiting', onWaiting);
|
|
149
155
|
// eslint-disable-next-line consistent-return
|
|
150
156
|
return () => {
|
|
151
157
|
audio.removeEventListener('play', onPlay);
|
|
@@ -153,6 +159,8 @@ const Audio = ({ url }) => {
|
|
|
153
159
|
audio.removeEventListener('ended', onEnded);
|
|
154
160
|
audio.removeEventListener('timeupdate', onTimeUpdate);
|
|
155
161
|
audio.removeEventListener('durationchange', onDurationChange);
|
|
162
|
+
audio.removeEventListener('canplay', onCanPlay);
|
|
163
|
+
audio.removeEventListener('waiting', onWaiting);
|
|
156
164
|
};
|
|
157
165
|
}, []);
|
|
158
166
|
// FIX: ref-копия isDragging для замыкания в timeupdate (без перепривязки слушателей)
|
|
@@ -171,10 +179,13 @@ const Audio = ({ url }) => {
|
|
|
171
179
|
return 'M3 9h4l5-5v16l-5-5H3V9zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4zm-2.5-7a7 7 0 0 1 0 14V14a5 5 0 0 0 0-10V5z';
|
|
172
180
|
}, [isMuted, volume]);
|
|
173
181
|
return (react_1.default.createElement("div", { className: b() },
|
|
174
|
-
react_1.default.createElement("audio", { ref: audioRef, src: url, preload: "
|
|
175
|
-
react_1.default.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
|
|
176
|
-
|
|
177
|
-
|
|
182
|
+
react_1.default.createElement("audio", { ref: audioRef, src: url, preload: "metadata" }),
|
|
183
|
+
react_1.default.createElement("button", { className: b('play-btn', { loading: isLoading }), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
|
|
184
|
+
isLoading && react_1.default.createElement("span", { className: b('spinner') }),
|
|
185
|
+
!isLoading &&
|
|
186
|
+
(isPlaying ? (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
|
|
187
|
+
react_1.default.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
|
|
188
|
+
react_1.default.createElement("path", { d: "M8 5v14l11-7z" }))))),
|
|
178
189
|
react_1.default.createElement("div", { className: b('timeline') },
|
|
179
190
|
react_1.default.createElement("div", { ref: progressRef, className: b('progress-bar'),
|
|
180
191
|
// FIX: убран onClick — onMouseDown уже обрабатывает клик без дублирования
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { Image, YFMWrapper } from '../../components';
|
|
3
3
|
import { Col, Row } from '../../grid';
|
|
4
4
|
import { block } from '../../utils/cn';
|
|
5
5
|
import './AboutHeader.css';
|
|
@@ -17,6 +17,6 @@ const AboutHeaderBlock = ({ title, text, caption, image, logo }) => {
|
|
|
17
17
|
React.createElement("div", { className: b('wrap') },
|
|
18
18
|
React.createElement("div", { className: b('caption') }, caption),
|
|
19
19
|
React.createElement(Image, { src: logo, className: b('logo') })),
|
|
20
|
-
text && React.createElement(
|
|
20
|
+
text && (React.createElement(YFMWrapper, { content: text, modifiers: { constructor: true }, className: b('text') })))))));
|
|
21
21
|
};
|
|
22
22
|
export default React.memo(AboutHeaderBlock);
|
|
@@ -20,8 +20,10 @@ export const Audio = ({ url }) => {
|
|
|
20
20
|
const [duration, setDuration] = useState(0);
|
|
21
21
|
const [volume, setVolume] = useState(1);
|
|
22
22
|
const [isDragging, setIsDragging] = useState(false);
|
|
23
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
23
24
|
// FIX: сброс состояния при смене url
|
|
24
25
|
useEffect(() => {
|
|
26
|
+
setIsLoading(true);
|
|
25
27
|
setCurrentTime(0);
|
|
26
28
|
setDuration(0);
|
|
27
29
|
setIsPlaying(false);
|
|
@@ -138,11 +140,15 @@ export const Audio = ({ url }) => {
|
|
|
138
140
|
}
|
|
139
141
|
};
|
|
140
142
|
const onDurationChange = () => setDuration(audio.duration);
|
|
143
|
+
const onCanPlay = () => setIsLoading(false);
|
|
144
|
+
const onWaiting = () => setIsLoading(true);
|
|
141
145
|
audio.addEventListener('play', onPlay);
|
|
142
146
|
audio.addEventListener('pause', onPause);
|
|
143
147
|
audio.addEventListener('ended', onEnded);
|
|
144
148
|
audio.addEventListener('timeupdate', onTimeUpdate);
|
|
145
149
|
audio.addEventListener('durationchange', onDurationChange);
|
|
150
|
+
audio.addEventListener('canplay', onCanPlay);
|
|
151
|
+
audio.addEventListener('waiting', onWaiting);
|
|
146
152
|
// eslint-disable-next-line consistent-return
|
|
147
153
|
return () => {
|
|
148
154
|
audio.removeEventListener('play', onPlay);
|
|
@@ -150,6 +156,8 @@ export const Audio = ({ url }) => {
|
|
|
150
156
|
audio.removeEventListener('ended', onEnded);
|
|
151
157
|
audio.removeEventListener('timeupdate', onTimeUpdate);
|
|
152
158
|
audio.removeEventListener('durationchange', onDurationChange);
|
|
159
|
+
audio.removeEventListener('canplay', onCanPlay);
|
|
160
|
+
audio.removeEventListener('waiting', onWaiting);
|
|
153
161
|
};
|
|
154
162
|
}, []);
|
|
155
163
|
// FIX: ref-копия isDragging для замыкания в timeupdate (без перепривязки слушателей)
|
|
@@ -168,10 +176,13 @@ export const Audio = ({ url }) => {
|
|
|
168
176
|
return 'M3 9h4l5-5v16l-5-5H3V9zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4zm-2.5-7a7 7 0 0 1 0 14V14a5 5 0 0 0 0-10V5z';
|
|
169
177
|
}, [isMuted, volume]);
|
|
170
178
|
return (React.createElement("div", { className: b() },
|
|
171
|
-
React.createElement("audio", { ref: audioRef, src: url, preload: "
|
|
172
|
-
React.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
React.createElement("audio", { ref: audioRef, src: url, preload: "metadata" }),
|
|
180
|
+
React.createElement("button", { className: b('play-btn', { loading: isLoading }), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
|
|
181
|
+
isLoading && React.createElement("span", { className: b('spinner') }),
|
|
182
|
+
!isLoading &&
|
|
183
|
+
(isPlaying ? (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
|
|
184
|
+
React.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
|
|
185
|
+
React.createElement("path", { d: "M8 5v14l11-7z" }))))),
|
|
175
186
|
React.createElement("div", { className: b('timeline') },
|
|
176
187
|
React.createElement("div", { ref: progressRef, className: b('progress-bar'),
|
|
177
188
|
// FIX: убран onClick — onMouseDown уже обрабатывает клик без дублирования
|