import 'package:flutter/material.dart'; import 'package:notas/widgets/sync_status.dart'; class SyncStatusIndicator extends StatelessWidget { const SyncStatusIndicator({ required this.status, this.progress, this.detailMessage, this.errorMessage, this.onTap, super.key, }); final SyncStatus status; final double? progress; final String? detailMessage; final String? errorMessage; final VoidCallback? onTap; Widget _buildIndicator(Widget child) { if (onTap == null) { return child; } return MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: onTap, child: child, ), ); } String _messageForStatus() { switch (status) { case SyncStatus.idle: return 'Sincronización en espera'; case SyncStatus.preparing: return detailMessage ?? 'Preparando sincronización...'; case SyncStatus.encrypting: return detailMessage ?? 'Encriptando datos para subir...'; case SyncStatus.uploading: return detailMessage ?? 'Subiendo datos al servidor...'; case SyncStatus.waitingResponse: return detailMessage ?? 'Esperando respuesta del servidor...'; case SyncStatus.decrypting: return detailMessage ?? 'Desencriptando datos recibidos...'; case SyncStatus.syncing: return detailMessage ?? 'Sincronizando...'; case SyncStatus.synced: return detailMessage ?? 'Sincronizado'; case SyncStatus.error: return errorMessage ?? detailMessage ?? 'Error al sincronizar'; } } Widget _buildStatusBadge({ required IconData icon, required Color color, required bool determinate, }) { final double ringProgress = (progress ?? 0).clamp(0.0, 1.0); return SizedBox( width: 18, height: 18, child: Stack( alignment: Alignment.center, children: [ SizedBox( width: 18, height: 18, child: CircularProgressIndicator( strokeWidth: 2, value: determinate ? ringProgress : null, backgroundColor: color.withValues(alpha: 0.16), valueColor: AlwaysStoppedAnimation(color), ), ), Icon(icon, size: 10, color: color), ], ), ); } @override Widget build(BuildContext context) { switch (status) { case SyncStatus.idle: return Tooltip( message: _messageForStatus(), child: _buildIndicator( const Icon(Icons.cloud_outlined, size: 16, color: Colors.white38), ), ); case SyncStatus.preparing: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.sync, color: const Color.fromARGB(255, 165, 165, 165), determinate: false, ), ), ); case SyncStatus.encrypting: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.cloud_upload_outlined, color: const Color.fromARGB(255, 109, 191, 255), determinate: true, ), ), ); case SyncStatus.uploading: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.cloud_upload, color: const Color.fromARGB(255, 98, 190, 255), determinate: false, ), ), ); case SyncStatus.waitingResponse: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.cloud_sync_outlined, color: const Color.fromARGB(255, 150, 150, 150), determinate: false, ), ), ); case SyncStatus.decrypting: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.cloud_download_outlined, color: const Color.fromARGB(255, 154, 194, 112), determinate: true, ), ), ); case SyncStatus.syncing: return Tooltip( message: _messageForStatus(), child: _buildIndicator( _buildStatusBadge( icon: Icons.sync, color: const Color.fromARGB(255, 150, 150, 150), determinate: false, ), ), ); case SyncStatus.synced: return Tooltip( message: _messageForStatus(), child: _buildIndicator( const Icon(Icons.check_circle, size: 16, color: Colors.green), ), ); case SyncStatus.error: return Tooltip( message: _messageForStatus(), child: _buildIndicator( const Icon(Icons.error, size: 16, color: Colors.red), ), ); } } }