import '../../data/models/status.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; /// A widget that displays the current connection status and allows the user to send a ping. class ConnectionStatusView extends StatelessWidget { final Status status; final VoidCallback onButtonClick; const ConnectionStatusView({ super.key, required this.status, required this.onButtonClick, }); /// Simulates sending a ping with a loading state. Future _sendPing() async { HapticFeedback.mediumImpact(); onButtonClick(); } @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( height: 80, child: AnimatedSwitcher( duration: kThemeAnimationDuration, child: _buildStatusContent(), ), ), const SizedBox(height: 24), AnimatedOpacity( duration: const Duration(milliseconds: 300), opacity: status == Status.loading ? 0.0 : 1.0, child: ElevatedButton( onPressed: status == Status.loading ? null : _sendPing, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFFD366E), disabledBackgroundColor: const Color(0xFFEDEDF0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), minimumSize: const Size(0, 32), elevation: 0, ), child: Padding( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 6, ), child: Text( "Send a ping", style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Colors.white, letterSpacing: 0.1, ), ), ), ), ), ], ), ); } /// Builds the status message UI dynamically. Widget _buildStatusContent() { return Align( key: ValueKey(status), alignment: Alignment.center, child: switch (status) { Status.loading => _buildLoadingIndicator(), Status.success => _buildSuccessMessage(), Status.error => _buildIdleMessage(), Status.idle || Status.error => _buildIdleMessage(), }, ); } /// Loading State Widget _buildLoadingIndicator() { return Row( key: const ValueKey(Status.loading), mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.grey, ), ), const SizedBox(width: 16), const Text( "Waiting for connection...", style: TextStyle( fontSize: 14, height: 19.6 / 14, fontWeight: FontWeight.w400, color: Color(0xFF2D2D31), letterSpacing: 0.1, ), ), ], ); } /// Success State Widget _buildSuccessMessage() { return Column( key: const ValueKey(Status.success), children: const [ Text( "Congratulations!", style: TextStyle( fontSize: 24, fontWeight: FontWeight.w400, color: Color(0xFF2D2D31), ), ), SizedBox(height: 8), Text( "You connected your app successfully.", style: TextStyle( fontSize: 14, height: 19.6 / 14, fontWeight: FontWeight.w400, color: Color(0xFF56565C), letterSpacing: 0.1, ), textAlign: TextAlign.center, ), ], ); } /// Idle State Widget _buildIdleMessage() { return Column( key: const ValueKey(Status.idle), children: const [ Text( "Check connection", style: TextStyle( fontSize: 24, height: 28.8 / 24, fontWeight: FontWeight.w400, color: Color(0xFF2D2D31), ), ), SizedBox(height: 8), Text( "Send a ping to verify the connection.", style: TextStyle( fontSize: 14, height: 19.6 / 14, fontWeight: FontWeight.w400, color: Color(0xFF56565C), letterSpacing: 0.1, ), textAlign: TextAlign.center, ), ], ); } }