Use the MessageNotification
component for the release notes toast (#25013)
Closes https://github.com/zed-industries/zed/issues/24981 Release Notes: - N/A --------- Co-authored-by: smit <0xtimsb@gmail.com>
This commit is contained in:
parent
aca31cfb8d
commit
510260a10e
5 changed files with 20 additions and 81 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1142,7 +1142,6 @@ dependencies = [
|
||||||
"gpui",
|
"gpui",
|
||||||
"http_client",
|
"http_client",
|
||||||
"markdown_preview",
|
"markdown_preview",
|
||||||
"menu",
|
|
||||||
"release_channel",
|
"release_channel",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
|
|
@ -19,7 +19,6 @@ editor.workspace = true
|
||||||
gpui.workspace = true
|
gpui.workspace = true
|
||||||
http_client.workspace = true
|
http_client.workspace = true
|
||||||
markdown_preview.workspace = true
|
markdown_preview.workspace = true
|
||||||
menu.workspace = true
|
|
||||||
release_channel.workspace = true
|
release_channel.workspace = true
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
serde_json.workspace = true
|
serde_json.workspace = true
|
||||||
|
|
|
@ -1,19 +1,17 @@
|
||||||
mod update_notification;
|
|
||||||
|
|
||||||
use auto_update::AutoUpdater;
|
use auto_update::AutoUpdater;
|
||||||
|
use client::proto::UpdateNotification;
|
||||||
use editor::{Editor, MultiBuffer};
|
use editor::{Editor, MultiBuffer};
|
||||||
use gpui::{actions, prelude::*, App, Context, Entity, SharedString, Window};
|
use gpui::{actions, prelude::*, App, Context, DismissEvent, Entity, SharedString, Window};
|
||||||
use http_client::HttpClient;
|
use http_client::HttpClient;
|
||||||
use markdown_preview::markdown_preview_view::{MarkdownPreviewMode, MarkdownPreviewView};
|
use markdown_preview::markdown_preview_view::{MarkdownPreviewMode, MarkdownPreviewView};
|
||||||
use release_channel::{AppVersion, ReleaseChannel};
|
use release_channel::{AppVersion, ReleaseChannel};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use smol::io::AsyncReadExt;
|
use smol::io::AsyncReadExt;
|
||||||
use util::ResultExt as _;
|
use util::ResultExt as _;
|
||||||
|
use workspace::notifications::simple_message_notification::MessageNotification;
|
||||||
use workspace::notifications::{show_app_notification, NotificationId};
|
use workspace::notifications::{show_app_notification, NotificationId};
|
||||||
use workspace::Workspace;
|
use workspace::Workspace;
|
||||||
|
|
||||||
use crate::update_notification::UpdateNotification;
|
|
||||||
|
|
||||||
actions!(auto_update, [ViewReleaseNotesLocally]);
|
actions!(auto_update, [ViewReleaseNotesLocally]);
|
||||||
|
|
||||||
pub fn init(cx: &mut App) {
|
pub fn init(cx: &mut App) {
|
||||||
|
@ -131,19 +129,32 @@ pub fn notify_if_app_was_updated(cx: &mut App) {
|
||||||
let Some(updater) = AutoUpdater::get(cx) else {
|
let Some(updater) = AutoUpdater::get(cx) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let version = updater.read(cx).current_version();
|
|
||||||
let should_show_notification = updater.read(cx).should_show_update_notification(cx);
|
let should_show_notification = updater.read(cx).should_show_update_notification(cx);
|
||||||
|
|
||||||
cx.spawn(|cx| async move {
|
cx.spawn(|cx| async move {
|
||||||
let should_show_notification = should_show_notification.await?;
|
let should_show_notification = should_show_notification.await?;
|
||||||
if should_show_notification {
|
if should_show_notification {
|
||||||
cx.update(|cx| {
|
cx.update(|cx| {
|
||||||
|
let version = updater.read(cx).current_version();
|
||||||
|
let app_name = ReleaseChannel::global(cx).display_name();
|
||||||
show_app_notification(
|
show_app_notification(
|
||||||
NotificationId::unique::<UpdateNotification>(),
|
NotificationId::unique::<UpdateNotification>(),
|
||||||
cx,
|
cx,
|
||||||
move |cx| {
|
move |cx| {
|
||||||
let workspace_handle = cx.entity().downgrade();
|
let workspace_handle = cx.entity().downgrade();
|
||||||
cx.new(|_| UpdateNotification::new(version, workspace_handle))
|
cx.new(|_cx| {
|
||||||
|
MessageNotification::new(format!("Updated to {app_name} {}", version))
|
||||||
|
.primary_message("View Release Notes")
|
||||||
|
.primary_on_click(move |window, cx| {
|
||||||
|
if let Some(workspace) = workspace_handle.upgrade() {
|
||||||
|
workspace.update(cx, |workspace, cx| {
|
||||||
|
crate::view_release_notes_locally(
|
||||||
|
workspace, window, cx,
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
cx.emit(DismissEvent);
|
||||||
|
})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
updater.update(cx, |updater, cx| {
|
updater.update(cx, |updater, cx| {
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
use gpui::{
|
|
||||||
div, Context, DismissEvent, EventEmitter, InteractiveElement, IntoElement, ParentElement,
|
|
||||||
Render, SemanticVersion, StatefulInteractiveElement, Styled, WeakEntity, Window,
|
|
||||||
};
|
|
||||||
use menu::Cancel;
|
|
||||||
use release_channel::ReleaseChannel;
|
|
||||||
use util::ResultExt;
|
|
||||||
use workspace::{
|
|
||||||
ui::{h_flex, v_flex, Icon, IconName, Label, StyledExt},
|
|
||||||
Workspace,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub struct UpdateNotification {
|
|
||||||
version: SemanticVersion,
|
|
||||||
workspace: WeakEntity<Workspace>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EventEmitter<DismissEvent> for UpdateNotification {}
|
|
||||||
|
|
||||||
impl Render for UpdateNotification {
|
|
||||||
fn render(&mut self, _: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
|
||||||
let app_name = ReleaseChannel::global(cx).display_name();
|
|
||||||
|
|
||||||
v_flex()
|
|
||||||
.on_action(cx.listener(UpdateNotification::dismiss))
|
|
||||||
.elevation_3(cx)
|
|
||||||
.p_4()
|
|
||||||
.child(
|
|
||||||
h_flex()
|
|
||||||
.justify_between()
|
|
||||||
.child(Label::new(format!(
|
|
||||||
"Updated to {app_name} {}",
|
|
||||||
self.version
|
|
||||||
)))
|
|
||||||
.child(
|
|
||||||
div()
|
|
||||||
.id("cancel")
|
|
||||||
.child(Icon::new(IconName::Close))
|
|
||||||
.cursor_pointer()
|
|
||||||
.on_click(cx.listener(|this, _, window, cx| {
|
|
||||||
this.dismiss(&menu::Cancel, window, cx)
|
|
||||||
})),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.child(
|
|
||||||
div()
|
|
||||||
.id("notes")
|
|
||||||
.child(Label::new("View the release notes"))
|
|
||||||
.cursor_pointer()
|
|
||||||
.on_click(cx.listener(|this, _, window, cx| {
|
|
||||||
this.workspace
|
|
||||||
.update(cx, |workspace, cx| {
|
|
||||||
crate::view_release_notes_locally(workspace, window, cx);
|
|
||||||
})
|
|
||||||
.log_err();
|
|
||||||
this.dismiss(&menu::Cancel, window, cx)
|
|
||||||
})),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl UpdateNotification {
|
|
||||||
pub fn new(version: SemanticVersion, workspace: WeakEntity<Workspace>) -> Self {
|
|
||||||
Self { version, workspace }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn dismiss(&mut self, _: &Cancel, _: &mut Window, cx: &mut Context<Self>) {
|
|
||||||
cx.emit(DismissEvent);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -529,7 +529,7 @@ pub mod simple_message_notification {
|
||||||
v_flex()
|
v_flex()
|
||||||
.occlude()
|
.occlude()
|
||||||
.p_3()
|
.p_3()
|
||||||
.gap_3()
|
.gap_2()
|
||||||
.elevation_3(cx)
|
.elevation_3(cx)
|
||||||
.child(
|
.child(
|
||||||
h_flex()
|
h_flex()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue