Skip to main content

orbital_base_components/collection/primitives/hooks/
item_state.rs

1use leptos::prelude::*;
2
3use crate::collection::state::CollectionState;
4
5#[derive(Clone)]
6pub struct CollectionItemSignals {
7    pub open: Memo<bool>,
8    pub selected: Memo<bool>,
9    pub focused: Memo<bool>,
10    pub disabled: Memo<bool>,
11}
12
13pub fn use_item_state(
14    state: CollectionState,
15    item_id: StoredValue<String>,
16) -> CollectionItemSignals {
17    let open = Memo::new({
18        let state = state.clone();
19        let item_id = item_id;
20        move |_| state.expansion.is_open(&item_id.get_value())
21    });
22
23    let selected = Memo::new({
24        let state = state.clone();
25        let item_id = item_id;
26        move |_| state.selection.is_selected(&item_id.get_value())
27    });
28
29    let focused = Memo::new({
30        let state = state.clone();
31        let item_id = item_id;
32        move |_| {
33            state
34                .focus
35                .focused_item
36                .get()
37                .is_some_and(|focused| focused == item_id.get_value())
38        }
39    });
40
41    let disabled = Memo::new({
42        let state = state.clone();
43        let item_id = item_id;
44        move |_| state.is_item_disabled(&item_id.get_value())
45    });
46
47    CollectionItemSignals {
48        open,
49        selected,
50        focused,
51        disabled,
52    }
53}