11import {
22 useRef ,
33 useEffect ,
4- useState ,
54 forwardRef ,
65 useImperativeHandle ,
76 type CSSProperties
@@ -38,11 +37,6 @@ interface GumletPlayerProps {
3837 [ key : string ] : any ; // Allow additional props for iframe src query params
3938}
4039
41- // declare global {
42- // interface Window {
43- // playerJsObj: any;
44- // }
45- // }
4640
4741export interface GumletPlayerHandle {
4842 play : ( ) => void ;
@@ -74,7 +68,7 @@ export const GumletPlayer = forwardRef<GumletPlayerHandle, GumletPlayerProps>(
7468 ref
7569 ) => {
7670 const iframeRef = useRef < HTMLIFrameElement > ( null ) ;
77- const [ playerJSObject , setPlayerJSObject ] = useState < any > ( null ) ;
71+ const playerRef = useRef < any > ( null ) ;
7872
7973 const propsRef = useRef ( props ) ;
8074 propsRef . current = props ;
@@ -103,6 +97,32 @@ export const GumletPlayer = forwardRef<GumletPlayerHandle, GumletPlayerProps>(
10397 'onPlaybackRateChange' ,
10498 ]
10599
100+ const play = ( ) => playerRef . current ?. play ( ) ;
101+ const pause = ( ) => playerRef . current ?. pause ( ) ;
102+ const mute = ( ) => playerRef . current ?. mute ( ) ;
103+ const unmute = ( ) => playerRef . current ?. unmute ( ) ;
104+ const setVolume = ( volume : number ) => playerRef . current ?. setVolume ( volume ) ;
105+ const setCurrentTime = ( time : number ) => playerRef . current ?. setCurrentTime ( time ) ;
106+ const setPlaybackRate = ( rate : number ) => playerRef . current ?. setPlaybackRate ( rate ) ;
107+
108+ const getPaused = ( ) : Promise < boolean > =>
109+ new Promise ( ( resolve ) => playerRef . current ?. getPaused ( resolve ) ) ;
110+
111+ const getMuted = ( ) : Promise < boolean > =>
112+ new Promise ( ( resolve ) => playerRef . current ?. getMuted ( resolve ) ) ;
113+
114+ const getVolume = ( ) : Promise < number > =>
115+ new Promise ( ( resolve ) => playerRef . current ?. getVolume ( resolve ) ) ;
116+
117+ const getDuration = ( ) : Promise < number > =>
118+ new Promise ( ( resolve ) => playerRef . current ?. getDuration ( resolve ) ) ;
119+
120+ const getCurrentTime = ( ) : Promise < number > =>
121+ new Promise ( ( resolve ) => playerRef . current ?. getCurrentTime ( resolve ) ) ;
122+
123+ const getPlaybackRate = ( ) : Promise < number > =>
124+ new Promise ( ( resolve ) => playerRef . current ?. getPlaybackRate ( resolve ) ) ;
125+
106126 useImperativeHandle ( ref , ( ) => ( {
107127 play,
108128 pause,
@@ -121,17 +141,11 @@ export const GumletPlayer = forwardRef<GumletPlayerHandle, GumletPlayerProps>(
121141
122142 useEffect ( ( ) => {
123143 if ( ! iframeRef . current ) return ;
124- const PlayerClass = playerjs . Player ;
125-
126- if ( ! PlayerClass ) {
127- console . error ( "PlayerJS Player class not found in import." ) ;
128- return ;
129- }
130144
131- const player = new PlayerClass ( iframeRef . current ) ;
145+ const player = new playerjs . Player ( iframeRef . current ) ;
132146
133147 // window.playerJsObj = player; // For debugging purposes
134- setPlayerJSObject ( player ) ;
148+ playerRef . current = player ;
135149 player . on ( 'ready' , ( ) => {
136150 propsRef . current . onReady ?.( ) ;
137151
@@ -150,36 +164,13 @@ export const GumletPlayer = forwardRef<GumletPlayerHandle, GumletPlayerProps>(
150164 player . on ( 'error' , ( e : any ) => propsRef . current . onError ?.( e ) ) ;
151165 player . on ( 'playbackRateChange' , ( e : any ) => propsRef . current . onPlaybackRateChange ?.( e ) ) ;
152166 } ) ;
167+ return ( ) => {
168+ playerRef . current = null ;
169+ } ;
153170 } , [ ] ) ;
154171
155172 if ( ! videoID ) return < div > Error: videoID is required</ div > ;
156173
157- const play = ( ) => playerJSObject ?. play ( ) ;
158- const pause = ( ) => playerJSObject ?. pause ( ) ;
159- const mute = ( ) => playerJSObject ?. mute ( ) ;
160- const unmute = ( ) => playerJSObject ?. unmute ( ) ;
161- const setVolume = ( volume : number ) => playerJSObject ?. setVolume ( volume ) ;
162- const setCurrentTime = ( time : number ) => playerJSObject ?. setCurrentTime ( time ) ;
163- const setPlaybackRate = ( rate : number ) => playerJSObject ?. setPlaybackRate ( rate ) ;
164-
165- const getPaused = ( ) : Promise < boolean > =>
166- new Promise ( ( resolve ) => playerJSObject ?. getPaused ( resolve ) ) ;
167-
168- const getMuted = ( ) : Promise < boolean > =>
169- new Promise ( ( resolve ) => playerJSObject ?. getMuted ( resolve ) ) ;
170-
171- const getVolume = ( ) : Promise < number > =>
172- new Promise ( ( resolve ) => playerJSObject ?. getVolume ( resolve ) ) ;
173-
174- const getDuration = ( ) : Promise < number > =>
175- new Promise ( ( resolve ) => playerJSObject ?. getDuration ( resolve ) ) ;
176-
177- const getCurrentTime = ( ) : Promise < number > =>
178- new Promise ( ( resolve ) => playerJSObject ?. getCurrentTime ( resolve ) ) ;
179-
180- const getPlaybackRate = ( ) : Promise < number > =>
181- new Promise ( ( resolve ) => playerJSObject ?. getPlaybackRate ( resolve ) ) ;
182-
183174 const defaultVersion = 'play' ;
184175 const domain = props . version ? `${ props . version } ` : `${ defaultVersion } ` ;
185176 const srcURL = new URL ( `https://${ domain } .gumlet.io/embed${ isLive ? '/live' : '' } /${ videoID } ` ) ;
0 commit comments