@@ -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<Self>,
) -> Entity<ContextMenu> {
+ 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<dyn Fs>, 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");
+ }
+}