import { useState, useRef, useEffect, useCallback } from 'react'; import { useIsMobile } from '../../shared/use-mobile'; import { useOptionalLayout } from '../../../contexts/LayoutContext'; export interface UseAudioPlayerProps { /** Source URL of the audio file */ src?: string; /** Whether to play automatically on mount */ autoPlay?: boolean; /** Initial playback time in seconds */ initialTime?: number; /** Total duration in seconds (optional — loaded from metadata if not provided) */ initialDuration?: number; /** Display variant: 'card' (standard floating) or 'bar' (global fixed bar) */ variant?: 'card' | 'bar'; /** Whether the player is currently visible and open (only for 'bar' variant) */ isOpen?: boolean; /** Whether the player should automatically float when scrolled out of view */ enableAutoFloat?: boolean; /** Callback fired when user manually closes the floating player */ onCloseFloating?: () => void; } export interface UseAudioPlayerReturn { // ── Refs ────────────────────────────────────────────────────────────────── audioRef: React.RefObject; containerRef: React.RefObject; // ── Playback state ──────────────────────────────────────────────────────── isPlaying: boolean; currentTime: number; duration: number; volume: number; isMuted: boolean; playbackSpeed: number; // ── UI state ────────────────────────────────────────────────────────────── isFloating: boolean; isManualFloating: boolean; isVisible: boolean; isMobile: boolean; enableAutoFloatLocal: boolean; // ── Layout context (for 'bar' variant positioning) ──────────────────────── sidebarExpanded: boolean; sidebarWidth: number; assistenteExpanded: boolean; // ── Handlers ────────────────────────────────────────────────────────────── togglePlay: () => void; toggleMute: () => void; handleSeek: (value: number[]) => void; handleVolumeChange: (value: number[]) => void; handleSetFloating: (floating: boolean) => void; handleEnableManualFloat: () => void; setPlaybackSpeed: (speed: number) => void; resetAudio: () => void; // ── Audio element event handlers (for use in