feat: custom emoji picker

closes #14
This commit is contained in:
2025-05-27 12:22:28 +01:00
parent 8dae9a97f2
commit e9062f0265
6 changed files with 225 additions and 73 deletions

View File

@ -1,5 +1,4 @@
import 'package:collection/collection.dart';
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:flutter/material.dart';
import 'package:ndk/ndk.dart';
import 'package:ndk/shared/nips/nip19/nip19.dart';
@ -8,8 +7,8 @@ import 'package:zap_stream_flutter/const.dart';
import 'package:zap_stream_flutter/theme.dart';
import 'package:zap_stream_flutter/utils.dart';
import 'package:zap_stream_flutter/widgets/avatar.dart';
import 'package:zap_stream_flutter/widgets/emoji.dart';
import 'package:zap_stream_flutter/widgets/profile.dart';
import 'package:zap_stream_flutter/widgets/reaction.dart';
class WriteMessageWidget extends StatefulWidget {
final StreamEvent stream;
@ -24,6 +23,7 @@ class __WriteMessageWidget extends State<WriteMessageWidget> {
late final TextEditingController _controller;
OverlayEntry? _entry;
late FocusNode _focusNode;
List<List<String>> _tags = List.empty(growable: true);
@override
void initState() {
@ -177,11 +177,24 @@ class __WriteMessageWidget extends State<WriteMessageWidget> {
color: LAYER_2,
borderRadius: DEFAULT_BR,
),
child: EmojiPicker(
onEmojiSelected: (category, emoji) {
_controller.text = _controller.text + emoji.emoji;
child: EmojiPickerCustom(
customEmojiSets: [widget.stream.info.host],
onEmojiSelected: (emoji) {
_controller.text =
_controller.text +
(emoji.emoji.startsWith("http")
? ":${emoji.name}:"
: emoji.emoji);
if (emoji.emoji.startsWith("http")) {
setState(() {
_tags =
[
..._tags,
["emoji", emoji.name, emoji.emoji],
].toList();
});
}
},
config: emojiPickerConfig,
),
),
),
@ -196,13 +209,20 @@ class __WriteMessageWidget extends State<WriteMessageWidget> {
final login = ndk.accounts.getLoggedAccount();
if (login == null || _controller.text.isEmpty) return;
var tags = [
["a", widget.stream.aTag],
..._tags.where(
(t) => switch (t[0]) {
"emoji" => _controller.text.contains(":${t[1]}:"),
_ => true,
},
),
];
final chatMsg = Nip01Event(
pubKey: login.pubkey,
kind: 1311,
content: _controller.text.toString(),
tags: [
["a", widget.stream.aTag],
],
tags: tags,
);
_controller.clear();
_focusNode.unfocus();