@@ -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+ } ;
0 commit comments