import { useImperativeHandle, forwardRef, useRef, useState, useCallback, useEffect } from 'react'; import isElectron from 'is-electron'; import type { ReactPlayerProps } from 'react-player'; import ReactPlayer from 'react-player/lazy'; import type { Song } from '/@/renderer/api/types'; import { crossfadeHandler, gaplessHandler, } from '/@/renderer/components/audio-player/utils/list-handlers'; import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store'; import type { CrossfadeStyle } from '/@/renderer/types'; import { PlaybackStyle, PlayerStatus } from '/@/renderer/types'; import { useSpeed } from '/@/renderer/store'; import { toast } from '/@/renderer/components/toast'; interface AudioPlayerProps extends ReactPlayerProps { crossfadeDuration: number; crossfadeStyle: CrossfadeStyle; currentPlayer: 1 | 2; playbackStyle: PlaybackStyle; player1: Song; player2: Song; status: PlayerStatus; volume: number; } export type AudioPlayerProgress = { loaded: number; loadedSeconds: number; played: number; playedSeconds: number; }; const getDuration = (ref: any) => { return ref.current?.player?.player?.player?.duration; }; type WebAudio = { context: AudioContext; gain: GainNode; }; // Credits: https://gist.github.com/novwhisky/8a1a0168b94f3b6abfaa?permalink_comment_id=1551393#gistcomment-1551393 // This is used so that the player will always have an