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 {  | 
