diff --git a/crates/edit_prediction_button/src/edit_prediction_button.rs b/crates/edit_prediction_button/src/edit_prediction_button.rs index a0bbe18b4bcaaf433b15db333b3e5a7eb8dfb4d0..685d408205863e5ad110a5e57891c0695f998cfb 100644 --- a/crates/edit_prediction_button/src/edit_prediction_button.rs +++ b/crates/edit_prediction_button/src/edit_prediction_button.rs @@ -43,7 +43,8 @@ actions!( ] ); -const COPILOT_SETTINGS_URL: &str = "https://github.com/settings/copilot"; +const COPILOT_SETTINGS_PATH: &str = "/settings/copilot"; +const COPILOT_SETTINGS_URL: &str = concat!("https://github.com", "/settings/copilot"); const PRIVACY_DOCS: &str = "https://zed.dev/docs/ai/privacy-and-security"; struct CopilotErrorToast; @@ -836,6 +837,16 @@ impl EditPredictionButton { window: &mut Window, cx: &mut Context, ) -> Entity { + let all_language_settings = all_language_settings(None, cx); + let copilot_config = copilot::copilot_chat::CopilotChatConfiguration { + enterprise_uri: all_language_settings + .edit_predictions + .copilot + .enterprise_uri + .clone(), + }; + let settings_url = copilot_settings_url(copilot_config.enterprise_uri.as_deref()); + ContextMenu::build(window, cx, |menu, window, cx| { let menu = self.build_language_settings_menu(menu, window, cx); let menu = @@ -844,10 +855,7 @@ impl EditPredictionButton { menu.separator() .link( "Go to Copilot Settings", - OpenBrowser { - url: COPILOT_SETTINGS_URL.to_string(), - } - .boxed_clone(), + OpenBrowser { url: settings_url }.boxed_clone(), ) .action("Sign Out", copilot::SignOut.boxed_clone()) }) @@ -1176,3 +1184,99 @@ fn toggle_edit_prediction_mode(fs: Arc, mode: EditPredictionsMode, cx: & }); } } + +fn copilot_settings_url(enterprise_uri: Option<&str>) -> String { + match enterprise_uri { + Some(uri) => { + format!("{}{}", uri.trim_end_matches('/'), COPILOT_SETTINGS_PATH) + } + None => COPILOT_SETTINGS_URL.to_string(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use gpui::TestAppContext; + + #[gpui::test] + async fn test_copilot_settings_url_with_enterprise_uri(cx: &mut TestAppContext) { + cx.update(|cx| { + let settings_store = SettingsStore::test(cx); + cx.set_global(settings_store); + }); + + cx.update_global(|settings_store: &mut SettingsStore, cx| { + settings_store + .set_user_settings( + r#"{"edit_predictions":{"copilot":{"enterprise_uri":"https://my-company.ghe.com"}}}"#, + cx, + ) + .unwrap(); + }); + + let url = cx.update(|cx| { + let all_language_settings = all_language_settings(None, cx); + copilot_settings_url( + all_language_settings + .edit_predictions + .copilot + .enterprise_uri + .as_deref(), + ) + }); + + assert_eq!(url, "https://my-company.ghe.com/settings/copilot"); + } + + #[gpui::test] + async fn test_copilot_settings_url_with_enterprise_uri_trailing_slash(cx: &mut TestAppContext) { + cx.update(|cx| { + let settings_store = SettingsStore::test(cx); + cx.set_global(settings_store); + }); + + cx.update_global(|settings_store: &mut SettingsStore, cx| { + settings_store + .set_user_settings( + r#"{"edit_predictions":{"copilot":{"enterprise_uri":"https://my-company.ghe.com/"}}}"#, + cx, + ) + .unwrap(); + }); + + let url = cx.update(|cx| { + let all_language_settings = all_language_settings(None, cx); + copilot_settings_url( + all_language_settings + .edit_predictions + .copilot + .enterprise_uri + .as_deref(), + ) + }); + + assert_eq!(url, "https://my-company.ghe.com/settings/copilot"); + } + + #[gpui::test] + async fn test_copilot_settings_url_without_enterprise_uri(cx: &mut TestAppContext) { + cx.update(|cx| { + let settings_store = SettingsStore::test(cx); + cx.set_global(settings_store); + }); + + let url = cx.update(|cx| { + let all_language_settings = all_language_settings(None, cx); + copilot_settings_url( + all_language_settings + .edit_predictions + .copilot + .enterprise_uri + .as_deref(), + ) + }); + + assert_eq!(url, "https://github.com/settings/copilot"); + } +}