br0tcabeln/static/script.js
2024-08-17 18:57:14 +02:00

152 lines
5.1 KiB
JavaScript

const canvas = document.getElementById('drawingCanvas');
const ctx = canvas.getContext('2d');
const textElement = document.getElementById('text');
const wordDisplay = document.getElementById('wordDisplay');
const textInput = document.getElementById('textInput');
const submitAnswer = document.getElementById('submitAnswer');
const toggleInput = document.getElementById('toggleInput');
const clearCanvas = document.getElementById('clearCanvas');
const previewDrawing = document.getElementById('previewDrawing');
const recognizedText = document.getElementById('recognizedText');
let currentWord = null;
let currentInputMode = 'text'; // 'text' or 'drawing'
let isDrawing = false;
// Initialize input mode
function initializeInputMode() {
textInput.style.display = 'block';
canvas.style.display = 'none';
clearCanvas.style.display = 'none';
previewDrawing.style.display = 'none';
toggleInput.textContent = 'Zu Zeichnen wechseln';
recognizedText.textContent = '';
}
// Load a new word
function loadWord() {
fetch('/get_random_vocab')
.then(response => response.json())
.then(data => {
if (data.error) {
wordDisplay.textContent = 'Keine Vokabeln gefunden.';
} else {
currentWord = data;
const isEnglish = Math.random() < 0.5;
wordDisplay.textContent = isEnglish ? `English: ${currentWord.english}` : `Deutsch: ${currentWord.german}`;
textElement.textContent = '';
textInput.value = '';
recognizedText.textContent = '';
if (currentInputMode === 'drawing') {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
}
})
.catch(error => console.error('Fehler beim Laden der Vokabel:', error));
}
// Switch between input modes
toggleInput.addEventListener('click', () => {
if (currentInputMode === 'text') {
textInput.style.display = 'none';
canvas.style.display = 'block';
clearCanvas.style.display = 'inline-block';
previewDrawing.style.display = 'inline-block';
toggleInput.textContent = 'Zu Texteingabe wechseln';
currentInputMode = 'drawing';
} else {
textInput.style.display = 'block';
canvas.style.display = 'none';
clearCanvas.style.display = 'none';
previewDrawing.style.display = 'none';
toggleInput.textContent = 'Zu Zeichnen wechseln';
currentInputMode = 'text';
}
});
// Clear the canvas
clearCanvas.addEventListener('click', () => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
recognizedText.textContent = ''; // Clear the recognized text as well
});
// Drawing functionality
canvas.addEventListener('mousedown', () => {
isDrawing = true;
});
canvas.addEventListener('mouseup', () => {
isDrawing = false;
ctx.beginPath();
});
canvas.addEventListener('mousemove', draw);
function draw(event) {
if (!isDrawing) return;
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.strokeStyle = 'black';
ctx.lineTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
}
// Preview the drawing recognition
previewDrawing.addEventListener('click', () => {
const dataURL = canvas.toDataURL('image/png');
fetch(dataURL)
.then(res => res.blob())
.then(blob => {
Tesseract.recognize(
blob,
'eng',
{ logger: info => console.log(info) }
).then(({ data: { text } }) => {
recognizedText.textContent = `Erkannter Text: ${text.trim()}`;
});
})
.catch(error => {
console.error('Fehler beim Erkennen des Textes:', error);
});
});
// Submit answer
submitAnswer.addEventListener('click', () => {
let answer = '';
if (currentInputMode === 'text') {
answer = textInput.value.trim();
} else {
answer = recognizedText.textContent.replace('Erkannter Text:', '').trim();
}
checkAnswer(answer);
});
// Check if the answer is correct
function checkAnswer(answer) {
const correctAnswer = (wordDisplay.textContent.startsWith('English:') ? currentWord.german : currentWord.english).trim().toLowerCase();
if (answer.toLowerCase() === correctAnswer) {
textElement.textContent = 'Richtig!';
textElement.style.color = 'green';
// Update the vocabulary level
fetch(`/update_vocab_level/${currentWord.id}`, { method: 'POST' })
.then(() => {
setTimeout(loadWord, 2000); // Show the result for 2 seconds before loading the next word
});
} else {
textElement.textContent = `Falsch! Die richtige Antwort ist: ${correctAnswer}`;
textElement.style.color = 'red';
setTimeout(loadWord, 3000); // Show the result for 3 seconds before loading the next word
}
}
// Initialize the input mode and load the first word
initializeInputMode();
loadWord();