Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,18 @@ interface EnterPictureInPictureEventInit extends EventInit {
pictureInPictureWindow: PictureInPictureWindow
}

interface LeavePictureInPictureEventInit extends EventInit {
pictureInPictureWindow: PictureInPictureWindow
}

export interface EnterPictureInPictureEvent extends Event {
readonly pictureInPictureWindow: PictureInPictureWindow
}

export interface LeavePictureInPictureEvent extends Event {
readonly pictureInPictureWindow: PictureInPictureWindow
}

declare var EnterPictureInPictureEvent: {
prototype: EnterPictureInPictureEvent
new (
Expand Down
68 changes: 34 additions & 34 deletions src/use-picture-in-picture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
usePictureInPictureOptions,
usePictureInPictureReturnType,
VideoRefType,
EnterPictureInPictureEvent,
} from './types'

export default function usePictureInPicture(
Expand Down Expand Up @@ -57,47 +58,48 @@ export default function usePictureInPicture(
!isPictureInPictureDisabled(videoRef.current)
)

if (
onEnterPictureInPicture &&
typeof onEnterPictureInPicture === 'function'
) {
videoRef.current.addEventListener(
'enterpictureinpicture',
onEnterPictureInPicture
)
}
if (
onLeavePictureInPicture &&
typeof onLeavePictureInPicture === 'function'
) {
videoRef.current.addEventListener(
'leavepictureinpicture',
onLeavePictureInPicture
)
}

return () => {
if (videoRef.current === null) {
return
}
function _onEnterPictureInPicture(e: EnterPictureInPictureEvent) {
if (
onEnterPictureInPicture &&
typeof onEnterPictureInPicture === 'function'
) {
videoRef.current.removeEventListener(
'enterpictureinpicture',
onEnterPictureInPicture
)
// @ts-ignore
onEnterPictureInPicture(e)
}
togglePictureInPicture(true)
}
function _onLeavePictureInPicture(e: Event) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since the leavepictureinpicture event doesn't use the LeavePictureInPictureEvent type, at least in my environment, I'm just using Event here. lmk if I should remove LeavePictureInPictureEvent above

if (
onLeavePictureInPicture &&
typeof onLeavePictureInPicture === 'function'
) {
videoRef.current.removeEventListener(
'leavepictureinpicture',
onLeavePictureInPicture
)
// @ts-ignore
onLeavePictureInPicture(e)
}
togglePictureInPicture(false)
}

videoRef.current.addEventListener(
'enterpictureinpicture',
_onEnterPictureInPicture
)
videoRef.current.addEventListener(
'leavepictureinpicture',
_onLeavePictureInPicture
)

return () => {
if (videoRef.current === null) {
return
}
videoRef.current.removeEventListener(
'enterpictureinpicture',
_onEnterPictureInPicture
)
videoRef.current.removeEventListener(
'leavepictureinpicture',
_onLeavePictureInPicture
)
}
}, [])

Expand Down Expand Up @@ -138,9 +140,7 @@ function checkAvailability(video: ExtendedHTMLVideoElement | null) {
)
}
if (video && isWebkitPictureInPictureSupported(video)) {
console.warn(
'Your browser supports a none-standard Picture in picture API.'
)
console.warn('Your browser supports a non-standard Picture in picture API.')
}
}

Expand Down