65 lines
1.7 KiB
Dart
65 lines
1.7 KiB
Dart
/// Extension to synchronize the recently used widgets with Element clients
|
|
library;
|
|
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
/// Syncs recent emojis in account data
|
|
///
|
|
/// Keeps recently used emojis stored in account data by
|
|
///
|
|
/// ```js
|
|
/// { // the account data
|
|
/// "io.element.recent_emoji": {
|
|
/// "recent_emoji" : {
|
|
/// "emoji character": n, // number used
|
|
/// }
|
|
/// }
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// Proprietary extension by New Vector Ltd.
|
|
extension RecentEmojiExtension on Client {
|
|
/// returns the recently used emojis from the account data
|
|
///
|
|
/// There's no corresponding standard or MSC, it's just the reverse-engineered
|
|
/// API from New Vector Ltd.
|
|
Map<String, int> get recentEmojis {
|
|
final recents = <String, int>{};
|
|
|
|
accountData['io.element.recent_emoji']
|
|
?.content
|
|
.tryGetList('recent_emoji')
|
|
?.forEach((item) {
|
|
if (item is List) {
|
|
if (item.length > 1 && item[0] is String && item[1] is int) {
|
|
recents[item[0]] = item[1];
|
|
}
|
|
}
|
|
});
|
|
|
|
return recents;
|
|
}
|
|
|
|
/// +1 the stated emoji in the account data
|
|
Future<void> addRecentEmoji(String emoji) async {
|
|
final data = recentEmojis;
|
|
if (data.containsKey(emoji)) {
|
|
data[emoji] = data[emoji]! + 1;
|
|
} else {
|
|
data[emoji] = 1;
|
|
}
|
|
return setRecentEmojiData(data);
|
|
}
|
|
|
|
/// sets the raw recent emoji account data. Use [addRecentEmoji] instead
|
|
Future<void> setRecentEmojiData(Map<String, int> data) async {
|
|
if (userID == null) return;
|
|
final content = List.from(data.entries.map((e) => [e.key, e.value]));
|
|
return setAccountData(
|
|
userID!,
|
|
'io.element.recent_emoji',
|
|
{'recent_emoji': content},
|
|
);
|
|
}
|
|
}
|