1use crate::{prelude::*, Toggle};
2use crate::{
3 static_collab_panel_channels, static_collab_panel_current_call, v_stack, Icon, List, ListHeader,
4};
5
6#[derive(Component)]
7pub struct CollabPanel {
8 id: ElementId,
9}
10
11impl CollabPanel {
12 pub fn new(id: impl Into<ElementId>) -> Self {
13 Self { id: id.into() }
14 }
15
16 fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
17 v_stack()
18 .id(self.id.clone())
19 .h_full()
20 .bg(cx.theme().colors().surface_background)
21 .child(
22 v_stack()
23 .id("crdb")
24 .w_full()
25 .overflow_y_scroll()
26 .child(
27 div()
28 .pb_1()
29 .border_color(cx.theme().colors().border)
30 .border_b()
31 .child(
32 List::new(static_collab_panel_current_call())
33 .header(
34 ListHeader::new("CRDB")
35 .left_icon(Icon::Hash.into())
36 .toggle(Toggle::Toggled(true)),
37 )
38 .toggle(Toggle::Toggled(true)),
39 ),
40 )
41 .child(
42 v_stack().id("channels").py_1().child(
43 List::new(static_collab_panel_channels())
44 .header(ListHeader::new("CHANNELS").toggle(Toggle::Toggled(true)))
45 .empty_message("No channels yet. Add a channel to get started.")
46 .toggle(Toggle::Toggled(true)),
47 ),
48 )
49 .child(
50 v_stack().id("contacts-online").py_1().child(
51 List::new(static_collab_panel_current_call())
52 .header(
53 ListHeader::new("CONTACTS – ONLINE")
54 .toggle(Toggle::Toggled(true)),
55 )
56 .toggle(Toggle::Toggled(true)),
57 ),
58 )
59 .child(
60 v_stack().id("contacts-offline").py_1().child(
61 List::new(static_collab_panel_current_call())
62 .header(
63 ListHeader::new("CONTACTS – OFFLINE")
64 .toggle(Toggle::Toggled(false)),
65 )
66 .toggle(Toggle::Toggled(false)),
67 ),
68 ),
69 )
70 .child(
71 div()
72 .h_7()
73 .px_2()
74 .border_t()
75 .border_color(cx.theme().colors().border)
76 .flex()
77 .items_center()
78 .child(
79 div()
80 .text_sm()
81 .text_color(cx.theme().colors().text_placeholder)
82 .child("Find..."),
83 ),
84 )
85 }
86}
87
88#[cfg(feature = "stories")]
89pub use stories::*;
90
91#[cfg(feature = "stories")]
92mod stories {
93 use super::*;
94 use crate::Story;
95 use gpui::{Div, Render};
96
97 pub struct CollabPanelStory;
98
99 impl Render for CollabPanelStory {
100 type Element = Div<Self>;
101
102 fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
103 Story::container(cx)
104 .child(Story::title_for::<_, CollabPanel>(cx))
105 .child(Story::label(cx, "Default"))
106 .child(CollabPanel::new("collab-panel"))
107 }
108 }
109}