assistant2: Only show thread context in picker when we have a `ThreadStore` (#23501)

Marshall Bowers created

This PR fixes an issue with the context picker where it would show
thread context as an option even if there was no `ThreadStore`
available.

Release Notes:

- N/A

Change summary

crates/assistant2/src/context.rs        |  9 --------
crates/assistant2/src/context_picker.rs | 29 ++++++++++++++++----------
2 files changed, 18 insertions(+), 20 deletions(-)

Detailed changes

crates/assistant2/src/context.rs 🔗

@@ -43,15 +43,6 @@ pub enum ContextKind {
 }
 
 impl ContextKind {
-    pub fn all() -> &'static [ContextKind] {
-        &[
-            ContextKind::File,
-            ContextKind::Directory,
-            ContextKind::FetchedUrl,
-            ContextKind::Thread,
-        ]
-    }
-
     pub fn label(&self) -> &'static str {
         match self {
             ContextKind::File => "File",

crates/assistant2/src/context_picker.rs 🔗

@@ -77,16 +77,6 @@ impl ContextPicker {
         let context_picker = cx.view().clone();
 
         let menu = ContextMenu::build(cx, move |menu, cx| {
-            let kind_entry = |kind: &'static ContextKind| {
-                let context_picker = context_picker.clone();
-
-                ContextMenuEntry::new(kind.label())
-                    .icon(kind.icon())
-                    .handler(move |cx| {
-                        context_picker.update(cx, |this, cx| this.select_kind(*kind, cx))
-                    })
-            };
-
             let recent = self.recent_entries(cx);
             let has_recent = !recent.is_empty();
             let recent_entries = recent
@@ -94,6 +84,15 @@ impl ContextPicker {
                 .enumerate()
                 .map(|(ix, entry)| self.recent_menu_item(context_picker.clone(), ix, entry));
 
+            let mut context_kinds = vec![
+                ContextKind::File,
+                ContextKind::Directory,
+                ContextKind::FetchedUrl,
+            ];
+            if self.thread_store.is_some() {
+                context_kinds.push(ContextKind::Thread);
+            }
+
             let menu = menu
                 .when(has_recent, |menu| {
                     menu.custom_row(|_| {
@@ -109,7 +108,15 @@ impl ContextPicker {
                 })
                 .extend(recent_entries)
                 .when(has_recent, |menu| menu.separator())
-                .extend(ContextKind::all().into_iter().map(kind_entry));
+                .extend(context_kinds.into_iter().map(|kind| {
+                    let context_picker = context_picker.clone();
+
+                    ContextMenuEntry::new(kind.label())
+                        .icon(kind.icon())
+                        .handler(move |cx| {
+                            context_picker.update(cx, |this, cx| this.select_kind(kind, cx))
+                        })
+                }));
 
             match self.confirm_behavior {
                 ConfirmBehavior::KeepOpen => menu.keep_open_on_confirm(),