Line data Source code
1 : /// Extension to synchronize the recently used widgets with Element clients 2 : library; 3 : 4 : import 'package:matrix/matrix.dart'; 5 : 6 : /// Syncs recent emojis in account data 7 : /// 8 : /// Keeps recently used emojis stored in account data by 9 : /// 10 : /// ```js 11 : /// { // the account data 12 : /// "io.element.recent_emoji": { 13 : /// "recent_emoji" : { 14 : /// "emoji character": n, // number used 15 : /// } 16 : /// } 17 : /// } 18 : /// ``` 19 : /// 20 : /// Proprietary extension by New Vector Ltd. 21 : extension RecentEmojiExtension on Client { 22 : /// returns the recently used emojis from the account data 23 : /// 24 : /// There's no corresponding standard or MSC, it's just the reverse-engineered 25 : /// API from New Vector Ltd. 26 1 : Map<String, int> get recentEmojis { 27 1 : final recents = <String, int>{}; 28 : 29 2 : accountData['io.element.recent_emoji'] 30 1 : ?.content 31 1 : .tryGetList('recent_emoji') 32 2 : ?.forEach((item) { 33 1 : if (item is List) { 34 6 : if (item.length > 1 && item[0] is String && item[1] is int) { 35 3 : recents[item[0]] = item[1]; 36 : } 37 : } 38 : }); 39 : 40 : return recents; 41 : } 42 : 43 : /// +1 the stated emoji in the account data 44 1 : Future<void> addRecentEmoji(String emoji) async { 45 1 : final data = recentEmojis; 46 1 : if (data.containsKey(emoji)) { 47 0 : data[emoji] = data[emoji]! + 1; 48 : } else { 49 1 : data[emoji] = 1; 50 : } 51 1 : return setRecentEmojiData(data); 52 : } 53 : 54 : /// sets the raw recent emoji account data. Use [addRecentEmoji] instead 55 1 : Future<void> setRecentEmojiData(Map<String, int> data) async { 56 1 : if (userID == null) return; 57 7 : final content = List.from(data.entries.map((e) => [e.key, e.value])); 58 1 : return setAccountData( 59 1 : userID!, 60 : 'io.element.recent_emoji', 61 1 : {'recent_emoji': content}, 62 : ); 63 : } 64 : }