@@ -2,18 +2,9 @@ use std::sync::Arc;
use crate::notifications::render_user_notification;
use client::{ContactEventKind, User, UserStore};
-use gpui::{
- elements::*, impl_internal_actions, AppContext, Entity, ModelHandle, View, ViewContext,
-};
+use gpui::{elements::*, Entity, ModelHandle, View, ViewContext};
use workspace::notifications::Notification;
-impl_internal_actions!(contact_notifications, [Dismiss, RespondToContactRequest]);
-
-pub fn init(cx: &mut AppContext) {
- cx.add_action(ContactNotification::dismiss);
- cx.add_action(ContactNotification::respond_to_contact_request);
-}
-
pub struct ContactNotification {
user_store: ModelHandle<UserStore>,
user: Arc<User>,
@@ -48,20 +39,18 @@ impl View for ContactNotification {
self.user.clone(),
"wants to add you as a contact",
Some("They won't be alerted if you decline."),
- Dismiss(self.user.id),
+ |notification, cx| notification.dismiss(cx),
vec![
(
"Decline",
- Box::new(RespondToContactRequest {
- user_id: self.user.id,
- accept: false,
+ Box::new(|notification, cx| {
+ notification.respond_to_contact_request(false, cx)
}),
),
(
"Accept",
- Box::new(RespondToContactRequest {
- user_id: self.user.id,
- accept: true,
+ Box::new(|notification, cx| {
+ notification.respond_to_contact_request(true, cx)
}),
),
],
@@ -71,7 +60,7 @@ impl View for ContactNotification {
self.user.clone(),
"accepted your contact request",
None,
- Dismiss(self.user.id),
+ |notification, cx| notification.dismiss(cx),
vec![],
cx,
),
@@ -113,7 +102,7 @@ impl ContactNotification {
}
}
- fn dismiss(&mut self, _: &Dismiss, cx: &mut ViewContext<Self>) {
+ fn dismiss(&mut self, cx: &mut ViewContext<Self>) {
self.user_store.update(cx, |store, cx| {
store
.dismiss_contact_request(self.user.id, cx)
@@ -122,14 +111,10 @@ impl ContactNotification {
cx.emit(Event::Dismiss);
}
- fn respond_to_contact_request(
- &mut self,
- action: &RespondToContactRequest,
- cx: &mut ViewContext<Self>,
- ) {
+ fn respond_to_contact_request(&mut self, accept: bool, cx: &mut ViewContext<Self>) {
self.user_store
.update(cx, |store, cx| {
- store.respond_to_contact_request(action.user_id, action.accept, cx)
+ store.respond_to_contact_request(self.user.id, accept, cx)
})
.detach();
}
@@ -2,7 +2,7 @@ use client::User;
use gpui::{
elements::*,
platform::{CursorStyle, MouseButton},
- Action, AnyElement, Element, View, ViewContext,
+ AnyElement, Element, View, ViewContext,
};
use settings::Settings;
use std::sync::Arc;
@@ -10,14 +10,18 @@ use std::sync::Arc;
enum Dismiss {}
enum Button {}
-pub fn render_user_notification<V: View, A: Action + Clone>(
+pub fn render_user_notification<F, V>(
user: Arc<User>,
title: &'static str,
body: Option<&'static str>,
- dismiss_action: A,
- buttons: Vec<(&'static str, Box<dyn Action>)>,
+ on_dismiss: F,
+ buttons: Vec<(&'static str, Box<dyn Fn(&mut V, &mut ViewContext<V>)>)>,
cx: &mut ViewContext<V>,
-) -> AnyElement<V> {
+) -> AnyElement<V>
+where
+ F: 'static + Fn(&mut V, &mut ViewContext<V>),
+ V: View,
+{
let theme = cx.global::<Settings>().theme.clone();
let theme = &theme.contact_notification;
@@ -64,9 +68,7 @@ pub fn render_user_notification<V: View, A: Action + Clone>(
})
.with_cursor_style(CursorStyle::PointingHand)
.with_padding(Padding::uniform(5.))
- .on_click(MouseButton::Left, move |_, _, cx| {
- cx.dispatch_any_action(dismiss_action.boxed_clone())
- })
+ .on_click(MouseButton::Left, move |_, view, cx| on_dismiss(view, cx))
.aligned()
.constrained()
.with_height(
@@ -90,7 +92,7 @@ pub fn render_user_notification<V: View, A: Action + Clone>(
Some(
Flex::row()
.with_children(buttons.into_iter().enumerate().map(
- |(ix, (message, action))| {
+ |(ix, (message, handler))| {
MouseEventHandler::<Button, V>::new(ix, cx, |state, _| {
let button = theme.button.style_for(state, false);
Label::new(message, button.text.clone())
@@ -98,9 +100,7 @@ pub fn render_user_notification<V: View, A: Action + Clone>(
.with_style(button.container)
})
.with_cursor_style(CursorStyle::PointingHand)
- .on_click(MouseButton::Left, move |_, _, cx| {
- cx.dispatch_any_action(action.boxed_clone())
- })
+ .on_click(MouseButton::Left, move |_, view, cx| handler(view, cx))
},
))
.aligned()