Skip to content

Commit b930455

Browse files
authored
fix(vimeo): fix vimeo types (#65)
1 parent 3b642dd commit b930455

File tree

2 files changed

+46
-35
lines changed

2 files changed

+46
-35
lines changed

src/runtime/components/ScriptVimeoPlayer.vue

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const props = withDefaults(defineProps<{
1212
rootAttrs?: HTMLAttributes
1313
aboveTheFold?: boolean
1414
// copied from @types/vimeo__player
15-
id: string | number | undefined
15+
id: number | undefined
1616
url?: string | undefined
1717
autopause?: boolean | undefined
1818
autoplay?: boolean | undefined
@@ -34,7 +34,7 @@ const props = withDefaults(defineProps<{
3434
portrait?: boolean | undefined
3535
responsive?: boolean | undefined
3636
speed?: boolean | undefined
37-
quality?: VimeoVideoQuality | undefined
37+
quality?: Vimeo.VimeoVideoQuality | undefined
3838
texttrack?: string | undefined
3939
title?: boolean | undefined
4040
transparent?: boolean | undefined
@@ -47,35 +47,40 @@ const props = withDefaults(defineProps<{
4747
controls: true,
4848
})
4949
50-
const emits = defineEmits<{
51-
play: [e: EventMap['play'], player: Player]
52-
playing: [e: EventMap['playing'], player: Player]
53-
pause: [e: EventMap['pause'], player: Player]
54-
ended: [e: EventMap['ended'], player: Player]
55-
timeupdate: [e: EventMap['timeupdate'], player: Player]
56-
progress: [e: EventMap['progress'], player: Player]
57-
seeking: [e: EventMap['seeking'], player: Player]
58-
seeked: [e: EventMap['seeked'], player: Player]
59-
texttrackchange: [e: EventMap['texttrackchange'], player: Player]
60-
chapterchange: [e: EventMap['chapterchange'], player: Player]
61-
cuechange: [e: EventMap['cuechange'], player: Player]
62-
cuepoint: [e: EventMap['cuepoint'], player: Player]
63-
volumechange: [e: EventMap['volumechange'], player: Player]
64-
playbackratechange: [e: EventMap['playbackratechange'], player: Player]
65-
bufferstart: [e: EventMap['bufferstart'], player: Player]
66-
bufferend: [e: EventMap['bufferend'], player: Player]
67-
error: [e: EventMap['error'], player: Player]
68-
loaded: [e: EventMap['loaded'], player: Player]
69-
durationchange: [e: EventMap['durationchange'], player: Player]
70-
fullscreenchange: [e: EventMap['fullscreenchange'], player: Player]
71-
qualitychange: [e: EventMap['qualitychange'], player: Player]
72-
camerachange: [e: EventMap['camerachange'], player: Player]
73-
resize: [e: EventMap['resize'], player: Player]
74-
enterpictureinpicture: [e: EventMap['enterpictureinpicture'], player: Player]
75-
leavepictureinpicture: [e: EventMap['leavepictureinpicture'], player: Player]
76-
}>()
77-
78-
const events = [
50+
const emits = defineEmits<TEmits>()
51+
52+
type EventMap<E extends keyof Vimeo.EventMap> = [event: Vimeo.EventMap[E], player: Vimeo]
53+
54+
// eslint-disable-next-line ts/consistent-type-definitions
55+
type TEmits = {
56+
play: EventMap<'play'>
57+
playing: EventMap<'playing'>
58+
pause: EventMap<'pause'>
59+
ended: EventMap<'ended'>
60+
timeupdate: EventMap<'timeupdate'>
61+
progress: EventMap<'progress'>
62+
seeking: EventMap<'seeking'>
63+
seeked: EventMap<'seeked'>
64+
texttrackchange: EventMap<'texttrackchange'>
65+
chapterchange: EventMap<'chapterchange'>
66+
cuechange: EventMap<'cuechange'>
67+
cuepoint: EventMap<'cuepoint'>
68+
volumechange: EventMap<'volumechange'>
69+
playbackratechange: EventMap<'playbackratechange'>
70+
bufferstart: EventMap<'bufferstart'>
71+
bufferend: EventMap<'bufferend'>
72+
error: EventMap<'error'>
73+
loaded: EventMap<'loaded'>
74+
durationchange: EventMap<'durationchange'>
75+
fullscreenchange: EventMap<'fullscreenchange'>
76+
qualitychange: EventMap<'qualitychange'>
77+
camerachange: EventMap<'camerachange'>
78+
resize: EventMap<'resize'>
79+
enterpictureinpicture: EventMap<'enterpictureinpicture'>
80+
leavepictureinpicture: EventMap<'leavepictureinpicture'>
81+
}
82+
83+
const events: (keyof TEmits)[] = [
7984
'play',
8085
'playing',
8186
'pause',
@@ -99,6 +104,8 @@ const events = [
99104
'qualitychange',
100105
'camerachange',
101106
'resize',
107+
'enterpictureinpicture',
108+
'leavepictureinpicture',
102109
]
103110
104111
const elVimeo = ref()
@@ -133,15 +140,15 @@ if (import.meta.server) {
133140
const { data: payload } = useAsyncData(
134141
`vimeo-embed:${props.id}`,
135142
// TODO ideally we cache this
136-
() => $fetch(`https://vimeo.com/api/v2/video/${props.id}.json`).then(res => res[0]),
143+
() => $fetch(`https://vimeo.com/api/v2/video/${props.id}.json`).then(res => (res as any)[0]),
137144
{
138145
watch: [() => props.id],
139146
},
140147
)
141148
142149
const placeholder = computed(() => payload.value?.thumbnail_large)
143150
144-
let player: Player | undefined
151+
let player: Vimeo | undefined
145152
// we can't directly expose the player as vue will break the proxy
146153
defineExpose({
147154
play: () => player?.play(),
@@ -158,6 +165,7 @@ defineExpose({
158165
getPlaybackRate: () => player?.getPlaybackRate(),
159166
setPlaybackRate: (rate: number) => player?.setPlaybackRate(rate),
160167
})
168+
161169
onMounted(() => {
162170
$script.then(async ({ Vimeo }) => {
163171
// filter props for false values
@@ -170,7 +178,8 @@ onMounted(() => {
170178
clickTriggered = false
171179
}
172180
for (const event of events) {
173-
player!.on(event, (e) => {
181+
player!.on(event, (e: EventMap<typeof event>) => {
182+
// @ts-expect-error ts isn't able to infer the correct event type
174183
emits(event, e, player)
175184
if (event === 'loaded')
176185
ready.value = true

src/runtime/registry/vimeo-player.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import { useRegistryScript } from '../utils'
44
import type { RegistryScriptInput } from '#nuxt-scripts'
55
import { useHead } from '#imports'
66

7+
type Constructor<T extends new (...args: any) => any> = T extends new (...args: infer A) => infer R ? new (...args: A) => R : never
8+
79
export interface VimeoPlayerApi {
810
Vimeo: {
9-
Player: VimeoPlayerApi
11+
Player: Constructor<typeof window.Vimeo>
1012
}
1113
}
1214

0 commit comments

Comments
 (0)