Skip to content

Commit

Permalink
5.10. Добавит новый хук useElementListener
Browse files Browse the repository at this point in the history
Компонент `AudioPlayer` можно оптимизировать. Для этого вынесем логику
добавления и удаления событий на элемент `<audio>` в новый хук useElementListener.
  • Loading branch information
kam4atka authored and AntonovIgor committed Dec 1, 2023
1 parent 1cd2a8c commit 0826b76
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 13 deletions.
15 changes: 2 additions & 13 deletions src/components/audio-player/audio-player.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {Fragment, useState, useEffect, useRef} from 'react';
import cn from 'classnames';
import {useElementListener} from '../../hooks/use-element-listener';

type AudioPlayerProps = {
isPlaying: boolean;
Expand All @@ -16,19 +17,7 @@ function AudioPlayer({isPlaying, src, onPlayButtonClick}: AudioPlayerProps): JSX
setIsLoaded(true);
};

useEffect(() => {
const playerElement = audioRef.current;

if (!playerElement) {
return;
}

playerElement.addEventListener('loadeddata', handleDataLoaded);

return () => {
playerElement.removeEventListener('loadeddata', handleDataLoaded);
};
}, []);
useElementListener('loadeddata', audioRef, handleDataLoaded);

useEffect(() => {
const playerElement = audioRef.current;
Expand Down
22 changes: 22 additions & 0 deletions src/hooks/use-element-listener.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import {RefObject, useEffect} from 'react';

export const useElementListener = (
eventName: string,
element: RefObject<HTMLElement>,
listener: (evt: Event) => void
) => {

useEffect(() => {
const domElement = element.current;

if (!domElement) {
return;
}

domElement.addEventListener(eventName, listener);

return () => {
domElement.removeEventListener(eventName, listener);
};
}, [eventName, element, listener]);
};

0 comments on commit 0826b76

Please sign in to comment.