From 759bee6a6c9587ddba9dae24f06eca2784863840 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Wed, 16 Sep 2026 12:32:37 -0400 Subject: [PATCH] add emoji search and free text reactions --- lib/widgets/emoji_picker.dart | 42 +++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/widgets/emoji_picker.dart b/lib/widgets/emoji_picker.dart index d1248b5..438adee 100644 --- a/lib/widgets/emoji_picker.dart +++ b/lib/widgets/emoji_picker.dart @@ -19,6 +19,7 @@ final class const EmojiPicker({ @override Widget build(BuildContext context, WidgetRef ref) { final selectedCategory = useState(null); + final search = useState(""); final scrollController = useScrollController(); final listController = useMemoized(ListController.new); @@ -64,11 +65,22 @@ final class const EmojiPicker({ return Column( spacing: 4, children: [ - SearchAnchor.bar( - barHintText: "Search emoji", - suggestionsBuilder: (context, controller) { - return []; - }, + SearchBar( + hintText: "Search emoji", + leading: Icon(Icons.search), + onChanged: (value) => search.value = value, + trailing: [ + IconButton( + onPressed: search.value.isEmpty + ? null + : () async { + Navigator.of(context).pop(); + + await onSelection(search.value); + }, + icon: Icon(Icons.send), + ), + ], ), SizedBox( height: 48, @@ -110,6 +122,22 @@ final class const EmojiPicker({ itemCount: combined.length, itemBuilder: (context, index) { final category = combined[index]; + final emojis = search.value.isEmpty + ? category.emojis + : category.emojis + .where( + (emoji) => + emoji.aliases.join().contains( + search.value, + ) || + emoji.description.contains( + search.value, + ) || + emoji.tags.join().contains( + search.value, + ), + ) + .toIList(); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -121,11 +149,11 @@ final class const EmojiPicker({ maxCrossAxisExtent: 56, mainAxisExtent: 56, ), - itemCount: category.emojis.length, + itemCount: emojis.length, shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - final emoji = category.emojis[index]; + final emoji = emojis[index]; return IconButton( padding: EdgeInsets.zero,