import 'package:flutter/material.dart'; import '../../core/constants/env_config.dart'; /// Widget de recherche d'amis avec design moderne et compact. /// /// Ce widget permet à l'utilisateur de rechercher des amis avec un champ /// de texte stylisé et une icône de nettoyage. /// /// **Usage:** /// ```dart /// SearchFriends( /// onSearchChanged: (query) => filterFriends(query), /// ) /// ``` class SearchFriends extends StatefulWidget { const SearchFriends({ super.key, this.onSearchChanged, this.hintText = 'Rechercher un ami...', }); /// Callback appelé lorsque la recherche change final ValueChanged? onSearchChanged; /// Texte d'indication final String hintText; @override State createState() => _SearchFriendsState(); } class _SearchFriendsState extends State { final TextEditingController _controller = TextEditingController(); @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return TextField( controller: _controller, decoration: _buildDecoration(theme), style: theme.textTheme.bodyMedium, onChanged: _handleSearchChanged, textInputAction: TextInputAction.search, ); } /// Construit la décoration du champ de recherche. InputDecoration _buildDecoration(ThemeData theme) { return InputDecoration( hintText: widget.hintText, hintStyle: theme.textTheme.bodyMedium?.copyWith( color: theme.colorScheme.onSurface.withOpacity(0.5), ), filled: true, fillColor: theme.colorScheme.surfaceVariant.withOpacity(0.5), prefixIcon: Icon( Icons.search, color: theme.colorScheme.onSurface.withOpacity(0.6), size: 20, ), suffixIcon: _controller.text.isNotEmpty ? IconButton( icon: Icon( Icons.clear, color: theme.colorScheme.onSurface.withOpacity(0.6), size: 20, ), onPressed: _clearSearch, padding: EdgeInsets.zero, constraints: const BoxConstraints(), ) : null, border: OutlineInputBorder( borderRadius: BorderRadius.circular(24), borderSide: BorderSide.none, ), contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), ); } /// Gère le changement de recherche. void _handleSearchChanged(String value) { setState(() {}); // Met à jour l'UI pour afficher/masquer l'icône clear if (EnvConfig.enableDetailedLogs) { debugPrint('[SearchFriends] Recherche: $value'); } widget.onSearchChanged?.call(value); } /// Nettoie le champ de recherche. void _clearSearch() { _controller.clear(); setState(() {}); widget.onSearchChanged?.call(''); } }