🧹 [Refactor] Use AbortController for event listeners in useAudioPlayer

- Replaced multiple named event handler functions with inline state setters.
- Used an AbortController to cleanly remove all event listeners with a single `controller.abort()` call in the cleanup hook.
- This improves maintainability and readability by reducing verbosity without changing functionality.

Co-authored-by: LyAhn <27559362+LyAhn@users.noreply.github.com>
This commit is contained in:
google-labs-jules[bot]
2026-04-28 19:23:44 +00:00
parent 59d3280cb5
commit 18a97e0bea
+9 -20
View File
@@ -32,30 +32,19 @@ export function useAudioPlayer(audioUrl: string | null) {
const audio = new Audio(audioUrl); const audio = new Audio(audioUrl);
audioRef.current = audio; audioRef.current = audio;
const onTimeUpdate = () => const controller = new AbortController();
setState((prev) => ({ ...prev, currentTime: audio.currentTime })); const { signal } = controller;
const onDurationChange = () =>
setState((prev) => ({ ...prev, duration: audio.duration }));
const onEnded = () =>
setState((prev) => ({ ...prev, isPlaying: false, currentTime: 0 }));
const onPlay = () => setState((prev) => ({ ...prev, isPlaying: true }));
const onPause = () => setState((prev) => ({ ...prev, isPlaying: false }));
audio.addEventListener("timeupdate", onTimeUpdate); audio.addEventListener("timeupdate", () => setState((prev) => ({ ...prev, currentTime: audio.currentTime })), { signal });
audio.addEventListener("durationchange", onDurationChange); audio.addEventListener("durationchange", () => setState((prev) => ({ ...prev, duration: audio.duration })), { signal });
audio.addEventListener("loadedmetadata", onDurationChange); audio.addEventListener("loadedmetadata", () => setState((prev) => ({ ...prev, duration: audio.duration })), { signal });
audio.addEventListener("ended", onEnded); audio.addEventListener("ended", () => setState((prev) => ({ ...prev, isPlaying: false, currentTime: 0 })), { signal });
audio.addEventListener("play", onPlay); audio.addEventListener("play", () => setState((prev) => ({ ...prev, isPlaying: true })), { signal });
audio.addEventListener("pause", onPause); audio.addEventListener("pause", () => setState((prev) => ({ ...prev, isPlaying: false })), { signal });
return () => { return () => {
audio.pause(); audio.pause();
audio.removeEventListener("timeupdate", onTimeUpdate); controller.abort();
audio.removeEventListener("durationchange", onDurationChange);
audio.removeEventListener("loadedmetadata", onDurationChange);
audio.removeEventListener("ended", onEnded);
audio.removeEventListener("play", onPlay);
audio.removeEventListener("pause", onPause);
}; };
}, [audioUrl]); }, [audioUrl]);