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