add emoji search and free text reactions
This commit is contained in:
parent
457299ad81
commit
759bee6a6c
1 changed files with 35 additions and 7 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue