// TODO add logging in // use crate::{request::PromptUserDeviceFlow, Copilot, Status}; // use gpui::{ // elements::*, // geometry::rect::RectF, // platform::{WindowBounds, WindowKind, WindowOptions}, // AnyElement, AnyViewHandle, AppContext, ClipboardItem, Element, Entity, View, ViewContext, // WindowHandle, // }; // use theme::ui::modal; // #[derive(PartialEq, Eq, Debug, Clone)] // struct CopyUserCode; // #[derive(PartialEq, Eq, Debug, Clone)] // struct OpenGithub; // const COPILOT_SIGN_UP_URL: &'static str = "https://github.com/features/copilot"; // pub fn init(cx: &mut AppContext) { // if let Some(copilot) = Copilot::global(cx) { // let mut verification_window: Option> = None; // cx.observe(&copilot, move |copilot, cx| { // let status = copilot.read(cx).status(); // match &status { // crate::Status::SigningIn { prompt } => { // if let Some(window) = verification_window.as_mut() { // let updated = window // .root(cx) // .map(|root| { // root.update(cx, |verification, cx| { // verification.set_status(status.clone(), cx); // cx.activate_window(); // }) // }) // .is_some(); // if !updated { // verification_window = Some(create_copilot_auth_window(cx, &status)); // } // } else if let Some(_prompt) = prompt { // verification_window = Some(create_copilot_auth_window(cx, &status)); // } // } // Status::Authorized | Status::Unauthorized => { // if let Some(window) = verification_window.as_ref() { // if let Some(verification) = window.root(cx) { // verification.update(cx, |verification, cx| { // verification.set_status(status, cx); // cx.platform().activate(true); // cx.activate_window(); // }); // } // } // } // _ => { // if let Some(code_verification) = verification_window.take() { // code_verification.update(cx, |cx| cx.remove_window()); // } // } // } // }) // .detach(); // } // } // fn create_copilot_auth_window( // cx: &mut AppContext, // status: &Status, // ) -> WindowHandle { // let window_size = theme::current(cx).copilot.modal.dimensions(); // let window_options = WindowOptions { // bounds: WindowBounds::Fixed(RectF::new(Default::default(), window_size)), // titlebar: None, // center: true, // focus: true, // show: true, // kind: WindowKind::Normal, // is_movable: true, // screen: None, // }; // cx.add_window(window_options, |_cx| { // CopilotCodeVerification::new(status.clone()) // }) // } // pub struct CopilotCodeVerification { // status: Status, // connect_clicked: bool, // } // impl CopilotCodeVerification { // pub fn new(status: Status) -> Self { // Self { // status, // connect_clicked: false, // } // } // pub fn set_status(&mut self, status: Status, cx: &mut ViewContext) { // self.status = status; // cx.notify(); // } // fn render_device_code( // data: &PromptUserDeviceFlow, // style: &theme::Copilot, // cx: &mut ViewContext, // ) -> impl IntoAnyElement { // let copied = cx // .read_from_clipboard() // .map(|item| item.text() == &data.user_code) // .unwrap_or(false); // let device_code_style = &style.auth.prompting.device_code; // MouseEventHandler::new::(0, cx, |state, _cx| { // Flex::row() // .with_child( // Label::new(data.user_code.clone(), device_code_style.text.clone()) // .aligned() // .contained() // .with_style(device_code_style.left_container) // .constrained() // .with_width(device_code_style.left), // ) // .with_child( // Label::new( // if copied { "Copied!" } else { "Copy" }, // device_code_style.cta.style_for(state).text.clone(), // ) // .aligned() // .contained() // .with_style(*device_code_style.right_container.style_for(state)) // .constrained() // .with_width(device_code_style.right), // ) // .contained() // .with_style(device_code_style.cta.style_for(state).container) // }) // .on_click(gpui::platform::MouseButton::Left, { // let user_code = data.user_code.clone(); // move |_, _, cx| { // cx.platform() // .write_to_clipboard(ClipboardItem::new(user_code.clone())); // cx.notify(); // } // }) // .with_cursor_style(gpui::platform::CursorStyle::PointingHand) // } // fn render_prompting_modal( // connect_clicked: bool, // data: &PromptUserDeviceFlow, // style: &theme::Copilot, // cx: &mut ViewContext, // ) -> AnyElement { // enum ConnectButton {} // Flex::column() // .with_child( // Flex::column() // .with_children([ // Label::new( // "Enable Copilot by connecting", // style.auth.prompting.subheading.text.clone(), // ) // .aligned(), // Label::new( // "your existing license.", // style.auth.prompting.subheading.text.clone(), // ) // .aligned(), // ]) // .align_children_center() // .contained() // .with_style(style.auth.prompting.subheading.container), // ) // .with_child(Self::render_device_code(data, &style, cx)) // .with_child( // Flex::column() // .with_children([ // Label::new( // "Paste this code into GitHub after", // style.auth.prompting.hint.text.clone(), // ) // .aligned(), // Label::new( // "clicking the button below.", // style.auth.prompting.hint.text.clone(), // ) // .aligned(), // ]) // .align_children_center() // .contained() // .with_style(style.auth.prompting.hint.container.clone()), // ) // .with_child(theme::ui::cta_button::( // if connect_clicked { // "Waiting for connection..." // } else { // "Connect to GitHub" // }, // style.auth.content_width, // &style.auth.cta_button, // cx, // { // let verification_uri = data.verification_uri.clone(); // move |_, verification, cx| { // cx.platform().open_url(&verification_uri); // verification.connect_clicked = true; // } // }, // )) // .align_children_center() // .into_any() // } // fn render_enabled_modal( // style: &theme::Copilot, // cx: &mut ViewContext, // ) -> AnyElement { // enum DoneButton {} // let enabled_style = &style.auth.authorized; // Flex::column() // .with_child( // Label::new("Copilot Enabled!", enabled_style.subheading.text.clone()) // .contained() // .with_style(enabled_style.subheading.container) // .aligned(), // ) // .with_child( // Flex::column() // .with_children([ // Label::new( // "You can update your settings or", // enabled_style.hint.text.clone(), // ) // .aligned(), // Label::new( // "sign out from the Copilot menu in", // enabled_style.hint.text.clone(), // ) // .aligned(), // Label::new("the status bar.", enabled_style.hint.text.clone()).aligned(), // ]) // .align_children_center() // .contained() // .with_style(enabled_style.hint.container), // ) // .with_child(theme::ui::cta_button::( // "Done", // style.auth.content_width, // &style.auth.cta_button, // cx, // |_, _, cx| cx.remove_window(), // )) // .align_children_center() // .into_any() // } // fn render_unauthorized_modal( // style: &theme::Copilot, // cx: &mut ViewContext, // ) -> AnyElement { // let unauthorized_style = &style.auth.not_authorized; // Flex::column() // .with_child( // Flex::column() // .with_children([ // Label::new( // "Enable Copilot by connecting", // unauthorized_style.subheading.text.clone(), // ) // .aligned(), // Label::new( // "your existing license.", // unauthorized_style.subheading.text.clone(), // ) // .aligned(), // ]) // .align_children_center() // .contained() // .with_style(unauthorized_style.subheading.container), // ) // .with_child( // Flex::column() // .with_children([ // Label::new( // "You must have an active copilot", // unauthorized_style.warning.text.clone(), // ) // .aligned(), // Label::new( // "license to use it in Zed.", // unauthorized_style.warning.text.clone(), // ) // .aligned(), // ]) // .align_children_center() // .contained() // .with_style(unauthorized_style.warning.container), // ) // .with_child(theme::ui::cta_button::( // "Subscribe on GitHub", // style.auth.content_width, // &style.auth.cta_button, // cx, // |_, _, cx| { // cx.remove_window(); // cx.platform().open_url(COPILOT_SIGN_UP_URL) // }, // )) // .align_children_center() // .into_any() // } // } // impl Entity for CopilotCodeVerification { // type Event = (); // } // impl View for CopilotCodeVerification { // fn ui_name() -> &'static str { // "CopilotCodeVerification" // } // fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { // cx.notify() // } // fn focus_out(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { // cx.notify() // } // fn render(&mut self, cx: &mut ViewContext) -> AnyElement { // enum ConnectModal {} // let style = theme::current(cx).clone(); // modal::( // "Connect Copilot to Zed", // &style.copilot.modal, // cx, // |cx| { // Flex::column() // .with_children([ // theme::ui::icon(&style.copilot.auth.header).into_any(), // match &self.status { // Status::SigningIn { // prompt: Some(prompt), // } => Self::render_prompting_modal( // self.connect_clicked, // &prompt, // &style.copilot, // cx, // ), // Status::Unauthorized => { // self.connect_clicked = false; // Self::render_unauthorized_modal(&style.copilot, cx) // } // Status::Authorized => { // self.connect_clicked = false; // Self::render_enabled_modal(&style.copilot, cx) // } // _ => Empty::new().into_any(), // }, // ]) // .align_children_center() // }, // ) // .into_any() // } // }