summaryrefslogblamecommitdiffstats
path: root/src/open_chats.rs
blob: 6d08c5d86d0e67587913729716c73c300f788d3d (plain) (tree)
1
2
3
4
5
6
7
8






                                       
                                           





                                                   
                                           

 
                                                                         

                                                                                               
                                    








                                                             
                                    






                                                                     
                                








                                                                 
                                                


                                                                                   
                                        





                                                                       
                                        






                                                         
                                    



















                                                     
use filamento::chat::ChatStoreFields;
use indexmap::IndexMap;
use jid::BareJID;
use reactive_stores::{ArcStore, Store};
use tracing::debug;
use leptos::prelude::*;

use crate::chat::{ArcMacawChat, MacawChat};

#[derive(Store, Default)]
pub struct OpenChatsPanel {
    // jid must be a chat in the chats map
    chat_view: Option<BareJID>,
    #[store(key: BareJID = |(jid, _)| jid.clone())]
    chats: IndexMap<BareJID, ArcMacawChat>,
}

pub fn open_chat(open_chats: Store<OpenChatsPanel>, chat: ArcMacawChat) {
    if let Some(jid) = &*open_chats.chat_view().read() {
        if let Some((index, _jid, entry)) = open_chats.chats().write().shift_remove_full(jid) {
            let new_jid = chat.get()
                .correspondent()
                .read()
                .clone();
            open_chats
                .chats()
                .write()
                .insert_before(index, new_jid.clone(), chat);
            *open_chats.chat_view().write() = Some(new_jid);
        } else {
            let new_jid = chat.get()
                .correspondent()
                .read()
                .clone();
            open_chats.chats().write().insert(new_jid.clone(), chat);
            *open_chats.chat_view().write() = Some(new_jid);
        }
    } else {
        let new_jid = chat.get()
            .correspondent()
            .read()
            .clone();
        open_chats.chats().write().insert(new_jid.clone(), chat);
        *open_chats.chat_view().write() = Some(new_jid);
    }
}

impl OpenChatsPanel {
    pub fn open(&mut self, chat: ArcMacawChat) {
        if let Some(jid) = &mut self.chat_view {
            debug!("a chat was already open");
            if let Some((index, _jid, entry)) = self.chats.shift_remove_full(jid) {
                let new_jid = chat.get()
                    .correspondent()
                    .read()
                    .clone();
                self.chats.insert_before(index, new_jid.clone(), chat);
                *&mut self.chat_view = Some(new_jid);
            } else {
                let new_jid = chat.get()
                    .correspondent()
                    .read()
                    .clone();
                self.chats.insert(new_jid.clone(), chat);
                *&mut self.chat_view = Some(new_jid);
            }
        } else {
            let new_jid = chat.get()
                .correspondent()
                .read()
                .clone();
            self.chats.insert(new_jid.clone(), chat);
            *&mut self.chat_view = Some(new_jid);
        }
        debug!("opened chat");
    }

    // TODO:
    // pub fn open_in_new_tab_unfocused(&mut self) {

    // }

    // pub fn open_in_new_tab_focus(&mut self) {

    // }
}