tui: preserve pending steer metadata on commit

This commit is contained in:
Charles Cunningham
2026-03-02 23:03:44 -08:00
parent 3e778b4a50
commit 4276ff1bea
2 changed files with 44 additions and 10 deletions
+18 -7
View File
@@ -4660,18 +4660,29 @@ impl ChatWidget {
};
let rendered = Self::rendered_user_message_event_from_event(&event);
let compare_key = Self::pending_steer_compare_key_from_item(item);
let should_render = if self
if self
.pending_steers
.front()
.is_some_and(|pending| pending.compare_key == compare_key)
{
self.pending_steers.pop_front();
let pending = self
.pending_steers
.pop_front()
.expect("checked front pending steer");
self.refresh_pending_input_preview();
true
} else {
self.last_rendered_user_message_event.as_ref() != Some(&rendered)
};
if should_render {
let pending_event = UserMessageEvent {
message: pending.user_message.text,
images: Some(pending.user_message.remote_image_urls),
local_images: pending
.user_message
.local_images
.into_iter()
.map(|image| image.path)
.collect(),
text_elements: pending.user_message.text_elements,
};
self.on_user_message_event(pending_event);
} else if self.last_rendered_user_message_event.as_ref() != Some(&rendered) {
self.on_user_message_event(event);
}
}
+26 -3
View File
@@ -3927,9 +3927,32 @@ async fn item_completed_pops_pending_steer_with_local_image_and_text_elements()
);
assert!(chat.pending_steers.is_empty());
let inserted = drain_insert_history(&mut rx);
assert_eq!(inserted.len(), 1);
assert!(lines_to_single_string(&inserted[0]).contains("note"));
let mut user_cell = None;
while let Ok(ev) = rx.try_recv() {
if let AppEvent::InsertHistoryCell(cell) = ev
&& let Some(cell) = cell.as_any().downcast_ref::<UserHistoryCell>()
{
user_cell = Some((
cell.message.clone(),
cell.text_elements.clone(),
cell.local_image_paths.clone(),
cell.remote_image_urls.clone(),
));
break;
}
}
let (stored_message, stored_elements, stored_images, stored_remote_image_urls) =
user_cell.expect("expected pending steer user history cell");
assert_eq!(stored_message, "note");
assert_eq!(
stored_elements,
vec![TextElement::new((0..4).into(), Some("note".to_string()))]
);
assert_eq!(stored_images.len(), 1);
assert!(stored_images[0].ends_with("pending-steer.png"));
assert!(stored_remote_image_urls.is_empty());
}
#[tokio::test]