Skip to content

Commit 135ec82

Browse files
committed
Enhance ProgressBar component with improved progress tracking and logging
- Updated progress synchronization logic to convert external progress from seconds to percentage for more accurate calculations. - Added detailed logging for progress changes, new track detection, and animation progress to aid in debugging. - Refined checks for significant forward and backward jumps, rapid changes, and reasonable adjustments to enhance user experience during playback. - Improved state management to handle minor changes without unnecessary synchronization, ensuring smoother playback transitions.
1 parent 7805841 commit 135ec82

File tree

1 file changed

+104
-13
lines changed

1 file changed

+104
-13
lines changed

src/components/OBS_Components/SoundRequest/CurrentTrack/ProgressBar.tsx

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,52 @@ export const ProgressBar = ({ track }: Props) => {
2424
useEffect(() => {
2525
if (!track.duration || track.duration === 0) return;
2626

27-
const externalProgress = track.progress || 0;
27+
// Конвертируем внешний прогресс из секунд в проценты
28+
const externalProgressSeconds = track.progress || 0;
29+
const externalProgress =
30+
track.duration > 0 ? externalProgressSeconds / track.duration : 0;
2831
const lastProgress = lastExternalProgressRef.current;
2932
const progressDiff = externalProgress - lastProgress;
3033

31-
// Проверяем значительные изменения вперед (перемотка вперед на 3+ секунд)
32-
const isSignificantForwardJump = progressDiff > 3;
34+
// Проверяем значительные изменения вперед (перемотка вперед на 3+ секунд в процентах)
35+
const isSignificantForwardJump = progressDiff > 3 / track.duration;
3336

34-
// Проверяем значительные изменения назад (перемотка назад на 3+ секунд)
35-
const isSignificantBackwardJump = progressDiff < -3;
37+
// Проверяем значительные изменения назад (перемотка назад на 3+ секунд в процентах)
38+
const isSignificantBackwardJump = progressDiff < -(3 / track.duration);
3639

37-
// Проверяем резкие изменения в любом направлении (более 1 секунды)
38-
const isRapidChange = Math.abs(progressDiff) > 1;
40+
// Проверяем резкие изменения в любом направлении (более 1 секунды в процентах)
41+
const isRapidChange = Math.abs(progressDiff) > 1 / track.duration;
3942

4043
// Дополнительная проверка для отмотки назад - если прогресс резко уменьшился
41-
const isRewindBack = progressDiff < -0.5 && externalProgress < lastProgress;
44+
const isRewindBack =
45+
progressDiff < -(0.5 / track.duration) && externalProgress < lastProgress;
4246

4347
// Проверяем, что изменение не слишком большое (не больше половины трека)
44-
const isReasonableChange = Math.abs(progressDiff) < track.duration / 2;
48+
const isReasonableChange = Math.abs(progressDiff) < 0.5;
49+
50+
// Логируем все изменения прогресса для отладки
51+
if (Math.abs(progressDiff) > 0.01) {
52+
console.log("🟡 PROGRESS CHANGE:", {
53+
externalProgressSeconds,
54+
externalProgress,
55+
lastProgress,
56+
progressDiff,
57+
isSignificantForwardJump,
58+
isSignificantBackwardJump,
59+
isRapidChange,
60+
isRewindBack,
61+
isReasonableChange,
62+
willSync:
63+
(isSignificantForwardJump ||
64+
isSignificantBackwardJump ||
65+
isRapidChange ||
66+
isRewindBack) &&
67+
isReasonableChange,
68+
trackStatus: track.status,
69+
currentInternalProgress: progress,
70+
trackDuration: track.duration,
71+
});
72+
}
4573

4674
// Синхронизируемся при значительных перемотках, резких изменениях или отмотке назад
4775
if (
@@ -51,19 +79,25 @@ export const ProgressBar = ({ track }: Props) => {
5179
isRewindBack) &&
5280
isReasonableChange
5381
) {
82+
console.log("🟢 SYNCING PROGRESS:", {
83+
from: progress,
84+
to: externalProgress,
85+
fromSeconds: progress * track.duration,
86+
toSeconds: externalProgressSeconds,
87+
});
5488
lastExternalProgressRef.current = externalProgress;
5589
setProgress(externalProgress);
5690

5791
// Пересчитываем время начала для корректного продолжения анимации
5892
if (track.status === "playing") {
59-
startTimeRef.current = Date.now() - externalProgress * 1000;
93+
startTimeRef.current = Date.now() - externalProgressSeconds * 1000;
6094
}
6195
} else {
6296
// Если изменение незначительное, просто обновляем отслеживаемое значение
6397
// но не синхронизируемся, чтобы избежать бликов
6498
lastExternalProgressRef.current = externalProgress;
6599
}
66-
}, [track.progress, track.duration, track.status]);
100+
}, [track.progress, track.duration, track.status, progress]);
67101

