summaryrefslogblamecommitdiffstats
path: root/src/open_chats.rs
blob: 3f33a60cd6c0662126c5eeb042c00c43a6fa190d (plain) (tree)



















                                                                                               
                                                  








                                                             
                                                  






                                                                     
                                              












                                                                                   
                                                      





                                                                       
                                                      






                                                         
                                                  



















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

use crate::chat::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, MacawChat>,
}

pub fn open_chat(open_chats: Store<OpenChatsPanel>, chat: MacawChat) {
    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.chat.get().unwrap()
                .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.chat.get().unwrap()
                .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.chat.get().unwrap()
            .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: MacawChat) {
        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.chat.get().unwrap()
                    .correspondent()
                    .read()
                    .clone();
                self.chats.insert_before(index, new_jid.clone(), chat);
                *&mut self.chat_view = Some(new_jid);
            } else {
                let new_jid = chat.chat.get().unwrap()
                    .correspondent()
                    .read()
                    .clone();
                self.chats.insert(new_jid.clone(), chat);
                *&mut self.chat_view = Some(new_jid);
            }
        } else {
            let new_jid = chat.chat.get().unwrap()
                .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) {

    // }
}