import type { EmbedOptions, EventCallback, VimeoPlayer } from '../types/vimeo'; class WebVimeoPlayerController { private player: VimeoPlayer | null = null; static createInstance(): WebVimeoPlayerController { return new WebVimeoPlayerController(); } static initialize(): Promise { if (typeof window === 'undefined' || window.Vimeo?.Player) { return Promise.resolve(); } if (window._vimeoApiPromise) { return window._vimeoApiPromise; } window._vimeoApiPromise = new Promise((resolve) => { if (document.querySelector('script[src*="vimeo.com/api/player.js"]')) { let attempts = 0; const maxAttempts = 100; const checkAPI = () => { if (window.Vimeo?.Player) { resolve(); return; } if (attempts >= maxAttempts) { console.error('Vimeo API failed to load after timeout'); resolve(); return; } attempts++; setTimeout(checkAPI, 100); }; checkAPI(); return; } const script = document.createElement('script'); script.src = 'https://player.vimeo.com/api/player.js'; script.async = true; script.onload = () => { console.log('Vimeo API loaded'); resolve(); }; document.head.appendChild(script); }); return window._vimeoApiPromise; } createPlayer(containerId: string, options: EmbedOptions): VimeoPlayer | null { if (typeof window === 'undefined' || !window.Vimeo) { return null; } const container = document.getElementById(containerId); if (!container) { return null; } if (this.player) { try { this.player.destroy(); } catch (error) { console.warn('Error destroying Vimeo player:', error); } } this.player = new window.Vimeo.Player(containerId, options); return this.player; } getVimeoPlayer(): VimeoPlayer | null { return this.player; } async play(): Promise { await this.player?.play(); } async pause(): Promise { await this.player?.pause(); } async unload(): Promise { await this.player?.unload(); } async setCurrentTime(seconds: number): Promise { return this.player?.setCurrentTime(seconds) ?? 0; } async getCurrentTime(): Promise { return this.player?.getCurrentTime() ?? 0; } async setVolume(volume: number): Promise { return this.player?.setVolume(volume) ?? 0; } async getVolume(): Promise { return this.player?.getVolume() ?? 0; } async setMuted(muted: boolean): Promise { return this.player?.setMuted(muted) ?? false; } async getMuted(): Promise { return this.player?.getMuted() ?? false; } async getDuration(): Promise { return this.player?.getDuration() ?? 0; } async getPlaybackRate(): Promise { return this.player?.getPlaybackRate() ?? 0; } async setPlaybackRate(rate: number): Promise { return this.player?.setPlaybackRate(rate) ?? 0; } async getVideoId(): Promise { return this.player?.getVideoId() ?? 0; } async getVideoTitle(): Promise { return this.player?.getVideoTitle() ?? ''; } async getVideoWidth(): Promise { return this.player?.getVideoWidth() ?? 0; } async getVideoHeight(): Promise { return this.player?.getVideoHeight() ?? 0; } async getVideoUrl(): Promise { return this.player?.getVideoUrl() ?? ''; } async requestFullscreen(): Promise { await this.player?.requestFullscreen(); } async exitFullscreen(): Promise { await this.player?.exitFullscreen(); } async getFullscreen(): Promise { return this.player?.getFullscreen() ?? false; } off(event: string, callback?: EventCallback): void { this.player?.off(event, callback); } dispose(): void { if (this.player) { try { this.player.destroy(); } catch (error) { console.warn('Error destroying Vimeo player:', error); } this.player = null; } } } export default WebVimeoPlayerController;