@@ -12,7 +12,7 @@ const props = withDefaults(defineProps<{
12
12
rootAttrs? : HTMLAttributes
13
13
aboveTheFold? : boolean
14
14
// copied from @types/vimeo__player
15
- id: string | number | undefined
15
+ id: number | undefined
16
16
url? : string | undefined
17
17
autopause? : boolean | undefined
18
18
autoplay? : boolean | undefined
@@ -34,7 +34,7 @@ const props = withDefaults(defineProps<{
34
34
portrait? : boolean | undefined
35
35
responsive? : boolean | undefined
36
36
speed? : boolean | undefined
37
- quality? : VimeoVideoQuality | undefined
37
+ quality? : Vimeo . VimeoVideoQuality | undefined
38
38
texttrack? : string | undefined
39
39
title? : boolean | undefined
40
40
transparent? : boolean | undefined
@@ -47,35 +47,40 @@ const props = withDefaults(defineProps<{
47
47
controls: true ,
48
48
})
49
49
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 )[] = [
79
84
' play' ,
80
85
' playing' ,
81
86
' pause' ,
@@ -99,6 +104,8 @@ const events = [
99
104
' qualitychange' ,
100
105
' camerachange' ,
101
106
' resize' ,
107
+ ' enterpictureinpicture' ,
108
+ ' leavepictureinpicture' ,
102
109
]
103
110
104
111
const elVimeo = ref ()
@@ -133,15 +140,15 @@ if (import.meta.server) {
133
140
const { data : payload } = useAsyncData (
134
141
` vimeo-embed:${props .id } ` ,
135
142
// 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 ]),
137
144
{
138
145
watch: [() => props .id ],
139
146
},
140
147
)
141
148
142
149
const placeholder = computed (() => payload .value ?.thumbnail_large )
143
150
144
- let player: Player | undefined
151
+ let player: Vimeo | undefined
145
152
// we can't directly expose the player as vue will break the proxy
146
153
defineExpose ({
147
154
play : () => player ?.play (),
@@ -158,6 +165,7 @@ defineExpose({
158
165
getPlaybackRate : () => player ?.getPlaybackRate (),
159
166
setPlaybackRate : (rate : number ) => player ?.setPlaybackRate (rate ),
160
167
})
168
+
161
169
onMounted (() => {
162
170
$script .then (async ({ Vimeo }) => {
163
171
// filter props for false values
@@ -170,7 +178,8 @@ onMounted(() => {
170
178
clickTriggered = false
171
179
}
172
180
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
174
183
emits (event , e , player )
175
184
if (event === ' loaded' )
176
185
ready .value = true
0 commit comments