Files
coop/crates/app/src/views/dock/chat/messages.rs
2024-12-16 08:53:55 +07:00

67 lines
2.0 KiB
Rust

use gpui::*;
use nostr_sdk::prelude::*;
use crate::get_client;
pub struct Messages {
messages: Model<Option<Events>>,
}
impl Messages {
pub fn new(from: PublicKey, cx: &mut ViewContext<'_, Self>) -> Self {
let messages = cx.new_model(|_| None);
let async_messages = messages.clone();
let mut async_cx = cx.to_async();
cx.foreground_executor()
.spawn(async move {
let client = get_client();
let signer = client.signer().await.unwrap();
let public_key = signer.get_public_key().await.unwrap();
let recv_filter = Filter::new()
.kind(Kind::PrivateDirectMessage)
.author(from)
.pubkey(public_key);
let sender_filter = Filter::new()
.kind(Kind::PrivateDirectMessage)
.author(public_key)
.pubkey(from);
let events = async_cx
.background_executor()
.spawn(async move {
client
.database()
.query(vec![recv_filter, sender_filter])
.await
})
.await;
if let Ok(events) = events {
_ = async_cx.update_model(&async_messages, |a, b| {
*a = Some(events);
b.notify();
});
}
})
.detach();
Self { messages }
}
}
impl Render for Messages {
fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
let mut content = div().size_full().flex().flex_col().justify_end();
if let Some(messages) = self.messages.read(cx).as_ref() {
content = content.children(messages.clone().into_iter().map(|m| div().child(m.content)))
}
div().flex_1().child(content)
}
}