Scaffolding for update notification too (#3410)

Conrad Irwin created

Release Notes:

- N/A

Change summary

crates/auto_update2/src/auto_update.rs         |  11 +
crates/auto_update2/src/update_notification.rs | 102 ++++++-------------
2 files changed, 43 insertions(+), 70 deletions(-)

Detailed changes

crates/auto_update2/src/auto_update.rs 🔗

@@ -84,8 +84,8 @@ impl Settings for AutoUpdateSetting {
 pub fn init(http_client: Arc<dyn HttpClient>, server_url: String, cx: &mut AppContext) {
     AutoUpdateSetting::register(cx);
 
-    cx.observe_new_views(|wokrspace: &mut Workspace, _cx| {
-        wokrspace
+    cx.observe_new_views(|workspace: &mut Workspace, _cx| {
+        workspace
             .register_action(|_, action: &Check, cx| check(action, cx))
             .register_action(|_, _action: &CheckThatAutoUpdaterWorks, cx| {
                 let prompt = cx.prompt(gpui::PromptLevel::Info, "It does!", &["Ok"]);
@@ -94,6 +94,11 @@ pub fn init(http_client: Arc<dyn HttpClient>, server_url: String, cx: &mut AppCo
                 })
                 .detach();
             });
+
+        // @nate - code to trigger update notification on launch
+        // workspace.show_notification(0, _cx, |cx| {
+        //     cx.build_view(|_| UpdateNotification::new(SemanticVersion::from_str("1.1.1").unwrap()))
+        // });
     })
     .detach();
 
@@ -131,7 +136,7 @@ pub fn check(_: &Check, cx: &mut AppContext) {
     }
 }
 
-fn _view_release_notes(_: &ViewReleaseNotes, cx: &mut AppContext) {
+pub fn view_release_notes(_: &ViewReleaseNotes, cx: &mut AppContext) {
     if let Some(auto_updater) = AutoUpdater::get(cx) {
         let auto_updater = auto_updater.read(cx);
         let server_url = &auto_updater.server_url;

crates/auto_update2/src/update_notification.rs 🔗

@@ -1,10 +1,12 @@
 use gpui::{
-    div, DismissEvent, Div, EventEmitter, ParentElement, Render, SemanticVersion, ViewContext,
+    div, DismissEvent, Div, EventEmitter, InteractiveElement, ParentElement, Render,
+    SemanticVersion, StatefulInteractiveElement, Styled, ViewContext,
 };
-use menu::Cancel;
+use util::channel::ReleaseChannel;
+use workspace::ui::{h_stack, v_stack, Icon, IconElement, Label, StyledExt};
 
 pub struct UpdateNotification {
-    _version: SemanticVersion,
+    version: SemanticVersion,
 }
 
 impl EventEmitter<DismissEvent> for UpdateNotification {}
@@ -12,77 +14,43 @@ impl EventEmitter<DismissEvent> for UpdateNotification {}
 impl Render for UpdateNotification {
     type Element = Div;
 
-    fn render(&mut self, _cx: &mut gpui::ViewContext<Self>) -> Self::Element {
-        div().child("Updated zed!")
-        // let theme = theme::current(cx).clone();
-        // let theme = &theme.update_notification;
-
-        // let app_name = cx.global::<ReleaseChannel>().display_name();
-
-        // MouseEventHandler::new::<ViewReleaseNotes, _>(0, cx, |state, cx| {
-        //     Flex::column()
-        //         .with_child(
-        //             Flex::row()
-        //                 .with_child(
-        //                     Text::new(
-        //                         format!("Updated to {app_name} {}", self.version),
-        //                         theme.message.text.clone(),
-        //                     )
-        //                     .contained()
-        //                     .with_style(theme.message.container)
-        //                     .aligned()
-        //                     .top()
-        //                     .left()
-        //                     .flex(1., true),
-        //                 )
-        //                 .with_child(
-        //                     MouseEventHandler::new::<Cancel, _>(0, cx, |state, _| {
-        //                         let style = theme.dismiss_button.style_for(state);
-        //                         Svg::new("icons/x.svg")
-        //                             .with_color(style.color)
-        //                             .constrained()
-        //                             .with_width(style.icon_width)
-        //                             .aligned()
-        //                             .contained()
-        //                             .with_style(style.container)
-        //                             .constrained()
-        //                             .with_width(style.button_width)
-        //                             .with_height(style.button_width)
-        //                     })
-        //                     .with_padding(Padding::uniform(5.))
-        //                     .on_click(MouseButton::Left, move |_, this, cx| {
-        //                         this.dismiss(&Default::default(), cx)
-        //                     })
-        //                     .aligned()
-        //                     .constrained()
-        //                     .with_height(cx.font_cache().line_height(theme.message.text.font_size))
-        //                     .aligned()
-        //                     .top()
-        //                     .flex_float(),
-        //                 ),
-        //         )
-        //         .with_child({
-        //             let style = theme.action_message.style_for(state);
-        //             Text::new("View the release notes", style.text.clone())
-        //                 .contained()
-        //                 .with_style(style.container)
-        //         })
-        //         .contained()
-        // })
-        // .with_cursor_style(CursorStyle::PointingHand)
-        // .on_click(MouseButton::Left, |_, _, cx| {
-        //     crate::view_release_notes(&Default::default(), cx)
-        // })
-        // .into_any_named("update notification")
+    fn render(&mut self, cx: &mut gpui::ViewContext<Self>) -> Self::Element {
+        let app_name = cx.global::<ReleaseChannel>().display_name();
+
+        v_stack()
+            .elevation_3(cx)
+            .p_4()
+            .child(
+                h_stack()
+                    .justify_between()
+                    .child(Label::new(format!(
+                        "Updated to {app_name} {}",
+                        self.version
+                    )))
+                    .child(
+                        div()
+                            .id("cancel")
+                            .child(IconElement::new(Icon::Close))
+                            .cursor_pointer()
+                            .on_click(cx.listener(|this, _, cx| this.dismiss(cx))),
+                    ),
+            )
+            .child(
+                div()
+                    .id("notes")
+                    .child(Label::new("View the release notes"))
+                    .cursor_pointer()
+                    .on_click(|_, cx| crate::view_release_notes(&Default::default(), cx)),
+            )
     }
 }
 
 impl UpdateNotification {
     pub fn new(version: SemanticVersion) -> Self {
-        Self { _version: version }
+        Self { version }
     }
 
-    pub fn _dismiss(&mut self, _: &Cancel, cx: &mut ViewContext<Self>) {
+    pub fn dismiss(&mut self, cx: &mut ViewContext<Self>) {
         cx.emit(DismissEvent::Dismiss);
     }
 }