summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 14:09:43 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 14:09:43 +0100
commit0841bc1c64926de1d1a658ea1498f22e43ac6994 (patch)
tree4f1624a9eaac389528383ae139cc7679e8178f0b /src/lib.rs
parent39e6a0da29bd7129c572d56590bdb7acd6a580b9 (diff)
downloadmacaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.tar.gz
macaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.tar.bz2
macaw-web-0841bc1c64926de1d1a658ea1498f22e43ac6994.zip
fix: update JID types
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs109
1 files changed, 55 insertions, 54 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 28e973b..26ea17b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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 {