add support for showing recent emoji

This commit is contained in:
Henry Hiles 2026-09-16 15:18:41 -04:00
commit ec1603b828
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
5 changed files with 58 additions and 5 deletions

View file

@ -2,7 +2,7 @@ import "dart:io";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:file_selector/file_selector.dart"; import "package:file_selector/file_selector.dart";
import "package:material_emoji_picker/material_emoji_picker.dart"; import "package:nexus/widgets/emoji_picker.dart";
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
import "package:flutter/services.dart"; import "package:flutter/services.dart";
import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_hooks/flutter_hooks.dart";

View file

@ -0,0 +1,53 @@
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/helpers/extensions/better_when.dart";
class const EmojiPicker({
required final FutureOr<void> Function(String value) onSelection,
final bool allowFreeText = false,
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,
),
),
]),
),
);
}

View file

@ -17,7 +17,7 @@ import "package:nexus/models/content/message.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/relation_type.dart"; import "package:nexus/models/relation_type.dart";
import "package:nexus/widgets/composer/composer.dart"; import "package:nexus/widgets/composer/composer.dart";
import "package:material_emoji_picker/material_emoji_picker.dart"; import "package:nexus/widgets/emoji_picker.dart";
import "package:nexus/widgets/pinned_events_drawer.dart"; import "package:nexus/widgets/pinned_events_drawer.dart";
import "package:nexus/widgets/renderers/event.dart"; import "package:nexus/widgets/renderers/event.dart";
import "package:nexus/widgets/member_list.dart"; import "package:nexus/widgets/member_list.dart";

View file

@ -898,10 +898,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: material_emoji_picker name: material_emoji_picker
sha256: "1547195a419134cf0b2396d119dc873589804f461424917b1b61a0966bfb7e5a" sha256: bb1d5a467e2f83fd13dc83bd5a3c827bbfc525041921ed74a1d85b905fdc77e8
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0+1" version: "1.0.2"
material_ui: material_ui:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -80,7 +80,7 @@ dependencies:
unifiedpush_storage_shared_preferences: 1.0.0 unifiedpush_storage_shared_preferences: 1.0.0
flutter_local_notifications: 22.3.0 flutter_local_notifications: 22.3.0
flutter_local_notifications_linux: 8.0.1 flutter_local_notifications_linux: 8.0.1
material_emoji_picker: 1.0.0+1 material_emoji_picker: 1.0.2
dev_dependencies: dev_dependencies:
build_runner: 2.16.1 build_runner: 2.16.1