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) {
// }
}