collab_panel.rs

  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}