import { RefreshCw } from "lucide-react" import { useCallback, useEffect, useState } from "react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { useModal } from "@/features/modals" import { useAudioDevices } from "../hooks/use-audio-devices" import { useAudioPermissions } from "../hooks/use-audio-permissions" import { useVoiceRecording } from "../hooks/use-voice-recording" import { AudioPermissionRequest } from "./audio-permission-request" export function VoiceRecordModal() { const { t } = useTranslation() const [savePath, setSavePath] = useState("") const [isMuted] = useState(true) const { isOpen, closeModal } = useModal() // Проверяем поддержку MediaDevices API const [isMediaDevicesSupported] = useState(() => { return !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) }) // Используем хук для управления разрешениями на доступ к микрофону const { permissionStatus, errorMessage, requestPermissions, setErrorMessage } = useAudioPermissions() // Используем хук для управления аудио устройствами const { audioDevices, selectedAudioDevice, setSelectedAudioDevice, getDevices } = useAudioDevices({ setErrorMessage, }) // Функция для сохранения аудиозаписи (временная заглушка) const saveAudioToServer = useCallback( async (blob: Blob, fileName: string) => { try { // Создаем URL для предпросмотра записи const audioUrl = URL.createObjectURL(blob) // В реальном приложении здесь будет код для сохранения файла console.log("Аудиозапись создана:", { fileName, size: blob.size, url: audioUrl }) // Можно добавить код для скачивания файла // const a = document.createElement("a") // a.href = audioUrl // a.download = fileName // a.click() // Закрываем диалог после успешного сохранения closeModal() } catch (error) { console.error("Ошибка при сохранении аудиозаписи:", error) setErrorMessage(t("dialogs.voiceRecord.saveError", "Ошибка при сохранении аудиозаписи")) } }, [closeModal, setErrorMessage, t], ) // Используем хук для управления записью голоса const { isRecording, showCountdown, recordingTime, isDeviceReady, countdown, setCountdown, audioRef, formatTime, stopRecording, startCountdown, initAudio, cleanup, } = useVoiceRecording({ selectedAudioDevice, isMuted, setErrorMessage, onSaveRecording: saveAudioToServer, }) // Получаем устройства после получения разрешений const getDevicesAfterPermissions = useCallback(async () => { try { // Запрашиваем разрешения с помощью хука const permissionGranted = await requestPermissions() if (permissionGranted) { // Если разрешения получены, получаем список устройств await getDevices() } } catch (error) { console.error("Ошибка при получении устройств после разрешений:", error) } }, [requestPermissions, getDevices]) // Запрашиваем устройства и запускаем микрофон при открытии модального окна useEffect(() => { if (isOpen) { void getDevicesAfterPermissions() } else { cleanup() } }, [isOpen, getDevicesAfterPermissions, cleanup]) // Инициализируем микрофон при изменении устройства useEffect(() => { if (isOpen && selectedAudioDevice) { void initAudio() } }, [isOpen, selectedAudioDevice, initAudio]) // Если MediaDevices не поддерживается, показываем сообщение if (!isMediaDevicesSupported) { return (

{t("dialogs.voiceRecord.notSupported", "Запись звука недоступна")}

{t( "dialogs.voiceRecord.notSupportedDescription", "Запись звука не поддерживается в десктопном приложении. Эта функция доступна только при использовании Timeline Studio в веб-браузере.", )}

) } return (
{/* Отображаем компонент запроса разрешений */} {/* Основной контент */} {permissionStatus === "granted" && ( <> {/* Аудио элемент для предпросмотра (скрытый) */}