// === INTERFACE CRÉATEUR DE CONTENU === class ContentCreator { constructor() { this.factory = new ContentFactory(); this.previewContainer = null; this.currentContent = null; } init() { this.createInterface(); this.setupEventListeners(); this.loadExamples(); } createInterface() { // Créer l'interface dans le container principal const existingInterface = document.getElementById('content-creator'); if (existingInterface) { existingInterface.remove(); } const interface = document.createElement('div'); interface.id = 'content-creator'; interface.className = 'content-creator-interface'; interface.innerHTML = `

🏭 Créateur de Contenu Universel

Transformez n'importe quel contenu en exercices interactifs

Collez votre texte ici

Liste de Vocabulaire

=

Créateur de Dialogue

Créateur de Séquence

1

💡 Exemples Rapides

`; // Injecter dans la page const container = document.getElementById('game-container') || document.body; container.appendChild(interface); this.previewContainer = interface.querySelector('#content-preview .preview-content'); } setupEventListeners() { // Gestion des onglets document.querySelectorAll('.tab-btn').forEach(btn => { btn.addEventListener('click', () => { this.switchTab(btn.dataset.tab); }); }); // Bouton générer document.getElementById('generate-btn').addEventListener('click', () => { this.generateContent(); }); // Bouton aperçu document.getElementById('preview-btn').addEventListener('click', () => { this.previewContent(); }); // Bouton test document.getElementById('test-game-btn').addEventListener('click', () => { this.testInGame(); }); // Exemples document.querySelectorAll('.example-btn').forEach(btn => { btn.addEventListener('click', () => { this.loadExample(btn.dataset.example); }); }); // Builders dynamiques this.setupVocabularyBuilder(); this.setupDialogueBuilder(); this.setupSequenceBuilder(); } switchTab(tabName) { // Désactiver tous les onglets et contenu document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active')); document.querySelectorAll('.tab-content').forEach(content => content.classList.remove('active')); // Activer le bon onglet document.querySelector(`[data-tab="${tabName}"]`).classList.add('active'); document.getElementById(`${tabName}-tab`).classList.add('active'); } setupVocabularyBuilder() { document.getElementById('add-vocab-entry').addEventListener('click', () => { this.addVocabularyEntry(); }); // Supprimer entries document.addEventListener('click', (e) => { if (e.target.classList.contains('remove-entry')) { e.target.parentElement.remove(); } }); } addVocabularyEntry() { const builder = document.querySelector('.vocab-builder'); const entry = document.createElement('div'); entry.className = 'vocab-entry'; entry.innerHTML = ` = `; builder.appendChild(entry); } setupDialogueBuilder() { document.getElementById('add-dialogue-line').addEventListener('click', () => { this.addDialogueLine(); }); document.addEventListener('click', (e) => { if (e.target.classList.contains('remove-line')) { e.target.parentElement.remove(); } }); } addDialogueLine() { const builder = document.querySelector('.dialogue-builder'); const line = document.createElement('div'); line.className = 'dialogue-line'; line.innerHTML = ` `; builder.appendChild(line); } setupSequenceBuilder() { document.getElementById('add-sequence-step').addEventListener('click', () => { this.addSequenceStep(); }); document.addEventListener('click', (e) => { if (e.target.classList.contains('remove-step')) { e.target.parentElement.remove(); this.updateStepNumbers(); } }); } addSequenceStep() { const builder = document.querySelector('.sequence-builder'); const stepCount = builder.children.length + 1; const step = document.createElement('div'); step.className = 'sequence-step'; step.innerHTML = ` ${stepCount} `; builder.appendChild(step); } updateStepNumbers() { document.querySelectorAll('.step-number').forEach((num, index) => { num.textContent = index + 1; }); } async generateContent() { try { const input = this.collectInput(); const options = this.collectOptions(); console.log('🏭 Génération de contenu...', { input, options }); const content = await this.factory.createContent(input, options); this.currentContent = content; this.showSuccess('Contenu généré avec succès !'); this.displayPreview(content); document.getElementById('test-game-btn').style.display = 'inline-block'; } catch (error) { console.error('Erreur génération:', error); this.showError('Erreur lors de la génération: ' + error.message); } } collectInput() { const activeTab = document.querySelector('.tab-content.active').id; switch (activeTab) { case 'text-tab': return document.getElementById('text-input').value; case 'vocabulary-tab': return this.collectVocabularyData(); case 'dialogue-tab': return this.collectDialogueData(); case 'sequence-tab': return this.collectSequenceData(); default: throw new Error('Type de contenu non supporté'); } } collectVocabularyData() { const entries = document.querySelectorAll('.vocab-entry'); const vocabulary = []; entries.forEach(entry => { const english = entry.querySelector('.english-input').value; const french = entry.querySelector('.french-input').value; const category = entry.querySelector('.category-input').value || 'general'; if (english && french) { vocabulary.push({ english, french, category }); } }); return { vocabulary }; } collectDialogueData() { const scenario = document.getElementById('dialogue-scenario').value || 'conversation'; const lines = document.querySelectorAll('.dialogue-line'); const conversation = []; lines.forEach(line => { const speaker = line.querySelector('.speaker-input').value; const text = line.querySelector('.line-input').value; if (speaker && text) { conversation.push({ speaker, english: text }); } }); return { dialogue: { scenario, conversation } }; } collectSequenceData() { const title = document.getElementById('sequence-title').value || 'Sequence'; const steps = document.querySelectorAll('.sequence-step'); const sequence = []; steps.forEach((step, index) => { const english = step.querySelector('.step-input').value; const time = step.querySelector('.time-input').value; if (english) { sequence.push({ order: index + 1, english, time: time || null }); } }); return { sequence: { title, steps: sequence } }; } collectOptions() { return { name: document.getElementById('module-name').value || 'Contenu Généré', difficulty: document.getElementById('difficulty-select').value === 'auto' ? null : document.getElementById('difficulty-select').value, contentType: document.getElementById('content-type-select').value === 'auto' ? null : document.getElementById('content-type-select').value }; } async previewContent() { try { const input = this.collectInput(); const options = this.collectOptions(); // Génération rapide pour aperçu const content = await this.factory.createContent(input, options); this.displayPreview(content); document.getElementById('content-preview').style.display = 'block'; } catch (error) { this.showError('Erreur lors de l\'aperçu: ' + error.message); } } displayPreview(content) { if (!this.previewContainer) return; this.previewContainer.innerHTML = `
${content.name}

