yew_bs/components/
collapse.rs1use 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}