add emoji search and free text reactions

This commit is contained in:
Henry Hiles 2026-09-16 12:32:37 -04:00
commit 759bee6a6c
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -19,6 +19,7 @@ final class const EmojiPicker({
@override
Widget build(BuildContext context, WidgetRef ref) {
final selectedCategory = useState<int?>(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,