|
1 | 1 | use gpui::{div, IntoElement, ListAlignment, ListState, ParentElement, Pixels}; |
2 | 2 |
|
3 | | -use scope_chat::message::Message; |
| 3 | +use scope_chat::message::{Message, MessageAuthor}; |
4 | 4 |
|
5 | | -use super::message::message; |
| 5 | +use super::message::{message, MessageGroup}; |
6 | 6 |
|
7 | 7 | #[derive(Clone)] |
8 | 8 | pub struct MessageList<M: Message + 'static> { |
9 | | - real_messages: Vec<M>, |
10 | | - pending_messages: Vec<M>, |
| 9 | + messages: Vec<MessageGroup<M>>, |
11 | 10 | } |
12 | 11 |
|
13 | 12 | impl<M: Message> MessageList<M> { |
14 | 13 | pub fn new() -> MessageList<M> { |
15 | | - Self { |
16 | | - real_messages: Vec::default(), |
17 | | - pending_messages: Vec::default(), |
18 | | - } |
| 14 | + Self { messages: Vec::default() } |
19 | 15 | } |
20 | 16 |
|
21 | 17 | pub fn add_external_message(&mut self, message: M) { |
22 | | - if let Some((_, pending_index)) = self |
23 | | - .pending_messages |
24 | | - .iter() |
25 | | - .zip(0..) |
26 | | - .find(|(msg, _)| msg.get_nonce().map(|v1| message.get_nonce().map(|v2| v2 == v1).unwrap_or(false)).unwrap_or(false)) |
27 | | - { |
28 | | - self.pending_messages.remove(pending_index); |
| 18 | + if let Some(nonce) = message.get_nonce() { |
| 19 | + let mut removal_index: Option<usize> = None; |
| 20 | + |
| 21 | + for (group, index) in self.messages.iter_mut().zip(0..) { |
| 22 | + let matching = group.find_matching(nonce); |
| 23 | + |
| 24 | + if let Some(matching) = matching { |
| 25 | + if group.size() == 1 { |
| 26 | + removal_index = Some(index); |
| 27 | + } else { |
| 28 | + group.remove(matching); |
| 29 | + } |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + if let Some(removal_index) = removal_index { |
| 34 | + self.messages.remove(removal_index); |
| 35 | + } |
29 | 36 | } |
30 | 37 |
|
31 | | - self.real_messages.push(message); |
| 38 | + let last = self.messages.last_mut(); |
| 39 | + |
| 40 | + if last.is_some() |
| 41 | + && last.as_ref().unwrap().get_author().get_id() == message.get_author().get_id() |
| 42 | + && message.should_group(last.as_ref().unwrap().last()) |
| 43 | + { |
| 44 | + last.unwrap().add(message); |
| 45 | + } else { |
| 46 | + self.messages.push(MessageGroup::new(message)); |
| 47 | + } |
32 | 48 | } |
33 | 49 |
|
34 | 50 | pub fn add_pending_message(&mut self, pending_message: M) { |
35 | | - self.pending_messages.push(pending_message); |
| 51 | + let last = self.messages.last_mut(); |
| 52 | + |
| 53 | + if last.is_some() |
| 54 | + && last.as_ref().unwrap().get_author().get_id() == pending_message.get_author().get_id() |
| 55 | + && pending_message.should_group(last.as_ref().unwrap().last()) |
| 56 | + { |
| 57 | + last.unwrap().add(pending_message); |
| 58 | + } else { |
| 59 | + self.messages.push(MessageGroup::new(pending_message)); |
| 60 | + } |
36 | 61 | } |
37 | 62 |
|
38 | 63 | pub fn length(&self) -> usize { |
39 | | - self.real_messages.len() + self.pending_messages.len() |
| 64 | + self.messages.len() |
40 | 65 | } |
41 | 66 |
|
42 | | - pub fn get(&self, index: usize) -> Option<&M> { |
43 | | - if index >= self.real_messages.len() { |
44 | | - self.pending_messages.get(index - self.real_messages.len()) |
45 | | - } else { |
46 | | - self.real_messages.get(index) |
47 | | - } |
| 67 | + pub fn get(&self, index: usize) -> Option<&MessageGroup<M>> { |
| 68 | + self.messages.get(index) |
48 | 69 | } |
49 | 70 |
|
50 | 71 | pub fn create_list_state(&self) -> ListState { |
|
0 commit comments