Close contacts popover when call ends

Julia and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/collab_ui/src/collab_titlebar_item.rs | 29 ++++++++++++++++++---
1 file changed, 24 insertions(+), 5 deletions(-)

Detailed changes

crates/collab_ui/src/collab_titlebar_item.rs 🔗

@@ -140,7 +140,7 @@ impl CollabTitlebarItem {
         let active_call = ActiveCall::global(cx);
         let mut subscriptions = Vec::new();
         subscriptions.push(cx.observe(workspace, |_, _, cx| cx.notify()));
-        subscriptions.push(cx.observe(&active_call, |_, _, cx| cx.notify()));
+        subscriptions.push(cx.observe(&active_call, |this, _, cx| this.active_call_changed(cx)));
         subscriptions.push(cx.observe_window_activation(|this, active, cx| {
             this.window_activation_changed(active, cx)
         }));
@@ -191,6 +191,13 @@ impl CollabTitlebarItem {
         }
     }
 
+    fn active_call_changed(&mut self, cx: &mut ViewContext<Self>) {
+        if ActiveCall::global(cx).read(cx).room().is_none() {
+            self.contacts_popover = None;
+        }
+        cx.notify();
+    }
+
     fn share_project(&mut self, _: &ShareProject, cx: &mut ViewContext<Self>) {
         if let Some(workspace) = self.workspace.upgrade(cx) {
             let active_call = ActiveCall::global(cx);
@@ -397,7 +404,11 @@ impl CollabTitlebarItem {
                 .boxed(),
             )
             .with_children(badge)
-            .with_children(self.contacts_popover_host(ContactsPopoverSide::Left, titlebar, cx))
+            .with_children(self.render_contacts_popover_host(
+                ContactsPopoverSide::Left,
+                titlebar,
+                cx,
+            ))
             .boxed()
     }
 
@@ -499,7 +510,11 @@ impl CollabTitlebarItem {
                 )
                 .boxed(),
             )
-            .with_children(self.contacts_popover_host(ContactsPopoverSide::Right, titlebar, cx))
+            .with_children(self.render_contacts_popover_host(
+                ContactsPopoverSide::Right,
+                titlebar,
+                cx,
+            ))
             .aligned()
             .contained()
             .with_margin_left(theme.workspace.titlebar.avatar_margin)
@@ -543,7 +558,11 @@ impl CollabTitlebarItem {
                 )
                 .boxed(),
             )
-            .with_children(self.contacts_popover_host(ContactsPopoverSide::Right, titlebar, cx))
+            .with_children(self.render_contacts_popover_host(
+                ContactsPopoverSide::Right,
+                titlebar,
+                cx,
+            ))
             .aligned()
             .contained()
             .with_margin_left(theme.workspace.titlebar.avatar_margin)
@@ -551,7 +570,7 @@ impl CollabTitlebarItem {
             .boxed()
     }
 
-    fn contacts_popover_host<'a>(
+    fn render_contacts_popover_host<'a>(
         &'a self,
         side: ContactsPopoverSide,
         theme: &'a theme::Titlebar,