${content.description}

📊 ${content.contentItems.length} exercices 🎯 Difficulté: ${content.difficulty} 🏷️ Types: ${content.metadata.contentTypes.join(', ')}
${content.contentItems.slice(0, 3).map(item => `
${item.type} ${item.content.english} = ${item.content.french} ${item.interaction.type}
`).join('')} ${content.contentItems.length > 3 ? `
... et ${content.contentItems.length - 3} autres
` : ''}
`; document.getElementById('content-preview').style.display = 'block'; } async testInGame() { if (!this.currentContent) { this.showError('Aucun contenu généré à tester'); return; } try { // Sauvegarder temporairement le contenu const contentId = 'generated_test'; window.ContentModules = window.ContentModules || {}; window.ContentModules.GeneratedTest = this.currentContent; // Naviguer vers un jeu pour tester this.showSuccess('Contenu prêt ! Redirection vers le jeu...'); setTimeout(() => { // Fermer l'interface document.getElementById('content-creator').remove(); // Lancer le jeu avec le contenu généré AppNavigation.navigateTo('play', 'whack-a-mole', 'generated-test'); }, 1500); } catch (error) { this.showError('Erreur lors du test: ' + error.message); } } loadExamples() { // Les exemples sont gérés par les boutons } loadExample(type) { switch (type) { case 'vocabulary': this.switchTab('vocabulary'); setTimeout(() => { // Effacer contenu existant document.querySelector('.vocab-builder').innerHTML = ''; // Ajouter exemples const animals = [ { english: 'cat', french: 'chat', category: 'animals' }, { english: 'dog', french: 'chien', category: 'animals' }, { english: 'bird', french: 'oiseau', category: 'animals' }, { english: 'fish', french: 'poisson', category: 'animals' } ]; animals.forEach(animal => { this.addVocabularyEntry(); const entries = document.querySelectorAll('.vocab-entry'); const lastEntry = entries[entries.length - 1]; lastEntry.querySelector('.english-input').value = animal.english; lastEntry.querySelector('.french-input').value = animal.french; lastEntry.querySelector('.category-input').value = animal.category; }); document.getElementById('module-name').value = 'Animaux Domestiques'; }, 100); break; case 'dialogue': this.switchTab('dialogue'); setTimeout(() => { document.getElementById('dialogue-scenario').value = 'Au Restaurant'; document.querySelector('.dialogue-builder').innerHTML = ''; const dialogueLines = [ { speaker: 'Serveur', text: 'What would you like to order?' }, { speaker: 'Client', text: 'I would like a pizza, please.' }, { speaker: 'Serveur', text: 'What size?' }, { speaker: 'Client', text: 'Large, please.' } ]; dialogueLines.forEach(line => { this.addDialogueLine(); const lines = document.querySelectorAll('.dialogue-line'); const lastLine = lines[lines.length - 1]; lastLine.querySelector('.speaker-input').value = line.speaker; lastLine.querySelector('.line-input').value = line.text; }); document.getElementById('module-name').value = 'Dialogue Restaurant'; }, 100); break; case 'sequence': this.switchTab('sequence'); setTimeout(() => { document.getElementById('sequence-title').value = 'Morning Routine'; document.querySelector('.sequence-builder').innerHTML = ''; const steps = [ { text: 'Wake up', time: '07:00' }, { text: 'Brush teeth', time: '07:15' }, { text: 'Get dressed', time: '07:30' }, { text: 'Eat breakfast', time: '07:45' }, { text: 'Go to school', time: '08:00' } ]; steps.forEach(step => { this.addSequenceStep(); const stepElements = document.querySelectorAll('.sequence-step'); const lastStep = stepElements[stepElements.length - 1]; lastStep.querySelector('.step-input').value = step.text; lastStep.querySelector('.time-input').value = step.time; }); document.getElementById('module-name').value = 'Routine du Matin'; }, 100); break; } } showSuccess(message) { Utils.showToast(message, 'success'); } showError(message) { Utils.showToast(message, 'error'); } } // CSS pour l'interface const contentCreatorStyles = ` `; // Ajouter les styles document.head.insertAdjacentHTML('beforeend', contentCreatorStyles); // Export global window.ContentCreator = ContentCreator;