import React, { useState, useEffect } from 'react';
import { CheckCircle, AlertCircle, RefreshCw, Triangle, Award } from 'lucide-react';
const App = () => {
// State for Drag and Drop Task
const [dragState, setDragState] = useState({
a: null,
b: null,
c: null,
});
const [dragFeedback, setDragFeedback] = useState(null);
// State for Formula Task
const [selectedFormula, setSelectedFormula] = useState(null);
const [formulaFeedback, setFormulaFeedback] = useState(null);
// State for Calculation Tasks
const [calcInputs, setCalcInputs] = useState({ task1: '', task2: '', task3: '' });
const [calcResults, setCalcResults] = useState({ task1: null, task2: null, task3: null });
// State for Final Score
const [totalScore, setTotalScore] = useState(0);
// Constants
const labels = [
{ id: 'катет1', text: 'Катет', color: 'bg-blue-500' },
{ id: 'катет2', text: 'Катет', color: 'bg-green-500' },
{ id: 'гіпотенуза', text: 'Гіпотенуза', color: 'bg-red-500' },
];
// Logic: Drag and Drop
const handleDrop = (position, labelId) => {
setDragState(prev => ({ ...prev, [position]: labelId }));
};
const checkDragTask = () => {
const isCorrect =
(dragState.a?.startsWith('катет') && dragState.b?.startsWith('катет') && dragState.c === 'гіпотенуза') ||
(dragState.b?.startsWith('катет') && dragState.a?.startsWith('катет') && dragState.c === 'гіпотенуза');
setDragFeedback(isCorrect ? 'correct' : 'wrong');
};
// Logic: Formula
const checkFormula = (choice) => {
setSelectedFormula(choice);
setFormulaFeedback(choice === 'a2b2c2' ? 'correct' : 'wrong');
};
// Logic: Calculations
const checkCalculations = () => {
const results = {
task1: parseInt(calcInputs.task1) === 5, // 3,4 -> 5
task2: parseInt(calcInputs.task2) === 8, // 10,6 -> 8
task3: parseInt(calcInputs.task3) === 13, // 5,12 -> 13
};
setCalcResults(results);
};
// Reset function
const resetAll = () => {
setDragState({ a: null, b: null, c: null });
setDragFeedback(null);
setSelectedFormula(null);
setFormulaFeedback(null);
setCalcInputs({ task1: '', task2: '', task3: '' });
setCalcResults({ task1: null, task2: null, task3: null });
};
return (
{/* Header */}
{/* Section 1: Theory */}
Як це працює?
Уяви, що на кожній стороні трикутника ми побудували квадрати. Площа найбільшого квадрата (на гіпотенузі ) дорівнює сумі площ двох менших квадратів (на катетах ).
{/* SVG Triangle Visual */}
{/* катет b */}
{/* катет a */}
{/* гіпотенуза c */}
a
b
c
{/* Section 2: Drag and Drop */}
1. Назви сторін
Перетягни назви (клікни спочатку на назву, потім на поле) на відповідні місця трикутника:
{labels.map(l => (
window.selectedLabel = l}
>
{l.text}
))}
{/* Visual Logic Slots */}
{/* Slot a (Катет) */}
window.selectedLabel && handleDrop('a', window.selectedLabel.id)}
className={`absolute left-[-20px] top-[40px] w-28 h-10 border-2 border-dashed rounded-lg flex items-center justify-center cursor-pointer transition-colors ${dragState.a ? 'bg-blue-100 border-blue-500 text-blue-700' : 'bg-white border-slate-300'}`}
>
{dragState.a ? 'Катет' : '???'}
{/* Slot b (Катет) */}
window.selectedLabel && handleDrop('b', window.selectedLabel.id)}
className={`absolute left-[50px] bottom-[-20px] w-28 h-10 border-2 border-dashed rounded-lg flex items-center justify-center cursor-pointer transition-colors ${dragState.b ? 'bg-green-100 border-green-500 text-green-700' : 'bg-white border-slate-300'}`}
>
{dragState.b ? 'Катет' : '???'}
{/* Slot c (Гіпотенуза) */}
window.selectedLabel && handleDrop('c', window.selectedLabel.id)}
className={`absolute right-[-40px] top-[50px] w-32 h-10 border-2 border-dashed rounded-lg flex items-center justify-center cursor-pointer transition-colors ${dragState.c ? 'bg-red-100 border-red-500 text-red-700' : 'bg-white border-slate-300'}`}
>
{dragState.c ? 'Гіпотенуза' : '???'}
Перевірити
{dragFeedback === 'correct' &&
Супер!
}
{dragFeedback === 'wrong' &&
}
{/* Section 3: Formula Selection */}
2. Обери правильну формулу
{[
{ id: 'a2b2c', label: 'a² + b² = c' },
{ id: 'a2b2c2', label: 'a² + b² = c²' },
{ id: 'abc2', label: 'a + b = c²' }
].map((f) => (
checkFormula(f.id)}
className={`p-4 text-xl font-mono border-2 rounded-xl transition ${
selectedFormula === f.id
? (f.id === 'a2b2c2' ? 'bg-green-100 border-green-500 text-green-700' : 'bg-red-100 border-red-500 text-red-700')
: 'bg-slate-50 border-slate-200 hover:border-indigo-300'
}`}
>
{f.label}
))}
{formulaFeedback === 'correct' && Так, це правильний математичний запис!
}
{/* Section 4: Calculation Practice */}
3. Обчислювальний тренажер
{/* Task 1 */}
Задача 1:
Знайди гіпотенузу, якщо катети дорівнюють 3 см та 4 см.
setCalcInputs({...calcInputs, task1: e.target.value})}
className={`w-24 p-2 border-2 rounded-lg outline-none transition ${calcResults.task1 === true ? 'border-green-500' : (calcResults.task1 === false ? 'border-red-500' : 'border-slate-300')}`}
placeholder="?"
/>
см
{/* Task 2 */}
Задача 2:
Гіпотенуза 10 см, один катет 6 см. Знайди інший катет.
setCalcInputs({...calcInputs, task2: e.target.value})}
className={`w-24 p-2 border-2 rounded-lg outline-none transition ${calcResults.task2 === true ? 'border-green-500' : (calcResults.task2 === false ? 'border-red-500' : 'border-slate-300')}`}
placeholder="?"
/>
см
{/* Task 3 */}
Задача 3:
Катети 5 та 12. Чому дорівнює гіпотенуза?
setCalcInputs({...calcInputs, task3: e.target.value})}
className={`w-24 p-2 border-2 rounded-lg outline-none transition ${calcResults.task3 === true ? 'border-green-500' : (calcResults.task3 === false ? 'border-red-500' : 'border-slate-300')}`}
placeholder="?"
/>
см
Перевірити розв'язки
{/* Section 5: Self-Check Summary */}
Самоперевірка
Завдання 1
{dragFeedback === 'correct' ? '✅ Виконано' : '❌ Не закінчено'}
Завдання 2
{formulaFeedback === 'correct' ? '✅ Правильно' : '❌ Помилка'}
Завдання 3
{Object.values(calcResults).filter(v => v === true).length} / 3 правильних
{Object.values(calcResults).every(v => v === true) && formulaFeedback === 'correct' && dragFeedback === 'correct' ? (
🏆 Вітаємо! Ти опанував основи теореми Піфагора!
) : (
Виконай всі завдання, щоб отримати сертифікат знавця!
)}
Почати спочатку
Робочий аркуш з геометрії • 8 клас • Тема: Прямокутний трикутник
);
};
export default App;
Немає коментарів:
Дописати коментар