summaryrefslogtreecommitdiffstats
path: root/src/views/macaw.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 20:17:57 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 20:17:57 +0100
commit33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0 (patch)
tree0617888d360550508ede95aa12c00375cde4e70b /src/views/macaw.rs
parent6ee4190a26f32bfa953302ee363ad3bb6c384ebb (diff)
downloadmacaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.tar.gz
macaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.tar.bz2
macaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.zip
feat: switch to leptos-fetch for state management
Diffstat (limited to '')
-rw-r--r--src/views/macaw.rs51
1 files changed, 33 insertions, 18 deletions
diff --git a/src/views/macaw.rs b/src/views/macaw.rs
index 18e0ad3..e6ec66c 100644
--- a/src/views/macaw.rs
+++ b/src/views/macaw.rs
@@ -1,8 +1,9 @@
use std::collections::HashSet;
-use filamento::{chat::{Chat, Message, MessageStoreFields}, user::User, UpdateMessage};
+use filamento::{chat::{Chat, Message, MessageStoreFields}, user::{User, UserStoreFields}, UpdateMessage};
use jid::BareJID;
use leptos::{prelude::*, task::spawn_local};
+use leptos_fetch::QueryClient;
use open_chats_panel::OpenChatsPanelView;
use reactive_stores::{ArcStore, Store};
use settings::{Settings, SettingsPage};
@@ -10,13 +11,25 @@ use tokio::sync::mpsc::Receiver;
use tracing::debug;
use uuid::Uuid;
-use crate::{client::Client, components::sidebar::Sidebar, contact::MacawContact, message::MacawMessage, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, state_store::StateStore, user::MacawUser, user_presences::{Presences, UserPresences}};
+use crate::{client::Client, components::sidebar::Sidebar, contact::MacawContact, message::MacawMessage, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, user::MacawUser, user_presences::{Presences, UserPresences}};
use super::AppState;
pub mod settings;
mod open_chats_panel;
+// TODO: remove
+async fn get_message(id: Uuid) -> ArcStore<Message> {
+ let client: Client = use_context().expect("no client in context");
+ ArcStore::new(client.get_message(id).await.unwrap())
+}
+
+async fn get_user(jid: BareJID) -> ArcStore<User> {
+ let client: Client = use_context().expect("no client in context");
+ ArcStore::new(client.get_user(jid).await.unwrap())
+}
+
+
#[component]
pub fn Macaw(
// TODO: logout
@@ -34,12 +47,8 @@ pub fn Macaw(
let message_subscriptions = RwSignal::new(MessageSubscriptions::new());
provide_context(message_subscriptions);
- let messages_store: StateStore<Uuid, ArcStore<Message>> = StateStore::new();
- provide_context(messages_store);
- let chats_store: StateStore<BareJID, ArcStore<Chat>> = StateStore::new();
- provide_context(chats_store);
- let users_store: StateStore<BareJID, ArcStore<User>> = StateStore::new();
- provide_context(users_store);
+ QueryClient::new().provide();
+ let query_client: QueryClient = expect_context();
let open_chats = Store::new(OpenChatsPanel::default());
provide_context(open_chats);
@@ -102,7 +111,7 @@ pub fn Macaw(
}
UpdateMessage::Presence { from, presence } => {
let bare_jid = from.to_bare();
- if let Some(presences) = user_presences.read().user_presences.get(&bare_jid) {
+ if let Some(presences) = user_presences.read_untracked().user_presences.get(&bare_jid) {
if let Some(resource) = from.resourcepart() {
presences.write().update_presence(resource.clone(), presence);
}
@@ -127,22 +136,28 @@ pub fn Macaw(
debug!("after set message");
}
UpdateMessage::MessageDelivery { id, chat, delivery } => {
- messages_store.modify(&id, |message| {
- <ArcStore<filamento::chat::Message> as Clone>::clone(&message)
- .delivery()
- .set(Some(delivery))
- });
+ query_client.update_query(get_message, id, |message| {
+ if let Some(message) = message {
+ <ArcStore<filamento::chat::Message> as Clone>::clone(&message).delivery().set(Some(delivery))
+ }
+ })
}
UpdateMessage::SubscriptionRequest(jid) => {
set_subscription_requests.update(|req| { req.insert(jid); });
}
UpdateMessage::NickChanged { jid, nick } => {
- users_store.modify(&jid, |user| {
- user.update(|user| *&mut user.nick = nick.clone())
- });
+ query_client.update_query(get_user, jid, |user| {
+ if let Some(user) = user {
+ <ArcStore<filamento::user::User> as Clone>::clone(&user).nick().set(nick)
+ }
+ })
}
UpdateMessage::AvatarChanged { jid, id } => {
- users_store.modify(&jid, |user| *&mut user.write().avatar = id.clone());
+ query_client.update_query(get_user, jid, |user| {
+ if let Some(user) = user {
+ <ArcStore<filamento::user::User> as Clone>::clone(&user).avatar().set(id)
+ }
+ })
}
}
}