import 'package:flutter/material.dart'; import 'package:mymuseum_visitapp/Components/VoiceModeSheet.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Services/meta_glasses_service.dart'; import 'package:mymuseum_visitapp/Services/voice_controller.dart'; import 'package:provider/provider.dart'; /// Icône circulaire positionnée en haut à droite de l'écran d'accueil. /// /// Visible si : /// - Les lunettes sont connectées (quel que soit le mode) /// - OU un mode vocal est actif (voiceOnly ou glasses) /// /// Tap → ouvre VoiceModeSheet. class GlassesStatusWidget extends StatelessWidget { final VisitAppContext visitAppContext; const GlassesStatusWidget({super.key, required this.visitAppContext}); @override Widget build(BuildContext context) { return Consumer( builder: (context, controller, _) { return ValueListenableBuilder( valueListenable: MetaGlassesService.instance.state, builder: (context, glassesState, _) { final isConnected = glassesState == GlassesState.connected || glassesState == GlassesState.streaming; final modeActive = controller.mode != VoiceMode.none; final featureAvailable = controller.isFeatureAvailable(visitAppContext); if (!featureAvailable && !isConnected && !modeActive) return const SizedBox.shrink(); final Color iconColor = switch ((isConnected, controller.mode)) { (true, VoiceMode.glasses) => Colors.greenAccent, (_, VoiceMode.voiceOnly) => Colors.lightBlueAccent, (true, _) => Colors.white70, _ => Colors.white38, }; return GestureDetector( onTap: () => VoiceModeSheet.show(context, visitAppContext: visitAppContext), child: Container( width: 50, height: 50, decoration: BoxDecoration( color: Colors.black.withValues(alpha: 0.3), shape: BoxShape.circle, ), child: Stack( alignment: Alignment.center, children: [ Icon( controller.mode == VoiceMode.voiceOnly ? Icons.mic : Icons.remove_red_eye_outlined, color: iconColor, size: 22, ), // Point vert en bas à droite si mode actif if (modeActive) Positioned( bottom: 8, right: 8, child: Container( width: 8, height: 8, decoration: BoxDecoration( color: controller.mode == VoiceMode.glasses ? Colors.greenAccent : Colors.lightBlueAccent, shape: BoxShape.circle, border: Border.all(color: Colors.black54, width: 1), ), ), ), ], ), ), ); }, ); }, ); } }