import React, { useState, useEffect, useRef } from 'react'; import { BookText, Languages, Settings, ChevronRight, Keyboard as KeyboardIcon, Save, HelpCircle, Lock, Layout, ArrowLeft, Loader2, Send, BookOpen, PenTool, Lightbulb, ListChecks, Key, Type, Volume2, MessageSquareQuote, Printer, FileText, ClipboardList, Wand2, Sparkles, MessageCircle, RefreshCw, CheckSquare } from 'lucide-react'; const apiKey = ""; const App = () => { const [grade, setGrade] = useState(null); const [subject, setSubject] = useState(null); const [level, setLevel] = useState(null); const [stage, setStage] = useState('menu'); const [score, setScore] = useState(0); const [activeStep, setActiveStep] = useState(0); const [inputText, setInputText] = useState(''); const [keywords, setKeywords] = useState(''); const [aiLoading, setAiLoading] = useState(false); const [aiFeedback, setAiFeedback] = useState(''); const [aiExplanation, setAiExplanation] = useState(''); const [litTopic, setLitTopic] = useState(''); const [litPlan, setLitPlan] = useState([]); const [retellingType, setRetellingType] = useState(''); const [worksheetData, setWorksheetData] = useState(null); const [teacherTopicInput, setTeacherTopicInput] = useState(''); const [generationType, setGenerationType] = useState('worksheet'); // 'worksheet' or 'test' const [chatHistory, setChatHistory] = useState([]); const [chatInput, setChatInput] = useState(''); const [isUppercase, setIsUppercase] = useState(false); const [keyMode, setKeyMode] = useState('abc'); const [data, setData] = useState({ 5: { language: { easy: { questions: [ { q: "Коя дума е лично местоимение?", a: ["Той", "Бързо", "Къща"], c: 0, hint: "Личното местоимение замества име на лице." }, { q: "Открийте подлога в изречението: 'Детето чете'.", a: ["Детето", "Чете"], c: 0, hint: "Подлогът отговаря на въпроса 'Кой?'." }, { q: "В кое време е глаголът 'играх'?", a: ["Сегашно", "Минало свършено", "Бъдеще"], c: 1, hint: "Действието е приключило в миналото." } ] }, medium: { questions: [ { q: "Коя част на изречението е думата 'силен' в 'Той е силен'?", a: ["Сказуемо", "Определение"], c: 1, hint: "Тази част пояснява признак на предмета." }, { q: "Кое е правилното изписване?", a: ["Вървяха", "Вървяхме"], c: 1, hint: "Помисли за окончанието за първо лице, множествено число." }, { q: "Кое местоимение е притежателно?", a: ["Мой", "Себе си", "Кой"], c: 0, hint: "Това местоимение показва чий е предметът." } ] }, hard: { questions: [ { q: "Направете синтактичен разбор: 'Мария купи цветя'. Какво е 'цветя'?", a: ["Подлог", "Допълнение"], c: 1 }, { q: "Глаголът 'щеше да види' е в:", a: ["Бъдеще време", "Бъдеще време в миналото"], c: 1 }, { q: "Кое е сложно изречение?", a: ["Слънцето грее и птиците пеят.", "Слънцето грее силно."], c: 0 } ] } }, literature: { types: ["Подробен преразказ", "Съкратен преразказ", "От името на героя", "От името на автора", "От името на наблюдател", "Есе"], examples: { guide: "Първата стъпка към добрия текст е откриването на важните опорни точки и думи." } } }, 6: { language: { easy: { questions: [ { q: "Коя дума е деепричастие?", a: ["Четейки", "Четен", "Четящ"], c: 0, hint: "Деепричастията често завършват на -йки." }, { q: "Кое местоимение е относително?", a: ["Който", "Никой", "Някой"], c: 0, hint: "Служи за връзка между изреченията." } ]}, medium: { questions: [ { q: "Как се нарича глаголното време 'бях чел'?", a: ["Минало предварително", "Минало несвършено"], c: 0 }, { q: "Степенуване на наречия: кое е вярно?", a: ["По-бързо", "По бързо"], c: 0 } ]}, hard: { questions: [ { q: "Определете залога: 'Книгата беше прочетена'.", a: ["Деятелен", "Страдателен"], c: 1 } ]} }, literature: { types: ["Подробен преразказ", "Трансформиращ преразказ", "Съчинение описание", "Есе"], examples: { guide: "Обърнете специално внимание на детайлите в описанието на обстановката." } } }, 7: { language: { easy: { questions: [ { q: "Коя е главната част в сложното съставно изречение?", a: ["Тази, която може да стои самостоятелно.", "Тази, която започва със съюз."], c: 0 }, { q: "Къде се поставя запетая?", a: ["Пред 'че'", "Пред 'и' винаги"], c: 0 } ]}, medium: { questions: [ { q: "Вид на причастието 'видян':", a: ["Минало страдателно", "Минало свършено деятелно"], c: 0 }, { q: "Коя е вметната част?", a: ["Разбира се", "Бързо"], c: 0 } ]}, hard: { questions: [ { q: "Определете наклонението: 'Би ли дошъл?'", a: ["Условно", "Повелително"], c: 0 } ]} }, literature: { types: ["Литературно-интерпретативно съчинение", "Есе", "Трансформиращ преразказ", "Теза"], examples: { guide: "Аргументирайте се ясно, като използвате примери от текста." } } } }); // Print function const handlePrint = () => { window.print(); }; const callGemini = async (prompt, systemInstruction = "", isJson = false) => { let retries = 0; const maxRetries = 5; while (retries <= maxRetries) { try { const payload = { contents: [{ parts: [{ text: prompt }] }], systemInstruction: systemInstruction ? { parts: [{ text: systemInstruction }] } : undefined, }; if (isJson) payload.generationConfig = { responseMimeType: "application/json" }; const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); if (!response.ok) throw new Error('API failed'); const result = await response.json(); return result.candidates?.[0]?.content?.parts?.[0]?.text; } catch (error) { if (retries === maxRetries) throw error; const delay = Math.pow(2, retries) * 1000; await new Promise(r => setTimeout(r, delay)); retries++; } } }; const speakText = async (text) => { if (!text) return; try { const payload = { contents: [{ parts: [{ text: `Прочети на български език със спокоен и професионален учителски глас: ${text}` }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Aoede" } } } }, model: "gemini-2.5-flash-preview-tts" }; const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=${apiKey}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); const pcmData = result.candidates[0].content.parts[0].inlineData.data; const audioBlob = new Blob([Uint8Array.from(atob(pcmData), c => c.charCodeAt(0))], { type: 'audio/wav' }); const audioUrl = URL.createObjectURL(audioBlob); const audio = new Audio(audioUrl); audio.play(); } catch (error) { console.error(error); } }; const handleGenerateMaterial = async () => { if (!teacherTopicInput.trim() || !grade) return; setAiLoading(true); const isTest = generationType === 'test'; const systemPrompt = `Ти си учител експерт по български език и литература. Генерирай професионален ${isTest ? 'КОНТРОЛЕН ТЕСТ' : 'РАБОТЕН ЛИСТ'} за ${grade} клас на тема: ${teacherTopicInput}. Структура: 1. ${isTest ? 'Част А (Затворени въпроси)' : 'Ниво Начално'}: 3 въпроса с по 3 отговора ${isTest ? '' : '+ детайлни методически насоки'}. 2. ${isTest ? 'Част Б (Приложни задачи)' : 'Ниво Напредък'}: 3 въпроса с по 3 отговора ${isTest ? '' : '+ кратки опорни насоки'}. 3. ${isTest ? 'Част В (Творческа задача)' : 'Ниво Предизвикателство'}: 3 въпроса за самостоятелна работа. 4. Критерии за оценяване (списък от 4-5 точки). 5. Скала за оценка от Слаб (2) до Отличен (6). Върни JSON: { title: "Заглавие", easy: [{q, a:[], c, hint}], medium: [{q, a:[], c, hint}], hard: [{q, a:[], c}], criteria: [], scale: "" }`; try { const response = await callGemini(`Генерирай ${generationType}.`, systemPrompt, true); const res = JSON.parse(response); setWorksheetData(res); setStage('worksheetView'); } catch (e) { console.error(e); } finally { setAiLoading(false); } }; const handleGenerateLitStep = async () => { setAiLoading(true); const systemPrompt = `Ти си учител по Литература за ${grade} клас. Генерирай тема за ${retellingType} и извлечи 5 ключови думи от нея. Създай и план от 3 точки. Върни JSON: { topic: "Заглавие", keywords: "дума1, думи...", plan: ["1", "2", "3"] }`; try { const response = await callGemini("Генерирай тема.", systemPrompt, true); const res = JSON.parse(response); setLitTopic(res.topic); setKeywords(res.keywords); setLitPlan(res.plan); setStage('litPreparation'); } catch (e) { console.error(e); } finally { setAiLoading(false); } }; const handleKeyPress = (key) => { if (key === 'Delete') setInputText(prev => prev.slice(0, -1)); else if (key === 'Space') setInputText(prev => prev + ' '); else if (key === 'Shift') setIsUppercase(!isUppercase); else if (key === '123' || key === 'abc') setKeyMode(key === '123' ? '123' : 'abc'); else { let char = key; if (keyMode === 'abc') char = isUppercase ? key.toUpperCase() : key.toLowerCase(); setInputText(prev => prev + char); } }; const renderVirtualKeyboard = () => { const layoutAbc = [ ['Я', 'В', 'Е', 'Р', 'Т', 'Ъ', 'У', 'И', 'О', 'П', 'Ш', 'Щ'], ['А', 'С', 'Д', 'Ф', 'Г', 'Х', 'Й', 'К', 'Л', 'Ч', 'Ю'], ['З', 'Ь', 'Ц', 'Ж', 'Б', 'Н', 'М', 'Shift', 'Delete'], ['123', 'Space', '.', ','] ]; const layout123 = [ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], ['!', '?', '.', ',', '-', '(', ')', '"', ':', ';'], ['abc', 'Space', 'Delete'] ]; const currentLayout = keyMode === 'abc' ? layoutAbc : layout123; return (
{currentLayout.map((row, i) => (
{row.map(key => { const isSpecial = ['Shift', 'Delete', 'Space', '123', 'abc'].includes(key); let label = key; if (keyMode === 'abc' && !isSpecial) label = isUppercase ? key.toUpperCase() : key.toLowerCase(); return ( ); })}
))}
); }; const renderMenu = () => (

Дигитален Учител

Индивидуален Подход и Развитие

{[5, 6, 7].map(g => ( ))}
); const renderTeacherPanel = () => (

Методически Център

Генериране на материали