1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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) {
// }
}
|