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 @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final selectedCategory = useState<int?>(null); final selectedCategory = useState<int?>(null);
final search = useState("");
final scrollController = useScrollController(); final scrollController = useScrollController();
final listController = useMemoized(ListController.new); final listController = useMemoized(ListController.new);
@ -64,11 +65,22 @@ final class const EmojiPicker({
return Column( return Column(
spacing: 4, spacing: 4,
children: [ children: [
SearchAnchor.bar( SearchBar(
barHintText: "Search emoji", hintText: "Search emoji",
suggestionsBuilder: (context, controller) { leading: Icon(Icons.search),
return []; 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( SizedBox(
height: 48, height: 48,
@ -110,6 +122,22 @@ final class const EmojiPicker({
itemCount: combined.length, itemCount: combined.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final category = combined[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( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -121,11 +149,11 @@ final class const EmojiPicker({
maxCrossAxisExtent: 56, maxCrossAxisExtent: 56,
mainAxisExtent: 56, mainAxisExtent: 56,
), ),
itemCount: category.emojis.length, itemCount: emojis.length,
shrinkWrap: true, shrinkWrap: true,
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final emoji = category.emojis[index]; final emoji = emojis[index];
return IconButton( return IconButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,