68102
useEffect(() => {
69103
if (!track.duration || track.duration === 0) {
@@ -79,17 +113,28 @@ export const ProgressBar = ({ track }: Props) => {
79113

80114
// Если это новый трек, сбрасываем все состояния
81115
if (lastTrackKeyRef.current !== trackKey) {
116+
console.log("🟠 NEW TRACK DETECTED:", {
117+
oldTrackKey: lastTrackKeyRef.current,
118+
newTrackKey: trackKey,
119+
initialProgress: track.progress || 0,
120+
trackStatus: track.status,
121+
trackDuration: track.duration,
122+
});
123+
82124
lastTrackKeyRef.current = trackKey;
83-
const initialProgress = track.progress || 0;
125+
const initialProgressSeconds = track.progress || 0;
126+
const initialProgress =
127+
track.duration > 0 ? initialProgressSeconds / track.duration : 0;
84128
setProgress(initialProgress);
85129
lastExternalProgressRef.current = initialProgress;
86130
isPausedRef.current = false;
87131
pausedTimeRef.current = 0;
88-
startTimeRef.current = Date.now() - initialProgress * 1000;
132+
startTimeRef.current = Date.now() - initialProgressSeconds * 1000;
89133
}
90134

91135
// Если трек остановлен, сбрасываем прогресс
92136
if (track.status === "stopped") {
137+
console.log("🔴 TRACK STOPPED - resetting progress");
93138
setProgress(0);
94139
lastExternalProgressRef.current = 0;
95140
isPausedRef.current = false;
@@ -100,6 +145,7 @@ export const ProgressBar = ({ track }: Props) => {
100145
// Если трек на паузе
101146
if (track.status === "paused") {
102147
if (!isPausedRef.current) {
148+
console.log("⏸️ TRACK PAUSED");
103149
isPausedRef.current = true;
104150
pausedTimeRef.current = Date.now();
105151
}
@@ -111,6 +157,7 @@ export const ProgressBar = ({ track }: Props) => {
111157
// Если был на паузе, корректируем время начала
112158
if (isPausedRef.current) {
113159
const pauseDuration = Date.now() - pausedTimeRef.current;
160+
console.log("▶️ TRACK RESUMED after pause:", { pauseDuration });
114161
startTimeRef.current += pauseDuration;
115162
isPausedRef.current = false;
116163
}
@@ -120,6 +167,21 @@ export const ProgressBar = ({ track }: Props) => {
120167
const elapsed = (currentTime - startTimeRef.current) / 1000;
121168
const newProgress = Math.min(elapsed / track.duration, 1);
122169

170+
// Логируем изменения прогресса в анимации
171+
if (Math.abs(newProgress - progress) > 0.01) {
172+
console.log("🔵 ANIMATION PROGRESS:", {
173+
newProgress,
174+
newProgressSeconds: newProgress * track.duration,
175+
currentProgress: progress,
176+
currentProgressSeconds: progress * track.duration,
177+
elapsed,
178+
trackDuration: track.duration,
179+
trackStatus: track.status,
180+
startTime: startTimeRef.current,
181+
currentTime,
182+
});
183+
}
184+
123185
setProgress(newProgress);
124186

125187
if (newProgress < 1 && track.status === "playing") {
@@ -149,6 +211,35 @@ export const ProgressBar = ({ track }: Props) => {
149211

150212
const progressPercentage = Math.min(progress * 100, 100);
151213

214+
useEffect(() => {
215+
if (progressPercentage >= 99) {
216+
console.log("🔴 PROGRESS BAR DEBUG - 99%+ reached:", {
217+
progressPercentage,
218+
progress,
219+
trackStatus: track.status,
220+
trackDuration: track.duration,
221+
externalProgressSeconds: track.progress,
222+
externalProgressPercent:
223+
track.duration > 0 ? (track.progress || 0) / track.duration : 0,
224+
lastExternalProgress: lastExternalProgressRef.current,
225+
isPaused: isPausedRef.current,
226+
startTime: startTimeRef.current,
227+
currentTime: Date.now(),
228+
elapsed: (Date.now() - startTimeRef.current) / 1000,
229+
trackKey,
230+
lastTrackKey: lastTrackKeyRef.current,
231+
});
232+
debugger;
233+
}
234+
}, [
235+
progressPercentage,
236+
progress,
237+
track.status,
238+
track.duration,
239+
track.progress,
240+
trackKey,
241+
]);
242+
152243
return (
153244
<div
154245
className={styles.progressBarContainer}

0 commit comments

Comments
 (0)