import React, { useState, useEffect } from 'react'; import { BookOpen, Brain, List, ChevronRight, ChevronLeft, RotateCcw, CheckCircle2, XCircle, GraduationCap, Volume2, Loader2, ImageIcon, Keyboard, ArrowRight, User } from 'lucide-react'; const WORD_DATA = [ { id: 1, hebrew: "ילד", arabic: "وَلَد", phonetic: "וַלַד", imgTag: "boy,child,photography" }, { id: 2, hebrew: "מתנה", arabic: "هَدِيَّة", phonetic: "הַדִיָּה", imgTag: "gift,present,box" }, { id: 3, hebrew: "שעון", arabic: "סָאעַה", phonetic: "סָאעַה", imgTag: "clock,wall,watch", arabicText: "سَاعَة" }, { id: 4, hebrew: "נסיך", arabic: "أَمِير", phonetic: "אַמִיר", imgTag: "prince,royal,photography" }, { id: 5, hebrew: "מורה (זכר)", arabic: "مُעَلِّמ", phonetic: "מֻעַלֶּם", imgTag: "teacher,classroom,man" }, { id: 6, hebrew: "תפוח", arabic: "תֻּפַּאח", phonetic: "תֻפַּאח", imgTag: "apple,red,fruit" }, { id: 7, hebrew: "אמא", arabic: "أُمّ", phonetic: "אֻם", imgTag: "mother,portrait,woman" }, { id: 8, hebrew: "אבא", arabic: "أَب", phonetic: "אַב", imgTag: "father,portrait,man" }, { id: 9, hebrew: "סבא", arabic: "جَدّ", phonetic: "גַ'ד", imgTag: "grandfather,portrait,oldman" } ]; const App = () => { const [view, setView] = useState('home'); const [currentIndex, setCurrentIndex] = useState(0); const [isRevealed, setIsRevealed] = useState(false); const [quizScore, setQuizScore] = useState(0); const [quizStep, setQuizStep] = useState(0); const [quizQuestions, setQuizQuestions] = useState([]); const [quizFinished, setQuizFinished] = useState(false); const [selectedAnswer, setSelectedAnswer] = useState(null); const [playingAudio, setPlayingAudio] = useState(null); const [tutorImage, setTutorImage] = useState(null); const [loadingTutor, setLoadingTutor] = useState(true); // יצירת דמות המורה הריאליסטית ביותר באמצעות Imagen 4.0 useEffect(() => { const generateTutor = async () => { const apiKey = ""; const url = `https://generativelanguage.googleapis.com/v1beta/models/imagen-4.0-generate-001:predict?key=${apiKey}`; const prompt = "A photorealistic cinematic 8k portrait of a friendly young man with short dark brown hair and fair skin. Waist-up shot, looking directly at the camera. He is wearing a high-quality navy blue hoodie. Professional lighting, warm smile, sharp focus on facial features. Background is a soft blurred modern classroom. Photorealistic masterpiece."; const payload = { instances: [{ prompt }], parameters: { sampleCount: 1 } }; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); if (result.predictions?.[0]?.bytesBase64Encoded) { setTutorImage(`data:image/png;base64,${result.predictions[0].bytesBase64Encoded}`); } } catch (err) { console.error("Failed to generate realistic tutor", err); } finally { setLoadingTutor(false); } }; generateTutor(); }, []); // האזנה למקש הרווח useEffect(() => { const handleKeyDown = (e) => { if (e.code === 'Space') { if (view === 'cards') { e.preventDefault(); if (!isRevealed) setIsRevealed(true); else if (currentIndex < WORD_DATA.length - 1) { setCurrentIndex(prev => prev + 1); setIsRevealed(false); } } } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [view, isRevealed, currentIndex]); const pcmToWav = (pcmData, sampleRate) => { const buffer = new ArrayBuffer(44 + pcmData.length * 2); const view = new DataView(buffer); const writeString = (offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(0, 'RIFF'); view.setUint32(4, 32 + pcmData.length * 2, true); writeString(8, 'WAVE'); writeString(12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, 1, true); view.setUint32(24, sampleRate, true); view.setUint32(28, sampleRate * 2, true); view.setUint16(32, 2, true); view.setUint16(34, 16, true); writeString(36, 'data'); view.setUint32(40, pcmData.length * 2, true); for (let i = 0; i < pcmData.length; i++) view.setInt16(44 + i * 2, pcmData[i], true); return new Blob([buffer], { type: 'audio/wav' }); }; const playArabicWord = async (word) => { if (playingAudio) return; setPlayingAudio(word); const apiKey = ""; const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=${apiKey}`; const payload = { contents: [{ parts: [{ text: `Say clearly in Arabic: ${word}` }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } } }; try { const response = await fetch(url, { method: 'POST', body: JSON.stringify(payload) }); const result = await response.json(); const audioData = result.candidates?.[0]?.content?.parts?.[0]?.inlineData; if (audioData) { const binaryString = atob(audioData.data); const bytes = new Int16Array(binaryString.length / 2); for (let i = 0; i < binaryString.length; i += 2) bytes[i/2] = (binaryString.charCodeAt(i+1) << 8) | binaryString.charCodeAt(i); const audio = new Audio(URL.createObjectURL(pcmToWav(bytes, 24000))); audio.onended = () => setPlayingAudio(null); audio.play(); } else setPlayingAudio(null); } catch { setPlayingAudio(null); } }; const Home = () => (
מכין את המורה לשיעור...
מוכן להתחיל לתרגל?
{tutorText}