11import { createRenderer } from '@/utils' ;
2+ import { waitForElement } from '@/utils/wait-for-element' ;
23
34import { makeLyricsRequest } from './lyrics' ;
45import { selectors , tabStates } from './utils' ;
@@ -15,10 +16,9 @@ export let _ytAPI: YoutubePlayer | null = null;
1516
1617export const renderer = createRenderer < {
1718 observerCallback : MutationCallback ;
18- onPlayerApiReady : ( api : YoutubePlayer ) => void ;
1919 hasAddedEvents : boolean ;
2020 observer ?: MutationObserver ;
21- videoDataChange : ( ) => void ;
21+ videoDataChange : ( ) => Promise < void > ;
2222 progressCallback : ( evt : Event ) => void ;
2323} , SyncedLyricsPluginConfig > ( {
2424 onConfigChange ( newConfig ) {
@@ -42,17 +42,17 @@ export const renderer = createRenderer<{
4242 }
4343 } ,
4444
45- onPlayerApiReady ( api : YoutubePlayer ) {
45+ async onPlayerApiReady ( api : YoutubePlayer ) {
4646 _ytAPI = api ;
4747
4848 api . addEventListener ( 'videodatachange' , this . videoDataChange ) ;
4949
50- this . videoDataChange ( ) ;
50+ await this . videoDataChange ( ) ;
5151 } ,
5252
5353 hasAddedEvents : false ,
5454
55- videoDataChange ( ) {
55+ async videoDataChange ( ) {
5656 if ( ! this . hasAddedEvents ) {
5757 const video = document . querySelector ( 'video' ) ;
5858
@@ -61,15 +61,14 @@ export const renderer = createRenderer<{
6161 if ( video ) this . hasAddedEvents = true ;
6262 }
6363
64- const header = document . querySelector < HTMLElement > ( selectors . head ) ;
65- if ( ! header ) return ;
66-
6764 this . observer ??= new MutationObserver (
6865 this . observerCallback ,
6966 ) ;
7067
7168 // Force the lyrics tab to be enabled at all times.
7269 this . observer . disconnect ( ) ;
70+
71+ const header = await waitForElement < HTMLElement > ( selectors . head ) ;
7372 this . observer . observe ( header , { attributes : true } ) ;
7473 header . removeAttribute ( 'disabled' ) ;
7574 } ,
0 commit comments