68 lines
2.0 KiB
TypeScript
Executable File
68 lines
2.0 KiB
TypeScript
Executable File
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]
|
|
);
|
|
}
|