From 33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Sun, 1 Jun 2025 20:17:57 +0100 Subject: feat: switch to leptos-fetch for state management --- src/user.rs | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'src/user.rs') diff --git a/src/user.rs b/src/user.rs index f55c0dd..d92ba4f 100644 --- a/src/user.rs +++ b/src/user.rs @@ -2,28 +2,46 @@ use std::ops::{Deref, DerefMut}; use filamento::user::{User, UserStoreFields}; use jid::BareJID; +use leptos_fetch::QueryClient; use reactive_stores::{ArcStore, Store}; use leptos::prelude::*; -use crate::{client::Client, roster::{Roster, RosterStoreFields}, state_store::{StateListener, StateStore}}; +use crate::{client::Client, roster::{Roster, RosterStoreFields}}; + +async fn get_user(jid: BareJID) -> ArcStore { + let client: Client = use_context().expect("no client in context"); + ArcStore::new(client.get_user(jid).await.unwrap()) +} #[derive(Clone)] pub struct MacawUser { - pub user: StateListener>, + pub user: ArcStore, } impl MacawUser { pub fn got_user(user: User) -> Self { - - let user_state_store: StateStore> = - use_context().expect("no user state store"); - let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); - Self { user } + // let avatar = fetch_avatar(&user); + // user.avatar = avatar; + let query_client: QueryClient = expect_context(); + + let jid = user.jid.clone(); + let user_store = query_client.subscribe_value_local(get_user, move || jid.clone()); + if let Some(user_store) = user_store.get() { + user_store.set(user); + Self { user: user_store } + } else { + let jid = user.jid.clone(); + let user_store = ArcStore::new(user); + query_client.set_query_local(get_user, jid, user_store.clone()); + Self { + user: user_store, + } + } } } impl Deref for MacawUser { - type Target = StateListener>; + type Target = ArcStore; fn deref(&self) -> &Self::Target { &self.user @@ -38,6 +56,15 @@ impl DerefMut for MacawUser { pub const NO_AVATAR: &str = "/assets/no-avatar.png"; +pub async fn fetch_avatar(user: &User) -> Option { + if let Some(avatar) = &user.avatar { + let client = use_context::().expect("client not in context"); + client.file_store.get_src(avatar).await + } else { + None + } +} + pub async fn get_avatar(user: Store) -> String { if let Some(avatar) = &user.read().avatar { let client = use_context::().expect("client not in context"); @@ -46,6 +73,7 @@ pub async fn get_avatar(user: Store) -> String { } else { NO_AVATAR.to_string() } + // avatar.clone() // TODO: enable avatar fetching // format!("/files/{}", avatar) } else { -- cgit