yew_bs/components/
collapse.rs

1use yew::prelude::*;
2use web_sys::Element;
3use crate::interop::BsCollapse;
4#[derive(Properties, PartialEq)]
5pub struct CollapseProps {
6    #[prop_or_default]
7    pub children: Children,
8    #[prop_or_default]
9    pub expanded: bool,
10    pub id: AttrValue,
11    #[prop_or_default]
12    pub class: Option<AttrValue>,
13    #[prop_or_default]
14    pub node_ref: NodeRef,
15}
16#[function_component(Collapse)]
17pub fn collapse(props: &CollapseProps) -> Html {
18    let collapse_ref = use_node_ref();
19    let bs_collapse = use_state(|| None::<BsCollapse>);
20    let prev_expanded = use_state(|| false);
21    {
22        let collapse_ref = collapse_ref.clone();
23        let bs_collapse = bs_collapse.clone();
24        use_effect(move || {
25            if let Some(element) = collapse_ref.cast::<Element>() {
26                bs_collapse.set(Some(BsCollapse::new(&element, None)));
27            }
28            || {}
29        });
30    }
31    {
32        let bs_collapse = bs_collapse.clone();
33        let prev_expanded = prev_expanded.clone();
34        let expanded = props.expanded;
35        use_effect_with(
36            (expanded, prev_expanded.clone()),
37            move |(expanded, prev_expanded)| {
38                if let Some(bs_collapse) = &*bs_collapse {
39                    if *expanded && !**prev_expanded {
40                        bs_collapse.show();
41                    } else if !*expanded && **prev_expanded {
42                        bs_collapse.hide();
43                    }
44                }
45                prev_expanded.set(*expanded);
46            },
47        );
48    }
49    let mut classes = Classes::new();
50    classes.push("collapse");
51    if props.expanded {
52        classes.push("show");
53    }
54    if let Some(class) = &props.class {
55        classes.push(class.to_string());
56    }
57    html! {
58        < div id = { props.id.clone() } class = { classes } ref = { collapse_ref } > {
59        for props.children.iter() } </ div >
60    }
61}