diff options
author | 2025-06-01 14:09:43 +0100 | |
---|---|---|
committer | 2025-06-01 14:09:43 +0100 | |
commit | 0841bc1c64926de1d1a658ea1498f22e43ac6994 (patch) | |
tree | 4f1624a9eaac389528383ae139cc7679e8178f0b /src | |
parent | 39e6a0da29bd7129c572d56590bdb7acd6a580b9 (diff) | |
download | macaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.tar.gz macaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.tar.bz2 macaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.zip |
fix: update JID types
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 109 |
1 files changed, 55 insertions, 54 deletions
@@ -18,7 +18,7 @@ use filamento::{ }; use futures::stream::StreamExt; use indexmap::IndexMap; -use jid::JID; +use jid::{JID, BareJID}; use leptos::{ ev::{Event, KeyboardEvent, MouseEvent, SubmitEvent}, html::{self, Div, Input, Pre, Textarea}, @@ -47,7 +47,7 @@ pub enum AppState { pub struct Client { client: filamento::Client<Files>, resource: ArcRwSignal<Option<String>>, - jid: Arc<JID>, + jid: Arc<BareJID>, file_store: Files, } @@ -229,7 +229,7 @@ fn LoginPage( let client = Client { client, resource: resource.clone(), - jid: Arc::new(jid), + jid: Arc::new(jid.to_bare()), file_store: files, }; @@ -311,8 +311,8 @@ fn LoginPage( } pub struct MessageSubscriptions { - all: HashMap<Uuid, mpsc::Sender<(JID, MacawMessage)>>, - subset: HashMap<JID, HashMap<Uuid, mpsc::Sender<MacawMessage>>>, + all: HashMap<Uuid, mpsc::Sender<(BareJID, MacawMessage)>>, + subset: HashMap<BareJID, HashMap<Uuid, mpsc::Sender<MacawMessage>>>, } impl MessageSubscriptions { @@ -323,7 +323,7 @@ impl MessageSubscriptions { } } - pub async fn broadcast(&mut self, to: JID, message: MacawMessage) { + pub async fn broadcast(&mut self, to: BareJID, message: MacawMessage) { // subscriptions to all let mut removals = Vec::new(); for (id, sender) in &self.all { @@ -358,14 +358,14 @@ impl MessageSubscriptions { } } - pub fn subscribe_all(&mut self) -> (Uuid, Receiver<(JID, MacawMessage)>) { + pub fn subscribe_all(&mut self) -> (Uuid, Receiver<(BareJID, MacawMessage)>) { let (send, recv) = mpsc::channel(10); let id = Uuid::new_v4(); self.all.insert(id, send); (id, recv) } - pub fn subscribe_chat(&mut self, chat: JID) -> (Uuid, Receiver<MacawMessage>) { + pub fn subscribe_chat(&mut self, chat: BareJID) -> (Uuid, Receiver<MacawMessage>) { let (send, recv) = mpsc::channel(10); let id = Uuid::new_v4(); if let Some(chat_subscribers) = self.subset.get_mut(&chat) { @@ -381,7 +381,7 @@ impl MessageSubscriptions { self.all.remove(&sub_id); } - pub fn unsubscribe_chat(&mut self, sub_id: Uuid, chat: JID) { + pub fn unsubscribe_chat(&mut self, sub_id: Uuid, chat: BareJID) { if let Some(chat_subs) = self.subset.get_mut(&chat) { chat_subs.remove(&sub_id); } @@ -390,8 +390,8 @@ impl MessageSubscriptions { #[derive(Store, Clone)] pub struct Roster { - #[store(key: JID = |(jid, _)| jid.clone())] - contacts: HashMap<JID, MacawContact>, + #[store(key: BareJID = |(jid, _)| jid.clone())] + contacts: HashMap<BareJID, MacawContact>, } impl Roster { @@ -410,9 +410,9 @@ impl Roster { #[derive(Store, Default)] pub struct OpenChatsPanel { // jid must be a chat in the chats map - chat_view: Option<JID>, - #[store(key: JID = |(jid, _)| jid.clone())] - chats: IndexMap<JID, MacawChat>, + chat_view: Option<BareJID>, + #[store(key: BareJID = |(jid, _)| jid.clone())] + chats: IndexMap<BareJID, MacawChat>, } pub fn open_chat(open_chats: Store<OpenChatsPanel>, chat: MacawChat) { @@ -487,8 +487,8 @@ impl OpenChatsPanel { #[derive(Store)] pub struct UserPresences { - #[store(key: JID = |(jid, _)| jid.clone())] - user_presences: HashMap<JID, ArcRwSignal<Presences>>, + #[store(key: BareJID = |(jid, _)| jid.clone())] + user_presences: HashMap<BareJID, ArcRwSignal<Presences>>, } impl UserPresences { @@ -499,7 +499,7 @@ impl UserPresences { } // TODO: should be a bare jid - pub fn get_user_presences(&mut self, user: &JID) -> ArcRwSignal<Presences> { + pub fn get_user_presences(&mut self, user: &BareJID) -> ArcRwSignal<Presences> { if let Some(presences) = self.user_presences.get(user) { presences.clone() } else { @@ -628,9 +628,9 @@ fn Macaw( let messages_store: StateStore<Uuid, ArcStore<Message>> = StateStore::new(); provide_context(messages_store); - let chats_store: StateStore<JID, ArcStore<Chat>> = StateStore::new(); + let chats_store: StateStore<BareJID, ArcStore<Chat>> = StateStore::new(); provide_context(chats_store); - let users_store: StateStore<JID, ArcStore<User>> = StateStore::new(); + let users_store: StateStore<BareJID, ArcStore<User>> = StateStore::new(); provide_context(users_store); let open_chats = Store::new(OpenChatsPanel::default()); @@ -651,7 +651,7 @@ fn Macaw( provide_context(client_user); // TODO: timestamp incoming/outgoing subscription requests - let (subscription_requests, set_subscription_requests)= signal(HashSet::<JID>::new()); + let (subscription_requests, set_subscription_requests)= signal(HashSet::<BareJID>::new()); provide_context(subscription_requests); provide_context(set_subscription_requests); @@ -693,15 +693,15 @@ fn Macaw( }); } UpdateMessage::Presence { from, presence } => { - let bare_jid = from.as_bare(); + let bare_jid = from.to_bare(); if let Some(presences) = user_presences.read().user_presences.get(&bare_jid) { - if let Some(resource) = from.resourcepart { - presences.write().update_presence(resource, presence); + if let Some(resource) = from.resourcepart() { + presences.write().update_presence(resource.clone(), presence); } } else { - if let Some(resource) = from.resourcepart { + if let Some(resource) = from.resourcepart() { let mut presences = Presences::new(); - presences.update_presence(resource, presence); + presences.update_presence(resource.clone(), presence); user_presences.write().user_presences.insert(bare_jid, ArcRwSignal::new(presences)); } } @@ -779,7 +779,7 @@ pub fn toggle_open(state: &mut Option<SidebarOpen>, open: SidebarOpen) -> bool { #[component] pub fn Sidebar() -> impl IntoView { - let requests: ReadSignal<HashSet<JID>> = use_context().expect("no pending subscriptions in context"); + let requests: ReadSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions in context"); // for what has been clicked open (in the background) let (open, set_open) = signal(None::<SidebarOpen>); @@ -932,7 +932,7 @@ pub fn PersonalStatusMenu(user: Store<User>, set_open: WriteSignal<bool>) -> imp let client = use_context::<Client>().expect("client not in context"); let client1 = client.clone(); let (show_value, set_show_value) = signal({ - let show = match user_presences.write().get_user_presences(&user.jid().read().as_bare()).write().resource_presence(client.resource.read().clone().unwrap_or_default()).presence { + let show = match user_presences.write().get_user_presences(&user.jid().read()).write().resource_presence(client.resource.read().clone().unwrap_or_default()).presence { PresenceType::Online(online) => match online.show { Some(s) => match s { Show::Away => 3, @@ -1371,7 +1371,7 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { let each = move || { let mut last_timestamp = NaiveDateTime::MIN; - let mut last_user: Option<JID> = None; + let mut last_user: Option<BareJID> = None; let mut messages = messages .get() .into_iter() @@ -1613,7 +1613,7 @@ pub fn Message(message: MacawMessage, major: bool, r#final: bool) -> impl IntoVi } #[component] -pub fn ChatViewMessageComposer(chat: JID) -> impl IntoView { +pub fn ChatViewMessageComposer(chat: BareJID) -> impl IntoView { let message_input: NodeRef<Div> = NodeRef::new(); // TODO: load last message draft @@ -1938,15 +1938,15 @@ impl<K: Eq + std::hash::Hash + Send + Sync + 'static, V: Send + Sync + 'static> #[derive(Clone)] struct MacawChat { - chat: StateListener<JID, ArcStore<Chat>>, - user: StateListener<JID, ArcStore<User>>, + chat: StateListener<BareJID, ArcStore<Chat>>, + user: StateListener<BareJID, ArcStore<User>>, } impl MacawChat { fn got_chat_and_user(chat: Chat, user: User) -> Self { - let chat_state_store: StateStore<JID, ArcStore<Chat>> = + let chat_state_store: StateStore<BareJID, ArcStore<Chat>> = use_context().expect("no chat state store"); - let user_state_store: StateStore<JID, ArcStore<User>> = + let user_state_store: StateStore<BareJID, ArcStore<User>> = use_context().expect("no user state store"); let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); let chat = chat_state_store.store(chat.correspondent.clone(), ArcStore::new(chat)); @@ -1955,7 +1955,7 @@ impl MacawChat { } impl Deref for MacawChat { - type Target = StateListener<JID, ArcStore<Chat>>; + type Target = StateListener<BareJID, ArcStore<Chat>>; fn deref(&self) -> &Self::Target { &self.chat @@ -1971,14 +1971,14 @@ impl DerefMut for MacawChat { #[derive(Clone)] struct MacawMessage { message: StateListener<Uuid, ArcStore<Message>>, - user: StateListener<JID, ArcStore<User>>, + user: StateListener<BareJID, ArcStore<User>>, } impl MacawMessage { fn got_message_and_user(message: Message, user: User) -> Self { let message_state_store: StateStore<Uuid, ArcStore<Message>> = use_context().expect("no message state store"); - let user_state_store: StateStore<JID, ArcStore<User>> = + let user_state_store: StateStore<BareJID, ArcStore<User>> = use_context().expect("no user state store"); let message = message_state_store.store(message.id, ArcStore::new(message)); let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); @@ -2002,13 +2002,13 @@ impl DerefMut for MacawMessage { #[derive(Clone)] struct MacawUser { - user: StateListener<JID, ArcStore<User>>, + user: StateListener<BareJID, ArcStore<User>>, } impl MacawUser { fn got_user(user: User) -> Self { - let user_state_store: StateStore<JID, ArcStore<User>> = + let user_state_store: StateStore<BareJID, ArcStore<User>> = use_context().expect("no user state store"); let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); Self { user } @@ -2016,7 +2016,7 @@ impl MacawUser { } impl Deref for MacawUser { - type Target = StateListener<JID, ArcStore<User>>; + type Target = StateListener<BareJID, ArcStore<User>>; fn deref(&self) -> &Self::Target { &self.user @@ -2032,13 +2032,13 @@ impl DerefMut for MacawUser { #[derive(Clone)] struct MacawContact { contact: Store<Contact>, - user: StateListener<JID, ArcStore<User>>, + user: StateListener<BareJID, ArcStore<User>>, } impl MacawContact { fn got_contact_and_user(contact: Contact, user: User) -> Self { let contact = Store::new(contact); - let user_state_store: StateStore<JID, ArcStore<User>> = + let user_state_store: StateStore<BareJID, ArcStore<User>> = use_context().expect("no user state store"); let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); Self { contact, user } @@ -2082,7 +2082,7 @@ fn ChatsList() -> impl IntoView { ), ) }) - .collect::<IndexMap<JID, _>>(); + .collect::<IndexMap<BareJID, _>>(); set_chats.set(chats); } Err(_) => { @@ -2189,9 +2189,9 @@ fn NewChatWidget(set_open_new_chat: WriteSignal<bool>) -> impl IntoView { use_context().expect("no open chats panel store in context"); let client = use_context::<Client>().expect("client not in context"); - let chat_state_store: StateStore<JID, ArcStore<Chat>> = + let chat_state_store: StateStore<BareJID, ArcStore<Chat>> = use_context().expect("no chat state store"); - let user_state_store: StateStore<JID, ArcStore<User>> = + let user_state_store: StateStore<BareJID, ArcStore<User>> = use_context().expect("no user state store"); let open_chat = Action::new_local(move |_| { @@ -2206,7 +2206,8 @@ fn NewChatWidget(set_open_new_chat: WriteSignal<bool>) -> impl IntoView { } let jid = match JID::from_str(&jid.read_untracked()) { - Ok(j) => j, + // TODO: ability to direct address a resource? + Ok(j) => j.to_bare(), Err(e) => { set_error.set(Some(e.into())); set_new_chat_pending.set(false); @@ -2214,7 +2215,7 @@ fn NewChatWidget(set_open_new_chat: WriteSignal<bool>) -> impl IntoView { } }; - let chat_jid = jid.as_bare(); + let chat_jid = jid; let (chat, user) = match client.get_chat_and_user(chat_jid).await { Ok(c) => c, Err(e) => { @@ -2270,7 +2271,7 @@ fn NewChatWidget(set_open_new_chat: WriteSignal<bool>) -> impl IntoView { #[component] fn RosterList() -> impl IntoView { - let requests: ReadSignal<HashSet<JID>> = use_context().expect("no pending subscriptions in context"); + let requests: ReadSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions in context"); let roster: Store<Roster> = use_context().expect("no roster in context"); let (open_add_contact, set_open_add_contact) = signal(false); @@ -2325,8 +2326,8 @@ pub enum AddContactError { #[component] fn AddContact() -> impl IntoView { - let requests: ReadSignal<HashSet<JID>> = use_context().expect("no pending subscriptions in context"); - let set_requests: WriteSignal<HashSet<JID>> = use_context().expect("no pending subscriptions write signal in context"); + let requests: ReadSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions in context"); + let set_requests: WriteSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions write signal in context"); let roster: Store<Roster> = use_context().expect("no roster in context"); let jid = RwSignal::new("".to_string()); @@ -2360,7 +2361,7 @@ fn AddContact() -> impl IntoView { } let jid = match JID::from_str(&jid.read_untracked()) { - Ok(j) => j, + Ok(j) => j.to_bare(), Err(e) => { set_error.set(Some(e.into())); set_add_contact_pending.set(false); @@ -2368,7 +2369,7 @@ fn AddContact() -> impl IntoView { } }; - let chat_jid = jid.as_bare(); + let chat_jid = jid; // TODO: more options? match client.buddy_request(chat_jid).await { Ok(c) => c, @@ -2408,7 +2409,7 @@ fn AddContact() -> impl IntoView { } }).collect::<Vec<_>>(); - let accept_friend_request = Action::new_local(move |jid: &JID| { + let accept_friend_request = Action::new_local(move |jid: &BareJID| { let client = client2.clone(); let jid = jid.clone(); async move { @@ -2417,7 +2418,7 @@ fn AddContact() -> impl IntoView { } }); - let reject_friend_request = Action::new_local(move |jid: &JID| { + let reject_friend_request = Action::new_local(move |jid: &BareJID| { let client = client3.clone(); let jid = jid.clone(); async move { @@ -2427,7 +2428,7 @@ fn AddContact() -> impl IntoView { } }); - let cancel_subscription_request = Action::new_local(move |jid: &JID| { + let cancel_subscription_request = Action::new_local(move |jid: &BareJID| { let client = client4.clone(); let jid = jid.clone(); async move { |