@@ -53,8 +53,9 @@ use tracing::{debug, error, field::debug, info, instrument, trace, warn};
53
53
use super :: {
54
54
algorithms:: { rfind_event_by_id, rfind_event_by_item_id} ,
55
55
controller:: {
56
- Aggregation , AggregationKind , ObservableItemsTransaction , ObservableItemsTransactionEntry ,
57
- PendingEdit , PendingEditKind , TimelineMetadata , TimelineStateTransaction ,
56
+ find_item_and_apply_aggregation, Aggregation , AggregationKind , ObservableItemsTransaction ,
57
+ ObservableItemsTransactionEntry , PendingEdit , PendingEditKind , TimelineMetadata ,
58
+ TimelineStateTransaction ,
58
59
} ,
59
60
date_dividers:: DateDividerAdjuster ,
60
61
event_item:: {
@@ -717,7 +718,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
717
718
/// [`crate::timeline::TimelineController::handle_local_echo`].
718
719
#[ instrument( skip_all, fields( relates_to_event_id = ?c. relates_to. event_id) ) ]
719
720
fn handle_reaction ( & mut self , c : ReactionEventContent ) {
720
- let reacted_to_event_id = & c. relates_to . event_id ;
721
+ let target = TimelineEventItemId :: EventId ( c. relates_to . event_id ) ;
721
722
722
723
// Add the aggregation to the manager.
723
724
let reaction_status = match & self . ctx . flow {
@@ -739,28 +740,10 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
739
740
reaction_status,
740
741
} ,
741
742
) ;
742
- self . meta
743
- . aggregations
744
- . add ( TimelineEventItemId :: EventId ( reacted_to_event_id. clone ( ) ) , aggregation. clone ( ) ) ;
745
743
746
- let Some ( ( idx, event_item) ) = rfind_event_by_id ( self . items , reacted_to_event_id) else {
747
- warn ! ( "couldn't find reaction's target {reacted_to_event_id:?}" ) ;
748
- return ;
749
- } ;
750
-
751
- let mut new_content = event_item. content ( ) . clone ( ) ;
752
- match aggregation. apply ( & mut new_content) {
753
- Ok ( true ) => {
754
- trace ! ( "added reaction" ) ;
755
- let new_item = event_item. with_content ( new_content) ;
756
- self . items
757
- . replace ( idx, TimelineItem :: new ( new_item, event_item. internal_id . to_owned ( ) ) ) ;
758
- self . result . items_updated += 1 ;
759
- }
760
- Ok ( false ) => { }
761
- Err ( err) => {
762
- warn ! ( "error when applying reaction aggregation: {err}" ) ;
763
- }
744
+ self . meta . aggregations . add ( target. clone ( ) , aggregation. clone ( ) ) ;
745
+ if find_item_and_apply_aggregation ( & mut * self . items , & target, aggregation) {
746
+ self . result . items_updated += 1 ;
764
747
}
765
748
}
766
749
@@ -864,8 +847,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
864
847
}
865
848
866
849
fn handle_poll_response ( & mut self , c : UnstablePollResponseEventContent ) {
867
- let start_event_id = c. relates_to . event_id ;
868
-
850
+ let target = TimelineEventItemId :: EventId ( c. relates_to . event_id ) ;
869
851
let aggregation = Aggregation :: new (
870
852
self . ctx . flow . timeline_item_id ( ) ,
871
853
AggregationKind :: PollResponse {
@@ -874,60 +856,21 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
874
856
answers : c. poll_response . answers ,
875
857
} ,
876
858
) ;
877
-
878
- self . meta
879
- . aggregations
880
- . add ( TimelineEventItemId :: EventId ( start_event_id. clone ( ) ) , aggregation. clone ( ) ) ;
881
-
882
- let Some ( ( item_pos, item) ) = rfind_event_by_id ( self . items , & start_event_id) else {
883
- return ;
884
- } ;
885
-
886
- let mut new_content = item. content ( ) . clone ( ) ;
887
- match aggregation. apply ( & mut new_content) {
888
- Ok ( true ) => {
889
- trace ! ( "adding poll response." ) ;
890
- self . items . replace (
891
- item_pos,
892
- TimelineItem :: new ( item. with_content ( new_content) , item. internal_id . clone ( ) ) ,
893
- ) ;
894
- self . result . items_updated += 1 ;
895
- }
896
- Ok ( false ) => { }
897
- Err ( err) => {
898
- warn ! ( "discarding poll response: {err}" ) ;
899
- }
859
+ self . meta . aggregations . add ( target. clone ( ) , aggregation. clone ( ) ) ;
860
+ if find_item_and_apply_aggregation ( self . items , & target, aggregation) {
861
+ self . result . items_updated += 1 ;
900
862
}
901
863
}
902
864
903
865
fn handle_poll_end ( & mut self , c : UnstablePollEndEventContent ) {
904
- let start_event_id = c. relates_to . event_id ;
905
-
866
+ let target = TimelineEventItemId :: EventId ( c. relates_to . event_id ) ;
906
867
let aggregation = Aggregation :: new (
907
868
self . ctx . flow . timeline_item_id ( ) ,
908
869
AggregationKind :: PollEnd { end_date : self . ctx . timestamp } ,
909
870
) ;
910
- self . meta
911
- . aggregations
912
- . add ( TimelineEventItemId :: EventId ( start_event_id. clone ( ) ) , aggregation. clone ( ) ) ;
913
-
914
- let Some ( ( item_pos, item) ) = rfind_event_by_id ( self . items , & start_event_id) else {
915
- return ;
916
- } ;
917
-
918
- let mut new_content = item. content ( ) . clone ( ) ;
919
- match aggregation. apply ( & mut new_content) {
920
- Ok ( true ) => {
921
- trace ! ( "Ending poll." ) ;
922
- let new_item = item. with_content ( new_content) ;
923
- self . items
924
- . replace ( item_pos, TimelineItem :: new ( new_item, item. internal_id . to_owned ( ) ) ) ;
925
- self . result . items_updated += 1 ;
926
- }
927
- Ok ( false ) => { }
928
- Err ( err) => {
929
- warn ! ( "discarding poll end: {err}" ) ;
930
- }
871
+ self . meta . aggregations . add ( target. clone ( ) , aggregation. clone ( ) ) ;
872
+ if find_item_and_apply_aggregation ( self . items , & target, aggregation) {
873
+ self . result . items_updated += 1 ;
931
874
}
932
875
}
933
876
0 commit comments