feedback.rs

  1use gpui::{actions, App, ClipboardItem, PromptLevel};
  2use system_specs::SystemSpecs;
  3use util::ResultExt;
  4use workspace::Workspace;
  5
  6pub mod feedback_modal;
  7
  8mod system_specs;
  9
 10actions!(
 11    zed,
 12    [
 13        CopySystemSpecsIntoClipboard,
 14        FileBugReport,
 15        RequestFeature,
 16        OpenZedRepo
 17    ]
 18);
 19
 20const fn zed_repo_url() -> &'static str {
 21    "https://github.com/zed-industries/zed"
 22}
 23
 24fn request_feature_url(specs: &SystemSpecs) -> String {
 25    format!(
 26        concat!(
 27            "https://github.com/zed-industries/zed/issues/new",
 28            "?labels=admin+read%2Ctriage%2Cenhancement",
 29            "&template=0_feature_request.yml",
 30            "&environment={}"
 31        ),
 32        urlencoding::encode(&specs.to_string())
 33    )
 34}
 35
 36fn file_bug_report_url(specs: &SystemSpecs) -> String {
 37    format!(
 38        concat!(
 39            "https://github.com/zed-industries/zed/issues/new",
 40            "?labels=admin+read%2Ctriage%2Cbug",
 41            "&template=1_bug_report.yml",
 42            "&environment={}"
 43        ),
 44        urlencoding::encode(&specs.to_string())
 45    )
 46}
 47
 48pub fn init(cx: &mut App) {
 49    cx.observe_new(|workspace: &mut Workspace, window, cx| {
 50        let Some(window) = window else {
 51            return;
 52        };
 53        feedback_modal::FeedbackModal::register(workspace, window, cx);
 54        workspace
 55            .register_action(|_, _: &CopySystemSpecsIntoClipboard, window, cx| {
 56                let specs = SystemSpecs::new(window, cx);
 57
 58                cx.spawn_in(window, |_, mut cx| async move {
 59                    let specs = specs.await.to_string();
 60
 61                    cx.update(|_, cx| {
 62                        cx.write_to_clipboard(ClipboardItem::new_string(specs.clone()))
 63                    })
 64                    .log_err();
 65
 66                    cx.prompt(
 67                        PromptLevel::Info,
 68                        "Copied into clipboard",
 69                        Some(&specs),
 70                        &["OK"],
 71                    )
 72                    .await
 73                })
 74                .detach();
 75            })
 76            .register_action(|_, _: &RequestFeature, window, cx| {
 77                let specs = SystemSpecs::new(window, cx);
 78                cx.spawn_in(window, |_, mut cx| async move {
 79                    let specs = specs.await;
 80                    cx.update(|_, cx| {
 81                        cx.open_url(&request_feature_url(&specs));
 82                    })
 83                    .log_err();
 84                })
 85                .detach();
 86            })
 87            .register_action(move |_, _: &FileBugReport, window, cx| {
 88                let specs = SystemSpecs::new(window, cx);
 89                cx.spawn_in(window, |_, mut cx| async move {
 90                    let specs = specs.await;
 91                    cx.update(|_, cx| {
 92                        cx.open_url(&file_bug_report_url(&specs));
 93                    })
 94                    .log_err();
 95                })
 96                .detach();
 97            })
 98            .register_action(move |_, _: &OpenZedRepo, _, cx| {
 99                cx.open_url(zed_repo_url());
100            });
101    })
102    .detach();
103}