@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.HTML, { className: b('text') }, text))))));
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: "auto" }),
175
- react_1.default.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" }, isPlaying ? (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
176
- 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" },
177
- react_1.default.createElement("path", { d: "M8 5v14l11-7z" })))),
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 { HTML, Image } from '../../components';
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(HTML, { className: b('text') }, text))))));
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: "auto" }),
172
- React.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" }, isPlaying ? (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
173
- React.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
174
- React.createElement("path", { d: "M8 5v14l11-7z" })))),
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 уже обрабатывает клик без дублирования
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doyourjob/gravity-ui-page-constructor",
3
- "version": "5.31.179",
3
+ "version": "5.31.180",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {