forked from Nexus/nexus
add support for setting recent emoji
This commit is contained in:
parent
ec1603b828
commit
810a0b102b
4 changed files with 103 additions and 60 deletions
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
]),
|
||||
),
|
||||
);
|
||||
]),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
|
|
|
|||
Loading…
Reference in a new issue