Add comment box to negative feedback reaction (#27934)
Release Notes: - N/A
This commit is contained in:
parent
889bc13b7d
commit
45e7cd1638
1 changed files with 141 additions and 10 deletions
|
@ -55,6 +55,8 @@ pub struct ActiveThread {
|
||||||
notifications: Vec<WindowHandle<AgentNotification>>,
|
notifications: Vec<WindowHandle<AgentNotification>>,
|
||||||
_subscriptions: Vec<Subscription>,
|
_subscriptions: Vec<Subscription>,
|
||||||
notification_subscriptions: HashMap<WindowHandle<AgentNotification>, Vec<Subscription>>,
|
notification_subscriptions: HashMap<WindowHandle<AgentNotification>, Vec<Subscription>>,
|
||||||
|
showing_feedback_comments: bool,
|
||||||
|
feedback_comments_editor: Option<Entity<Editor>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct RenderedMessage {
|
struct RenderedMessage {
|
||||||
|
@ -369,6 +371,8 @@ impl ActiveThread {
|
||||||
notifications: Vec::new(),
|
notifications: Vec::new(),
|
||||||
_subscriptions: subscriptions,
|
_subscriptions: subscriptions,
|
||||||
notification_subscriptions: HashMap::default(),
|
notification_subscriptions: HashMap::default(),
|
||||||
|
showing_feedback_comments: false,
|
||||||
|
feedback_comments_editor: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
for message in thread.read(cx).messages().cloned().collect::<Vec<_>>() {
|
for message in thread.read(cx).messages().cloned().collect::<Vec<_>>() {
|
||||||
|
@ -896,9 +900,11 @@ impl ActiveThread {
|
||||||
fn handle_feedback_click(
|
fn handle_feedback_click(
|
||||||
&mut self,
|
&mut self,
|
||||||
feedback: ThreadFeedback,
|
feedback: ThreadFeedback,
|
||||||
_window: &mut Window,
|
window: &mut Window,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut Context<Self>,
|
||||||
) {
|
) {
|
||||||
|
match feedback {
|
||||||
|
ThreadFeedback::Positive => {
|
||||||
let report = self
|
let report = self
|
||||||
.thread
|
.thread
|
||||||
.update(cx, |thread, cx| thread.report_feedback(feedback, cx));
|
.update(cx, |thread, cx| thread.report_feedback(feedback, cx));
|
||||||
|
@ -910,6 +916,85 @@ impl ActiveThread {
|
||||||
})
|
})
|
||||||
.detach_and_log_err(cx);
|
.detach_and_log_err(cx);
|
||||||
}
|
}
|
||||||
|
ThreadFeedback::Negative => {
|
||||||
|
self.handle_show_feedback_comments(window, cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_show_feedback_comments(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
||||||
|
self.showing_feedback_comments = true;
|
||||||
|
|
||||||
|
if self.feedback_comments_editor.is_none() {
|
||||||
|
let buffer = cx.new(|cx| {
|
||||||
|
let empty_string = String::new();
|
||||||
|
MultiBuffer::singleton(cx.new(|cx| Buffer::local(empty_string, cx)), cx)
|
||||||
|
});
|
||||||
|
|
||||||
|
let editor = cx.new(|cx| {
|
||||||
|
Editor::new(
|
||||||
|
editor::EditorMode::AutoHeight { max_lines: 4 },
|
||||||
|
buffer,
|
||||||
|
None,
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
self.feedback_comments_editor = Some(editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
cx.notify();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_submit_comments(
|
||||||
|
&mut self,
|
||||||
|
_: &ClickEvent,
|
||||||
|
_window: &mut Window,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) {
|
||||||
|
if let Some(editor) = self.feedback_comments_editor.clone() {
|
||||||
|
let comments = editor.read(cx).text(cx);
|
||||||
|
|
||||||
|
// Submit negative feedback
|
||||||
|
let report = self.thread.update(cx, |thread, cx| {
|
||||||
|
thread.report_feedback(ThreadFeedback::Negative, cx)
|
||||||
|
});
|
||||||
|
|
||||||
|
if !comments.is_empty() {
|
||||||
|
let thread_id = self.thread.read(cx).id().clone();
|
||||||
|
let comments_value = String::from(comments.as_str());
|
||||||
|
|
||||||
|
// Log comments as a separate telemetry event
|
||||||
|
telemetry::event!(
|
||||||
|
"Assistant Thread Feedback Comments",
|
||||||
|
thread_id,
|
||||||
|
comments = comments_value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.showing_feedback_comments = false;
|
||||||
|
self.feedback_comments_editor = None;
|
||||||
|
|
||||||
|
let this = cx.entity().downgrade();
|
||||||
|
cx.spawn(async move |_, cx| {
|
||||||
|
report.await?;
|
||||||
|
this.update(cx, |_this, cx| cx.notify())
|
||||||
|
})
|
||||||
|
.detach_and_log_err(cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_cancel_comments(
|
||||||
|
&mut self,
|
||||||
|
_: &ClickEvent,
|
||||||
|
_window: &mut Window,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) {
|
||||||
|
self.showing_feedback_comments = false;
|
||||||
|
self.feedback_comments_editor = None;
|
||||||
|
cx.notify();
|
||||||
|
}
|
||||||
|
|
||||||
fn render_message(&self, ix: usize, window: &mut Window, cx: &mut Context<Self>) -> AnyElement {
|
fn render_message(&self, ix: usize, window: &mut Window, cx: &mut Context<Self>) -> AnyElement {
|
||||||
let message_id = self.messages[ix];
|
let message_id = self.messages[ix];
|
||||||
|
@ -1318,7 +1403,53 @@ impl ActiveThread {
|
||||||
.child(styled_message)
|
.child(styled_message)
|
||||||
.when(
|
.when(
|
||||||
show_feedback && !self.thread.read(cx).is_generating(),
|
show_feedback && !self.thread.read(cx).is_generating(),
|
||||||
|parent| parent.child(feedback_items),
|
|parent| {
|
||||||
|
parent
|
||||||
|
.child(feedback_items)
|
||||||
|
.when(self.showing_feedback_comments, |parent| {
|
||||||
|
parent.child(
|
||||||
|
v_flex()
|
||||||
|
.gap_1()
|
||||||
|
.px_4()
|
||||||
|
.child(
|
||||||
|
Label::new(
|
||||||
|
"Please share your feedback to help us improve:",
|
||||||
|
)
|
||||||
|
.size(LabelSize::Small),
|
||||||
|
)
|
||||||
|
.child(
|
||||||
|
div()
|
||||||
|
.p_2()
|
||||||
|
.rounded_md()
|
||||||
|
.border_1()
|
||||||
|
.border_color(cx.theme().colors().border)
|
||||||
|
.bg(cx.theme().colors().editor_background)
|
||||||
|
.child(
|
||||||
|
self.feedback_comments_editor
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.clone(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.child(
|
||||||
|
h_flex()
|
||||||
|
.gap_1()
|
||||||
|
.justify_end()
|
||||||
|
.pb_2()
|
||||||
|
.child(
|
||||||
|
Button::new("cancel-comments", "Cancel").on_click(
|
||||||
|
cx.listener(Self::handle_cancel_comments),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.child(
|
||||||
|
Button::new("submit-comments", "Submit").on_click(
|
||||||
|
cx.listener(Self::handle_submit_comments),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
},
|
||||||
)
|
)
|
||||||
.into_any()
|
.into_any()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue