|
|
|
@ -10,6 +10,7 @@ export type PlayerState = { |
|
|
|
isPlaying: boolean; |
|
|
|
isPlaying: boolean; |
|
|
|
isPaused: boolean; |
|
|
|
isPaused: boolean; |
|
|
|
isSeeking: boolean; |
|
|
|
isSeeking: boolean; |
|
|
|
|
|
|
|
isLoading: boolean; |
|
|
|
isFullscreen: boolean; |
|
|
|
isFullscreen: boolean; |
|
|
|
time: number; |
|
|
|
time: number; |
|
|
|
duration: number; |
|
|
|
duration: number; |
|
|
|
@ -21,6 +22,7 @@ export const initialPlayerState: PlayerState = { |
|
|
|
isPlaying: false, |
|
|
|
isPlaying: false, |
|
|
|
isPaused: true, |
|
|
|
isPaused: true, |
|
|
|
isFullscreen: false, |
|
|
|
isFullscreen: false, |
|
|
|
|
|
|
|
isLoading: false, |
|
|
|
isSeeking: false, |
|
|
|
isSeeking: false, |
|
|
|
time: 0, |
|
|
|
time: 0, |
|
|
|
duration: 0, |
|
|
|
duration: 0, |
|
|
|
@ -43,16 +45,26 @@ function readState(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
state.duration = player.duration; |
|
|
|
state.duration = player.duration; |
|
|
|
state.volume = player.volume; |
|
|
|
state.volume = player.volume; |
|
|
|
state.buffered = handleBuffered(player.currentTime, player.buffered); |
|
|
|
state.buffered = handleBuffered(player.currentTime, player.buffered); |
|
|
|
|
|
|
|
state.isLoading = false; |
|
|
|
|
|
|
|
|
|
|
|
update(state); |
|
|
|
update(state); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
const pause = () => { |
|
|
|
const pause = () => { |
|
|
|
update((s) => ({ ...s, isPaused: true, isPlaying: false })); |
|
|
|
update((s) => ({ |
|
|
|
|
|
|
|
...s, |
|
|
|
|
|
|
|
isPaused: true, |
|
|
|
|
|
|
|
isPlaying: false, |
|
|
|
|
|
|
|
})); |
|
|
|
}; |
|
|
|
}; |
|
|
|
const play = () => { |
|
|
|
const playing = () => { |
|
|
|
update((s) => ({ ...s, isPaused: false, isPlaying: true })); |
|
|
|
update((s) => ({ |
|
|
|
|
|
|
|
...s, |
|
|
|
|
|
|
|
isPaused: false, |
|
|
|
|
|
|
|
isPlaying: true, |
|
|
|
|
|
|
|
isLoading: false, |
|
|
|
|
|
|
|
})); |
|
|
|
}; |
|
|
|
}; |
|
|
|
const seeking = () => { |
|
|
|
const seeking = () => { |
|
|
|
update((s) => ({ ...s, isSeeking: true })); |
|
|
|
update((s) => ({ ...s, isSeeking: true })); |
|
|
|
@ -60,6 +72,9 @@ function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
const seeked = () => { |
|
|
|
const seeked = () => { |
|
|
|
update((s) => ({ ...s, isSeeking: false })); |
|
|
|
update((s) => ({ ...s, isSeeking: false })); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
const waiting = () => { |
|
|
|
|
|
|
|
update((s) => ({ ...s, isLoading: true })); |
|
|
|
|
|
|
|
}; |
|
|
|
const fullscreenchange = () => { |
|
|
|
const fullscreenchange = () => { |
|
|
|
update((s) => ({ ...s, isFullscreen: !!document.fullscreenElement })); |
|
|
|
update((s) => ({ ...s, isFullscreen: !!document.fullscreenElement })); |
|
|
|
}; |
|
|
|
}; |
|
|
|
@ -90,7 +105,7 @@ function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
player.addEventListener("pause", pause); |
|
|
|
player.addEventListener("pause", pause); |
|
|
|
player.addEventListener("play", play); |
|
|
|
player.addEventListener("playing", playing); |
|
|
|
player.addEventListener("seeking", seeking); |
|
|
|
player.addEventListener("seeking", seeking); |
|
|
|
player.addEventListener("seeked", seeked); |
|
|
|
player.addEventListener("seeked", seeked); |
|
|
|
document.addEventListener("fullscreenchange", fullscreenchange); |
|
|
|
document.addEventListener("fullscreenchange", fullscreenchange); |
|
|
|
@ -98,10 +113,11 @@ function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
player.addEventListener("loadedmetadata", loadedmetadata); |
|
|
|
player.addEventListener("loadedmetadata", loadedmetadata); |
|
|
|
player.addEventListener("volumechange", volumechange); |
|
|
|
player.addEventListener("volumechange", volumechange); |
|
|
|
player.addEventListener("progress", progress); |
|
|
|
player.addEventListener("progress", progress); |
|
|
|
|
|
|
|
player.addEventListener("waiting", waiting); |
|
|
|
|
|
|
|
|
|
|
|
return () => { |
|
|
|
return () => { |
|
|
|
player.removeEventListener("pause", pause); |
|
|
|
player.removeEventListener("pause", pause); |
|
|
|
player.removeEventListener("play", play); |
|
|
|
player.removeEventListener("playing", playing); |
|
|
|
player.removeEventListener("seeking", seeking); |
|
|
|
player.removeEventListener("seeking", seeking); |
|
|
|
player.removeEventListener("seeked", seeked); |
|
|
|
player.removeEventListener("seeked", seeked); |
|
|
|
document.removeEventListener("fullscreenchange", fullscreenchange); |
|
|
|
document.removeEventListener("fullscreenchange", fullscreenchange); |
|
|
|
@ -109,6 +125,7 @@ function registerListeners(player: HTMLVideoElement, update: SetPlayer) { |
|
|
|
player.removeEventListener("loadedmetadata", loadedmetadata); |
|
|
|
player.removeEventListener("loadedmetadata", loadedmetadata); |
|
|
|
player.removeEventListener("volumechange", volumechange); |
|
|
|
player.removeEventListener("volumechange", volumechange); |
|
|
|
player.removeEventListener("progress", progress); |
|
|
|
player.removeEventListener("progress", progress); |
|
|
|
|
|
|
|
player.removeEventListener("waiting", waiting); |
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|