feat: Mise à jour à la version 1.1.14 et refonte du support Audio/TTS pour le Web
- Mise à jour de la version de l'application à `1.1.14` dans `app_version.dart` et `version.json`. - Migration de `AudioFeedbackService` vers l'API Web native (`dart:js_interop`, `package:web`) pour corriger les problèmes d'autoplay et supprimer la dépendance `audioplayers`. - Réécriture de `TextToSpeechService` utilisant `window.speechSynthesis` en remplacement de `flutter_tts` pour une meilleure compatibilité Web (notamment sous Linux). - Suppression des dépendances obsolètes `audioplayers` et `flutter_tts` du `pubspec.yaml`. - Ajout d'une gestion de file d'attente (`_scanQueue`) dans `EventPreparationPage` pour traiter les scans de codes-barres de manière séquentielle. - Intégration d'un bouton de diagnostic (`AudioDiagnosticButton`) pour tester manuellement l'audio et la synthèse vocale. - Ajout d'un script de test JavaScript `test_audio_tts.js` pour faciliter le débogage dans la console du navigateur. - Ajout de directives de style et d'architecture Dart/Flutter dans `.github/agents/`.
This commit is contained in:
@@ -21,6 +21,7 @@ import 'package:em2rp/views/widgets/event_preparation/add_equipment_to_event_dia
|
||||
import 'package:em2rp/utils/debug_log.dart';
|
||||
import 'package:em2rp/views/widgets/equipment/missing_equipment_dialog.dart';
|
||||
import 'package:em2rp/utils/colors.dart';
|
||||
import 'package:em2rp/views/widgets/common/audio_diagnostic_button.dart';
|
||||
|
||||
/// Type d'étape de préparation
|
||||
enum PreparationStep {
|
||||
@@ -73,6 +74,10 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
final TextEditingController _manualCodeController = TextEditingController();
|
||||
final FocusNode _manualCodeFocusNode = FocusNode();
|
||||
|
||||
// 🆕 File d'attente pour traiter les scans séquentiellement
|
||||
final List<String> _scanQueue = [];
|
||||
bool _isProcessingQueue = false;
|
||||
|
||||
// Détermine l'étape actuelle selon le statut de l'événement
|
||||
PreparationStep get _currentStep {
|
||||
final prep = _currentEvent.preparationStatus ?? PreparationStatus.notStarted;
|
||||
@@ -119,6 +124,9 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
// Initialiser le service de synthèse vocale
|
||||
TextToSpeechService.initialize();
|
||||
|
||||
// Initialiser et débloquer l'audio (pour éviter les problèmes d'autoplay)
|
||||
AudioFeedbackService.unlockAudio();
|
||||
|
||||
// Vérification de sécurité et chargement après le premier frame
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_isCurrentStepCompleted()) {
|
||||
@@ -827,13 +835,33 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
Future<void> _handleManualCodeEntry(String code) async {
|
||||
if (code.trim().isEmpty) return;
|
||||
|
||||
await _handleScannedCode(code.trim());
|
||||
// Ajouter le code à la file d'attente
|
||||
_scanQueue.add(code.trim());
|
||||
|
||||
// Effacer le champ après traitement
|
||||
// Effacer le champ immédiatement pour permettre le prochain scan
|
||||
_manualCodeController.clear();
|
||||
|
||||
// Maintenir le focus sur le champ pour permettre une saisie continue
|
||||
_manualCodeFocusNode.requestFocus();
|
||||
|
||||
// Démarrer le traitement de la file si pas déjà en cours
|
||||
if (!_isProcessingQueue) {
|
||||
_processQueue();
|
||||
}
|
||||
}
|
||||
|
||||
/// Traite la file d'attente des scans un par un
|
||||
Future<void> _processQueue() async {
|
||||
if (_isProcessingQueue) return;
|
||||
|
||||
_isProcessingQueue = true;
|
||||
|
||||
while (_scanQueue.isNotEmpty) {
|
||||
final code = _scanQueue.removeAt(0);
|
||||
await _handleScannedCode(code);
|
||||
}
|
||||
|
||||
_isProcessingQueue = false;
|
||||
}
|
||||
|
||||
/// Obtenir les quantités actuelles selon l'étape
|
||||
@@ -1199,6 +1227,9 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
appBar: AppBar(
|
||||
title: Text(stepTitle),
|
||||
backgroundColor: AppColors.bleuFonce,
|
||||
actions: const [
|
||||
AudioDiagnosticButton(),
|
||||
],
|
||||
),
|
||||
body: Stack(
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user