@@ -357,6 +357,41 @@ impl App {
357
357
}
358
358
}
359
359
360
+ async fn toggle_reaction_to_latest_msg ( & mut self ) {
361
+ let selected = self . get_selected_room_id ( None ) ;
362
+
363
+ if let Some ( ( sdk_timeline, items) ) = selected. and_then ( |room_id| {
364
+ self . timelines
365
+ . lock ( )
366
+ . unwrap ( )
367
+ . get ( & room_id)
368
+ . map ( |timeline| ( timeline. timeline . clone ( ) , timeline. items . clone ( ) ) )
369
+ } ) {
370
+ // Look for the latest (most recent) room message.
371
+ let item_id = {
372
+ let items = items. lock ( ) . unwrap ( ) ;
373
+ items. iter ( ) . rev ( ) . find_map ( |it| {
374
+ it. as_event ( )
375
+ . and_then ( |ev| ev. content ( ) . as_message ( ) . is_some ( ) . then ( || ev. identifier ( ) ) )
376
+ } )
377
+ } ;
378
+
379
+ // If found, send a reaction.
380
+ if let Some ( item_id) = item_id {
381
+ match sdk_timeline. toggle_reaction ( & item_id, "🥰" ) . await {
382
+ Ok ( _) => {
383
+ self . set_status_message ( "reaction sent!" . to_owned ( ) ) ;
384
+ }
385
+ Err ( err) => self . set_status_message ( format ! ( "error when reacting: {err}" ) ) ,
386
+ }
387
+ } else {
388
+ self . set_status_message ( "no item to react to" . to_owned ( ) ) ;
389
+ }
390
+ } else {
391
+ self . set_status_message ( "missing timeline for room" . to_owned ( ) ) ;
392
+ } ;
393
+ }
394
+
360
395
/// Run a small back-pagination (expect a batch of 20 events, continue until
361
396
/// we get 10 timeline items or hit the timeline start).
362
397
fn back_paginate ( & mut self ) {
@@ -484,6 +519,8 @@ impl App {
484
519
} ;
485
520
}
486
521
522
+ Char ( 'l' ) => self . toggle_reaction_to_latest_msg ( ) . await ,
523
+
487
524
Char ( 'r' ) => self . details_mode = DetailsMode :: ReadReceipts ,
488
525
Char ( 't' ) => self . details_mode = DetailsMode :: TimelineItems ,
489
526
Char ( 'e' ) => self . details_mode = DetailsMode :: Events ,
0 commit comments