Skip to content

Commit a91c1f1

Browse files
authored
Merge pull request #1581 from arminyahya/pr/createHTMLMediaHook-typing
fix: add generic parameter to createHTMLMediaHook. no typecheck problem with ref anymore
2 parents d170dea + 1f547ef commit a91c1f1

3 files changed

Lines changed: 13 additions & 19 deletions

File tree

src/factory/createHTMLMediaHook.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,20 @@ export interface HTMLMediaControls {
2727
seek: (time: number) => void;
2828
}
2929

30-
type createHTMLMediaHookReturn = [
31-
React.ReactElement<HTMLMediaProps>,
32-
HTMLMediaState,
33-
HTMLMediaControls,
34-
{ current: HTMLAudioElement | null }
35-
];
36-
37-
export default function createHTMLMediaHook(tag: 'audio' | 'video') {
30+
type MediaPropsWithRef<T> = HTMLMediaProps & { ref?: React.MutableRefObject<T | null> };
31+
32+
export default function createHTMLMediaHook<T extends HTMLAudioElement | HTMLVideoElement>(tag: 'audio' | 'video') {
3833
return (
3934
elOrProps: HTMLMediaProps | React.ReactElement<HTMLMediaProps>
40-
): createHTMLMediaHookReturn => {
41-
let element: React.ReactElement<any> | undefined;
42-
let props: HTMLMediaProps;
35+
) => {
36+
let element: React.ReactElement<MediaPropsWithRef<T>> | undefined;
37+
let props: MediaPropsWithRef<T>;
4338

4439
if (React.isValidElement(elOrProps)) {
4540
element = elOrProps;
4641
props = element.props;
4742
} else {
48-
props = elOrProps as HTMLMediaProps;
43+
props = elOrProps;
4944
}
5045

5146
const [state, setState] = useSetState<HTMLMediaState>({
@@ -56,7 +51,7 @@ export default function createHTMLMediaHook(tag: 'audio' | 'video') {
5651
muted: false,
5752
volume: 1,
5853
});
59-
const ref = useRef<HTMLAudioElement | null>(null);
54+
const ref = useRef<T | null>(null);
6055

6156
const wrapEvent = (userEvent, proxyEvent?) => {
6257
return (event) => {
@@ -234,6 +229,6 @@ export default function createHTMLMediaHook(tag: 'audio' | 'video') {
234229
}
235230
}, [props.src]);
236231

237-
return [element, state, controls, ref];
238-
};
239-
}
232+
return [element, state, controls, ref] as const;
233+
}
234+
};

src/useAudio.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import createHTMLMediaHook from './factory/createHTMLMediaHook';
22

3-
const useAudio = createHTMLMediaHook('audio');
4-
3+
const useAudio = createHTMLMediaHook<HTMLAudioElement>('audio');
54
export default useAudio;

src/useVideo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import createHTMLMediaHook from './factory/createHTMLMediaHook';
22

3-
const useVideo = createHTMLMediaHook('video');
3+
const useVideo = createHTMLMediaHook<HTMLVideoElement>('video');
44

55
export default useVideo;

0 commit comments

Comments
 (0)