@@ -180,7 +180,11 @@ private func segments(_ emoji: [EmojiSegment : [String]], skinModifiers: [EmojiS
180180 let items = list . map { emoji -> NSAttributedString in
181181 let unmodified = emoji . emojiUnmodified
182182 let value = skinModifiers . first ( where : { $0 . emoji == unmodified } ) . map { unmodified . emojiWithSkinModifier ( $0 . modifier ) } ?? emoji
183- return . initialize ( string : value . normalizedEmoji , font : . normal ( 26.0 ) )
183+ let attributed = NSMutableAttributedString ( attributedString : . initialize ( string : value . normalizedEmoji , font : . normal ( 26.0 ) ) )
184+ if key == . Recent {
185+ attributed . addAttribute ( recentEmojiSourceKey , value : emoji , range : NSRange ( location : 0 , length : attributed . length ) )
186+ }
187+ return attributed
184188 }
185189 let lines = stride ( from : 0 , to : items . count , by : 8 ) . map {
186190 Array ( items [ $0 ..< min ( $0 + 8 , items . count ) ] )
@@ -517,9 +521,12 @@ private func entries(_ state: State, arguments: Arguments) -> [InputDataEntry] {
517521 }
518522 }
519523 let seg = segments ( e , skinModifiers : state . recent . skinModifiers )
520- let seglist = seg . map { ( key , _ ) -> EmojiSegment in
524+ var seglist = seg . map { ( key , _ ) -> EmojiSegment in
521525 return key
522526 } . sorted ( by : < )
527+ if ! seglist . contains ( . Recent ) {
528+ seglist . insert ( . Recent , at : 0 )
529+ }
523530
524531
525532 let isPremium = state . peer ? . peer . isPremium == true || arguments . ignorePremium
@@ -814,13 +821,25 @@ private func entries(_ state: State, arguments: Arguments) -> [InputDataEntry] {
814821 let hasAnimatedRecent = arguments . mode == . emoji || arguments . mode == . stories || arguments . mode == . forumTopic || arguments . mode == . selectAvatar || arguments . mode == . channelReactions
815822
816823 if key == . Recent , ! recentAnimated . isEmpty , hasAnimatedRecent {
824+ let removeRecent : ( ( MediaId ) -> Void ) ?
825+ if arguments . mode == . emoji || arguments . mode == . stories {
826+ removeRecent = { id in
827+ _ = removeAnimatedUsedEmoji ( id , postbox : arguments . context . account . postbox ) . startStandalone ( )
828+ }
829+ } else {
830+ removeRecent = nil
831+ }
817832 let tuple = Tuple ( items : recentAnimated , selected : emojiesRowSelection ( state . selectedItems , in : recentAnimated ) , color : state . color )
818833 entries . append ( . custom ( sectionId : sectionId , index : index , value : . none , identifier : _id_emoji_block ( EmojiSegment . RecentAnimated . rawValue ) , equatable : InputDataEquatable ( tuple ) , comparable : nil , item : { initialSize , stableId in
819- return EmojiesSectionRowItem ( initialSize , stableId : stableId , context : arguments . context , revealed : true , installed : true , info : nil , items : recentAnimated , mode : arguments . mode . itemMode , selectedItems : tuple . selected , color : tuple . color , callback : arguments . send , largeCallback : arguments . sendLarge , drag : arguments . drag , ignorePremium : arguments . ignorePremium )
834+ return EmojiesSectionRowItem ( initialSize , stableId : stableId , context : arguments . context , revealed : true , installed : true , info : nil , items : recentAnimated , mode : arguments . mode . itemMode , selectedItems : tuple . selected , color : tuple . color , callback : arguments . send , largeCallback : arguments . sendLarge , drag : arguments . drag , ignorePremium : arguments . ignorePremium , removeRecent : removeRecent )
820835 } ) )
821836 index += 1
822837 }
823838
839+ guard let lines = seg [ key ] , ! lines . isEmpty else {
840+ continue
841+ }
842+
824843 if key != . Recent || ! recentAnimated . isEmpty , arguments . mode == . emoji || arguments . mode == . stories {
825844 entries . append ( . custom ( sectionId : sectionId , index : index , value : . none , identifier : _id_emoji_segment ( key . rawValue ) , equatable : InputDataEquatable ( key ) , comparable : nil , item : { initialSize , stableId in
826845 return EStickItem ( initialSize , stableId : stableId , segmentName : key . localizedString )
@@ -836,7 +855,6 @@ private func entries(_ state: State, arguments: Arguments) -> [InputDataEntry] {
836855 let selectedOrders : [ String : Int ]
837856 let selectionColor : NSColor ?
838857 }
839- let lines = seg [ key ] !
840858 var selectedOrders : [ String : Int ] = [ : ]
841859 if state . selectedItems . contains ( where : { $0 . index != nil } ) {
842860 let segmentKeys = Set ( lines . flatMap { $0 . map { emojiSelectionKey ( $0 . string ) } } )
@@ -849,9 +867,17 @@ private func entries(_ state: State, arguments: Arguments) -> [InputDataEntry] {
849867 }
850868 }
851869 }
870+ let removeRecent : ( ( String ) -> Void ) ?
871+ if key == . Recent {
872+ removeRecent = { emoji in
873+ _ = removeUsedEmoji ( emoji , postbox : arguments . context . account . postbox ) . startStandalone ( )
874+ }
875+ } else {
876+ removeRecent = nil
877+ }
852878 let tuple = Tuple ( key : key , lines : lines , selectedOrders : selectedOrders , selectionColor : state . color ?? theme . colors . text )
853879 entries . append ( . custom ( sectionId : sectionId , index : index , value : . none , identifier : _id_emoji_block ( key . rawValue ) , equatable : InputDataEquatable ( tuple ) , comparable : nil , item : { initialSize , stableId in
854- return EBlockItem ( initialSize , stableId : stableId , attrLines : tuple . lines , segment : tuple . key , account : arguments . context . account , selectHandler : arguments . sendEmoji , dragHandler : arguments . dragEmoji , selectedOrders : tuple . selectedOrders , selectionColor : tuple . selectionColor )
880+ return EBlockItem ( initialSize , stableId : stableId , attrLines : tuple . lines , segment : tuple . key , account : arguments . context . account , selectHandler : arguments . sendEmoji , dragHandler : arguments . dragEmoji , selectedOrders : tuple . selectedOrders , selectionColor : tuple . selectionColor , removeRecent : removeRecent )
855881 } ) )
856882 index += 1
857883 }
0 commit comments