diff --git a/crates/extensions_ui/src/components/feature_upsell.rs b/crates/extensions_ui/src/components/feature_upsell.rs index 38ee867b66..883174db41 100644 --- a/crates/extensions_ui/src/components/feature_upsell.rs +++ b/crates/extensions_ui/src/components/feature_upsell.rs @@ -1,3 +1,6 @@ +use std::sync::Arc; + +use client::telemetry::Telemetry; use gpui::{AnyElement, Div, StyleRefinement}; use smallvec::SmallVec; use ui::{prelude::*, ButtonLike}; @@ -5,15 +8,17 @@ use ui::{prelude::*, ButtonLike}; #[derive(IntoElement)] pub struct FeatureUpsell { base: Div, + telemetry: Arc, text: SharedString, docs_url: Option, children: SmallVec<[AnyElement; 2]>, } impl FeatureUpsell { - pub fn new(text: impl Into) -> Self { + pub fn new(telemetry: Arc, text: impl Into) -> Self { Self { base: h_flex(), + telemetry, text: text.into(), docs_url: None, children: SmallVec::new(), @@ -62,8 +67,14 @@ impl RenderOnce for FeatureUpsell { .child(Icon::new(IconName::ArrowUpRight)), ) .on_click({ + let telemetry = self.telemetry.clone(); let docs_url = docs_url.clone(); - move |_event, cx| cx.open_url(&docs_url) + move |_event, cx| { + telemetry.report_app_event(format!( + "feature upsell: viewed docs ({docs_url})" + )); + cx.open_url(&docs_url) + } }), ) }, diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs index 5aa8855a0d..782b9d98b7 100644 --- a/crates/extensions_ui/src/extensions_ui.rs +++ b/crates/extensions_ui/src/extensions_ui.rs @@ -939,12 +939,14 @@ impl ExtensionsPage { let upsells_count = self.upsells.len(); v_flex().children(self.upsells.iter().enumerate().map(|(ix, feature)| { + let telemetry = self.telemetry.clone(); let upsell = match feature { Feature::Git => FeatureUpsell::new( + telemetry, "Zed comes with basic Git support. More Git features are coming in the future.", ) .docs_url("https://zed.dev/docs/git"), - Feature::Vim => FeatureUpsell::new("Vim support is built-in to Zed!") + Feature::Vim => FeatureUpsell::new(telemetry, "Vim support is built-in to Zed!") .docs_url("https://zed.dev/docs/vim") .child(CheckboxWithLabel::new( "enable-vim", @@ -956,7 +958,7 @@ impl ExtensionsPage { }, cx.listener(move |this, selection, cx| { this.telemetry - .report_app_event("extensions: toggle vim".to_string()); + .report_app_event("feature upsell: toggle vim".to_string()); this.update_settings::( selection, cx, @@ -964,14 +966,22 @@ impl ExtensionsPage { ); }), )), - Feature::LanguageC => FeatureUpsell::new("C support is built-in to Zed!") - .docs_url("https://zed.dev/docs/languages/c"), - Feature::LanguageCpp => FeatureUpsell::new("C++ support is built-in to Zed!") - .docs_url("https://zed.dev/docs/languages/cpp"), - Feature::LanguagePython => FeatureUpsell::new("Python support is built-in to Zed!") - .docs_url("https://zed.dev/docs/languages/python"), - Feature::LanguageRust => FeatureUpsell::new("Rust support is built-in to Zed!") - .docs_url("https://zed.dev/docs/languages/rust"), + Feature::LanguageC => { + FeatureUpsell::new(telemetry, "C support is built-in to Zed!") + .docs_url("https://zed.dev/docs/languages/c") + } + Feature::LanguageCpp => { + FeatureUpsell::new(telemetry, "C++ support is built-in to Zed!") + .docs_url("https://zed.dev/docs/languages/cpp") + } + Feature::LanguagePython => { + FeatureUpsell::new(telemetry, "Python support is built-in to Zed!") + .docs_url("https://zed.dev/docs/languages/python") + } + Feature::LanguageRust => { + FeatureUpsell::new(telemetry, "Rust support is built-in to Zed!") + .docs_url("https://zed.dev/docs/languages/rust") + } }; upsell.when(ix < upsells_count, |upsell| upsell.border_b_1())