1use std::sync::Arc;
2
3pub mod feedback_editor;
4mod system_specs;
5use gpui::{actions, impl_actions, ClipboardItem, 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 gpui::MutableAppContext) {
23 feedback_editor::init(app_state, cx);
24
25 cx.add_global_action(move |action: &OpenBrowser, cx| cx.platform().open_url(&action.url));
26
27 cx.add_action(
28 |_: &mut Workspace, _: &CopySystemSpecsIntoClipboard, cx: &mut ViewContext<Workspace>| {
29 let system_specs = SystemSpecs::new(cx).to_string();
30 let item = ClipboardItem::new(system_specs.clone());
31 cx.prompt(
32 gpui::PromptLevel::Info,
33 &format!("Copied into clipboard:\n\n{system_specs}"),
34 &["OK"],
35 );
36 cx.write_to_clipboard(item);
37 },
38 );
39
40 cx.add_action(
41 |_: &mut Workspace, _: &RequestFeature, cx: &mut ViewContext<Workspace>| {
42 let url = "https://github.com/zed-industries/feedback/issues/new?assignees=&labels=enhancement%2Ctriage&template=0_feature_request.yml";
43 cx.dispatch_action(OpenBrowser {
44 url: url.into(),
45 });
46 },
47 );
48
49 cx.add_action(
50 |_: &mut Workspace, _: &FileBugReport, cx: &mut ViewContext<Workspace>| {
51 let system_specs_text = SystemSpecs::new(cx).to_string();
52 let url = format!(
53 "https://github.com/zed-industries/feedback/issues/new?assignees=&labels=defect%2Ctriage&template=2_bug_report.yml&environment={}",
54 urlencoding::encode(&system_specs_text)
55 );
56 cx.dispatch_action(OpenBrowser {
57 url: url.into(),
58 });
59 },
60 );
61}