feedback.rs

 1use std::sync::Arc;
 2
 3pub mod feedback_editor;
 4mod system_specs;
 5use gpui::{actions, impl_actions, ClipboardItem, MutableAppContext, PromptLevel, ViewContext};
 6use serde::Deserialize;
 7use system_specs::SystemSpecs;
 8use workspace::{AppState, Workspace};
 9
10#[derive(Deserialize, Clone, PartialEq)]
11pub struct OpenBrowser {
12    pub url: Arc<str>,
13}
14
15impl_actions!(zed, [OpenBrowser]);
16
17actions!(
18    zed,
19    [CopySystemSpecsIntoClipboard, FileBugReport, RequestFeature]
20);
21
22pub fn init(app_state: Arc<AppState>, cx: &mut MutableAppContext) {
23    let system_specs = SystemSpecs::new(&cx);
24    let system_specs_text = system_specs.to_string();
25
26    feedback_editor::init(system_specs, app_state, cx);
27
28    cx.add_global_action(move |action: &OpenBrowser, cx| cx.platform().open_url(&action.url));
29
30    let url = format!(
31        "https://github.com/zed-industries/community/issues/new?assignees=&labels=defect%2Ctriage&template=2_bug_report.yml&environment={}", 
32        urlencoding::encode(&system_specs_text)
33    );
34
35    cx.add_action(
36        move |_: &mut Workspace,
37              _: &CopySystemSpecsIntoClipboard,
38              cx: &mut ViewContext<Workspace>| {
39            cx.prompt(
40                PromptLevel::Info,
41                &format!("Copied into clipboard:\n\n{system_specs_text}"),
42                &["OK"],
43            );
44            let item = ClipboardItem::new(system_specs_text.clone());
45            cx.write_to_clipboard(item);
46        },
47    );
48
49    cx.add_action(
50        |_: &mut Workspace, _: &RequestFeature, cx: &mut ViewContext<Workspace>| {
51            let url = "https://github.com/zed-industries/community/issues/new?assignees=&labels=enhancement%2Ctriage&template=0_feature_request.yml";
52            cx.dispatch_action(OpenBrowser {
53                url: url.into(),
54            });
55        },
56    );
57
58    cx.add_action(
59        move |_: &mut Workspace, _: &FileBugReport, cx: &mut ViewContext<Workspace>| {
60            cx.dispatch_action(OpenBrowser {
61                url: url.clone().into(),
62            });
63        },
64    );
65}