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}