orbital_base_components/collection/primitives/hooks/
item_state.rs1use 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}