Watch
1
0
Fork
You've already forked nexus
0
forked from Nexus/nexus

add support for setting recent emoji

This commit is contained in:
Henry Hiles 2026-09-16 15:46:42 -04:00
commit 810a0b102b
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 103 additions and 60 deletions

View file

@ -1,12 +1,12 @@
import "dart:async";
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:material_emoji_picker/material_emoji_picker.dart" as upstream;
import "package:material_ui/material_ui.dart";
import "package:nexus/controllers/account_data.dart";
import "package:nexus/controllers/recent_emoji.dart";
import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/main.dart";
class const EmojiPicker({
required final FutureOr<void> Function(String value) onSelection,
@ -14,40 +14,40 @@ class const EmojiPicker({
super.key,
}) extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) => ref
.watch(upstream.EmojiController.provider)
.betterWhen(
data: (categories) => upstream.EmojiPicker(
onSelection: (value) async {
//
await onSelection(value);
},
allowFreeText: allowFreeText,
prependCategories: .new([
.new(
icon: Icon(Icons.history),
name: "Recent",
emojis: .new(
ref
.watch(
AccountDataController.provider.select(
(value) => value.recentEmoji
.map((entry) => entry.emoji)
.toIList(),
),
)
.map(
(emoji) => categories
.map((element) => element.emojis)
.flattened
.firstWhereOrNull(
(element) => element.value == emoji,
),
)
.nonNulls,
Widget build(BuildContext context, WidgetRef ref) {
final recentEmoji = ref.watch(RecentEmojiController.provider);
return ref
.watch(upstream.EmojiController.provider)
.betterWhen(
data: (categories) => upstream.EmojiPicker(
onSelection: (emoji) async {
await onSelection(emoji);
await ref
.watch(RecentEmojiController.provider.notifier)
.add(emoji)
.onError(showError);
},
allowFreeText: allowFreeText,
prependCategories: .new([
.new(
icon: Icon(Icons.history),
name: "Recent",
emojis: .new(
recentEmoji
.map(
(recent) => categories
.map((element) => element.emojis)
.flattened
.firstWhereOrNull(
(element) => element.value == recent.emoji,
),
)
.nonNulls,
),
),
),
]),
),
);
]),
),
);
}
}

View file

@ -4,12 +4,12 @@ import "package:flutter/services.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:measure_size/measure_size.dart";
import "package:nexus/controllers/account_data.dart";
import "package:nexus/controllers/client.dart";
import "package:nexus/controllers/client_state.dart";
import "package:nexus/controllers/member_list_opened.dart";
import "package:nexus/controllers/pinned_ids.dart";
import "package:nexus/controllers/power_level.dart";
import "package:nexus/controllers/recent_emoji.dart";
import "package:nexus/controllers/rooms.dart";
import "package:nexus/controllers/room_chat.dart";
import "package:nexus/controllers/via.dart";
@ -196,6 +196,8 @@ final class const RoomChat({
final danger = theme.colorScheme.error;
final isSentByMe = event.sender == userId;
final recentEmoji = ref.watch(RecentEmojiController.provider);
return [
if (ref.watch(
PowerLevelController.provider(
@ -209,13 +211,7 @@ final class const RoomChat({
child: Row(
children: [
...{
...ref.watch(
AccountDataController.provider.select(
(value) => value.recentEmoji
.map((entry) => entry.emoji)
.toIList(),
),
),
...recentEmoji.map((entry) => entry.emoji),
"👍",
"🤣",
"😭",
@ -230,6 +226,11 @@ final class const RoomChat({
await notifier
.sendReaction(emoji, event)
.onError(showError);
ref
.watch(RecentEmojiController.provider.notifier)
.add(emoji)
.onError(showError);
},
icon: Text(emoji),
),