import 'package:flutter/material.dart'; import 'package:mymuseum_visitapp/Components/GlassPill.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 : /// - La fonctionnalité est activée sur l'instance /// - OU un mode vocal est encore actif — porte de sortie pour le couper si /// l'instance a été désactivée entre-temps. /// /// Des lunettes appairées ne suffisent pas : sans la fonctionnalité sur /// l'instance, il n'y a rien à en faire. /// /// 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 && !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 GlassPill( size: 46, onTap: () => VoiceModeSheet.show(context, visitAppContext: visitAppContext), child: SizedBox( width: 46, height: 46, 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: 7, right: 7, 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), ), ), ), ], ), ), ); }, ); }, ); } }