import React, { useState, useEffect, useRef } from 'react'; import { Heart, Sparkles, Volume2, Music, PauseCircle, PlayCircle, AlertCircle, X } from 'lucide-react'; const animals = [ { id: 1, name: 'Зайка', emoji: '🐰', color: 'bg-pink-100', poem: 'Зайка серенький сидит и ушами шевелИт!', audioFileName: 'Песенки с движениями - Зайка серенький сидит.mp3' }, { id: 2, name: 'Лисичка', emoji: '🦊', color: 'bg-orange-100', poem: 'Я рыжая лисичка, я Никуши сестричка! Хвостиком машу я, весело пляшу я!' }, { id: 3, name: 'Поросенок', emoji: '🐷', color: 'bg-pink-200', poem: 'Хрю-хрю-хрю, я говорю, я Никушу так люблю! Розовое брюшко, милые ушки!' }, { id: 4, name: 'Енот', emoji: '🦝', color: 'bg-gray-100', poem: 'Я енот-полоскун, я веселый прыгун! Лапки чисто я помыл, про Никушу не забыл!' }, { id: 5, name: 'Гусеница', emoji: '🐛', color: 'bg-green-100', poem: 'Раз-два-три-четыре-пять, буду я сейчас шагать! Стану бабочкой цветной, полечу я за тобой!' }, { id: 6, name: 'Ежик', emoji: '🦔', color: 'bg-yellow-100', poem: 'Ежик, ежик, весь в иголках, я живу в лесу на елках! Фуф-ты, фуф-ты, фуф-ты, фу, я Никуше помогу!' }, { id: 7, name: 'Медуза', emoji: '🪼', color: 'bg-blue-100', poem: 'В море синем я качаюсь, и Никуше улыбаюсь! Танцую на волне, как в волшебном сне!' }, { id: 8, name: 'Дельфин', emoji: '🐬', color: 'bg-indigo-100', poem: 'По волнам, по волнам, я плыву к своим друзьям! Я дельфинчик озорной, поиграй-ка ты со мной!' }, { id: 9, name: 'Крабик', emoji: '🦀', color: 'bg-red-100', poem: 'Краб-краб, чики-тап, не боюсь я никого! Громко клешнями стучу, я Никушу рассмешу!' }, { id: 10, name: 'Змейка', emoji: '🐍', color: 'bg-emerald-100', poem: 'Я змейка-красотка, быстрая походка! С-с-с, я песенку пою, Никушу радовать хочу!' }, { id: 11, name: 'Слоник', emoji: '🐘', color: 'bg-blue-200', poem: 'Топ-топ, топает слон, шлет Никуше он поклон! Уши как два лопуха, жизнь со слоником легка!' }, { id: 12, name: 'Жираф', emoji: '🦒', color: 'bg-amber-100', poem: 'У жирафа пятна-пятна, быть жирафом так приятно! Шею длинную тяну, до облака я достаю!' }, { id: 13, name: 'Птичка', emoji: '🐦', color: 'bg-sky-100', poem: 'Чик-чирик, ля-ля-ля, поет птичка для тебя! Крылышками машет, над Никушей пляшет!' }, { id: 14, name: 'Курочка', emoji: '🐔', color: 'bg-orange-50', poem: 'Ко-ко-ко, ко-ко-ко, я гуляю далеко! Зернышки ищу я, Никушу угощу я!' }, { id: 15, name: 'Рыбка', emoji: '🐠', color: 'bg-cyan-100', poem: 'Рыбка-золотая, в озере играет! Хвостиком виляет, желанье исполняет!' }, { id: 16, name: 'Бегемот', emoji: '🦛', color: 'bg-teal-100', poem: 'Бегемот, бегемот, у него большой живот! Громко-громко он поет, Никушу в гости он зовет!' }, { id: 17, name: 'Улитка', emoji: '🐌', color: 'bg-orange-200', poem: 'Дом везу я на спине, очень весело же мне! Я улитка-крошка, посмотри в окошко!' }, { id: 18, name: 'Пчелка', emoji: '🐝', color: 'bg-yellow-200', poem: 'Жу-жу-жу, жу-жу-жу, я над садиком кружу! Мед Никуше принесу, сладко-сладко угощу!' }, ]; const App = () => { const [isVisible, setIsVisible] = useState(false); const [selectedAnimal, setSelectedAnimal] = useState(null); const [prevAnimal, setPrevAnimal] = useState(null); const [isTransitioning, setIsTransitioning] = useState(false); const [isPlayingAudio, setIsPlayingAudio] = useState(false); const [audioError, setAudioError] = useState(false); const audioRef = useRef(null); useEffect(() => { setIsVisible(true); audioRef.current = new Audio(); return () => { window.speechSynthesis.cancel(); if (audioRef.current) { audioRef.current.pause(); audioRef.current = null; } }; }, []); const stopAllMedia = () => { window.speechSynthesis.cancel(); setAudioError(false); if (audioRef.current) { audioRef.current.pause(); audioRef.current.currentTime = 0; setIsPlayingAudio(false); } }; const speak = (text) => { stopAllMedia(); const processedText = text.replace('шевелит', 'шевелИт'); const content = new SpeechSynthesisUtterance(processedText); content.lang = 'ru-RU'; content.pitch = 1.4; content.rate = 1.1; window.speechSynthesis.speak(content); }; const playSong = async (fileName, animal) => { stopAllMedia(); setAudioError(false); if (!audioRef.current) return; try { audioRef.current.src = fileName; audioRef.current.load(); audioRef.current.onended = () => setIsPlayingAudio(false); audioRef.current.onerror = () => { setAudioError(true); setIsPlayingAudio(false); if (animal) speak(animal.poem); }; const playPromise = audioRef.current.play(); if (playPromise !== undefined) { await playPromise; setIsPlayingAudio(true); } } catch (err) { setAudioError(true); setIsPlayingAudio(false); if (animal) speak(animal.poem); } }; const handleAnimalClick = (animal) => { if (selectedAnimal?.id === animal.id) return; setPrevAnimal(selectedAnimal); setSelectedAnimal(animal); setIsTransitioning(true); // Сбрасываем флаг перехода после завершения анимации setTimeout(() => setIsTransitioning(false), 500); if (animal.audioFileName) { playSong(animal.audioFileName, animal); } else { speak(animal.poem); } }; const handleClose = () => { setSelectedAnimal(null); setPrevAnimal(null); stopAllMedia(); }; return (
{prevAnimal.poem}
{selectedAnimal.poem}
{isPlayingAudio && (