add emoji button to composer

This commit is contained in:
Henry Hiles 2026-04-12 16:46:13 -04:00
commit 6ca974e6fc
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 52 additions and 23 deletions

View file

@ -9,6 +9,7 @@ import "package:nexus/models/configs/power_level_config.dart";
import "package:nexus/models/relation_type.dart";
import "package:nexus/widgets/chat_page/composer/mention_overlay.dart";
import "package:nexus/widgets/chat_page/composer/relation_preview.dart";
import "package:nexus/widgets/chat_page/emoji_picker_button.dart";
class ChatBox extends HookConsumerWidget {
final Message? relatedMessage;
@ -91,6 +92,11 @@ class ChatBox extends HookConsumerWidget {
child: Row(
spacing: 8,
children: [
EmojiPickerButton(
context: context,
onSelection: (_) => node?.requestFocus(),
controller: controller.value,
),
PopupMenuButton(
tooltip: "Add media",
enabled: canSendMessages,

View file

@ -0,0 +1,40 @@
import "package:emoji_text_field/emoji_text_field.dart";
import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart";
class EmojiPickerButton extends HookWidget {
final TextEditingController? controller;
final void Function(String emoji)? onSelection;
final VoidCallback? onPressed;
final BuildContext context;
const EmojiPickerButton({
this.controller,
this.onPressed,
this.onSelection,
required this.context,
super.key,
});
@override
Widget build(_) => IconButton(
onPressed: () {
onPressed?.call();
final controller = this.controller ?? TextEditingController();
showBottomSheet(
context: context,
builder: (context) => EmojiKeyboardView(
config: EmojiViewConfig(
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
height: 600,
),
textController: controller
..addListener(() async {
Navigator.of(context).pop();
onSelection?.call(controller.text);
}),
),
);
},
icon: Icon(Icons.emoji_emotions),
);
}

View file

@ -1,4 +1,3 @@
import "package:emoji_text_field/emoji_text_field.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/material.dart";
import "package:flutter/services.dart";
@ -21,6 +20,7 @@ import "package:nexus/models/configs/power_level_config.dart";
import "package:nexus/models/relation_type.dart";
import "package:nexus/models/requests/report_request.dart";
import "package:nexus/widgets/chat_page/composer/chat_box.dart";
import "package:nexus/widgets/chat_page/emoji_picker_button.dart";
import "package:nexus/widgets/chat_page/expandable_image_message.dart";
import "package:nexus/widgets/chat_page/member_list.dart";
import "package:nexus/widgets/chat_page/wrappers/message_wrapper.dart";
@ -117,28 +117,11 @@ class RoomChat extends HookConsumerWidget {
icon: Text(emoji),
),
),
IconButton(
onPressed: () {
Navigator.of(context).pop();
final controller = TextEditingController();
showBottomSheet(
EmojiPickerButton(
context: context,
builder: (context) => EmojiKeyboardView(
config: EmojiViewConfig(
backgroundColor: theme.colorScheme.surfaceContainer,
height: 600,
),
textController: controller
..addListener(() async {
Navigator.of(context).pop();
await notifier
.sendReaction(controller.text, message)
.onError(showError);
}),
),
);
},
icon: Icon(Icons.emoji_emotions),
onPressed: Navigator.of(context).pop,
onSelection: (emoji) =>
notifier.sendReaction(emoji, message).onError(showError),
),
],
),