feedback.rs

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