Fix bug where copilot auth window will only be shown once

Mikayla Maki created

Change summary

crates/copilot/src/sign_in.rs | 52 ++++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 21 deletions(-)

Detailed changes

crates/copilot/src/sign_in.rs 🔗

@@ -23,28 +23,17 @@ pub fn init(cx: &mut MutableAppContext) {
 
         match &status {
             crate::Status::SigningIn { prompt } => {
-                if let Some(code_verification) = code_verification.as_ref() {
-                    code_verification.update(cx, |code_verification, cx| {
-                        code_verification.set_status(status, cx)
-                    });
-                    cx.activate_window(code_verification.window_id());
+                if let Some(code_verification_handle) = code_verification.as_mut() {
+                    if cx.has_window(code_verification_handle.window_id()) {
+                        code_verification_handle.update(cx, |code_verification_view, cx| {
+                            code_verification_view.set_status(status, cx)
+                        });
+                        cx.activate_window(code_verification_handle.window_id());
+                    } else {
+                        create_copilot_auth_window(cx, &status, &mut code_verification);
+                    }
                 } else if let Some(_prompt) = prompt {
-                    let window_size = cx.global::<Settings>().theme.copilot.modal.dimensions();
-                    let window_options = WindowOptions {
-                        bounds: gpui::WindowBounds::Fixed(RectF::new(
-                            Default::default(),
-                            window_size,
-                        )),
-                        titlebar: None,
-                        center: true,
-                        focus: true,
-                        kind: WindowKind::Normal,
-                        is_movable: true,
-                        screen: None,
-                    };
-                    let (_, view) =
-                        cx.add_window(window_options, |_cx| CopilotCodeVerification::new(status));
-                    code_verification = Some(view);
+                    create_copilot_auth_window(cx, &status, &mut code_verification);
                 }
             }
             Status::Authorized | Status::Unauthorized => {
@@ -67,6 +56,27 @@ pub fn init(cx: &mut MutableAppContext) {
     .detach();
 }
 
+fn create_copilot_auth_window(
+    cx: &mut MutableAppContext,
+    status: &Status,
+    code_verification: &mut Option<ViewHandle<CopilotCodeVerification>>,
+) {
+    let window_size = cx.global::<Settings>().theme.copilot.modal.dimensions();
+    let window_options = WindowOptions {
+        bounds: gpui::WindowBounds::Fixed(RectF::new(Default::default(), window_size)),
+        titlebar: None,
+        center: true,
+        focus: true,
+        kind: WindowKind::Normal,
+        is_movable: true,
+        screen: None,
+    };
+    let (_, view) = cx.add_window(window_options, |_cx| {
+        CopilotCodeVerification::new(status.clone())
+    });
+    *code_verification = Some(view);
+}
+
 pub struct CopilotCodeVerification {
     status: Status,
 }