import {HtmlMediaInternalStateReturn} from '@common/player/providers/html-media/use-html-media-internal-state';
import {useContext, useMemo} from 'react';
import {PlayerStoreContext} from '@common/player/player-context';
import {PlayerProviderApi} from '@common/player/state/player-provider-api';
export function useHtmlMediaApi({
ref,
internalState,
toggleTextTrackModes,
}: HtmlMediaInternalStateReturn): PlayerProviderApi {
const store = useContext(PlayerStoreContext);
return useMemo(
() => ({
play: async () => {
try {
await ref.current?.play();
} catch (e) {
store.getState().emit('error', {sourceEvent: e});
}
internalState.current.timeRafLoop.start();
},
pause: () => {
ref.current?.pause();
internalState.current.timeRafLoop.stop();
},
stop: () => {
if (ref.current) {
ref.current.pause();
ref.current.currentTime = 0;
}
},
seek: (time: number) => {
if (time !== internalState.current.currentTime && ref.current) {
ref.current.currentTime = time;
}
},
setVolume: (volume: number) => {
if (ref.current) {
ref.current.volume = volume / 100;
}
},
setMuted: (muted: boolean) => {
if (ref.current) {
ref.current.muted = muted;
}
},
setPlaybackRate: (value: number) => {
if (ref.current) {
ref.current.playbackRate = value;
}
},
setTextTrackVisibility: isVisible => {
toggleTextTrackModes(store.getState().currentTextTrack, isVisible);
},
setCurrentTextTrack: newTrackId => {
toggleTextTrackModes(newTrackId, store.getState().textTrackIsVisible);
},
getCurrentTime: () => {
return internalState.current.currentTime;
},
getSrc: () => {
return ref.current?.src;
},
}),
[ref, store, internalState, toggleTextTrackModes]
);
}