collab_panel.rs

  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}