freya_core/hooks/previous_and_current.rs
1use std::mem;
2
3use crate::prelude::{
4 IntoReadable,
5 State,
6 use_side_effect,
7 use_state,
8};
9
10/// Track the previous and current values of a reactive value.
11///
12/// This hook returns a `State<(T, T)>` where the first element is the previous value
13/// and the second is the current value. Useful for animations or effects that need to
14/// transition between values.
15///
16/// # Example
17///
18/// ```rust,no_run
19/// # use freya::prelude::*;
20/// fn app() -> impl IntoElement {
21/// let value = use_state(|| 0);
22/// let values: State<(i32, i32)> = use_previous_and_current(value);
23///
24/// rect().child(format!(
25/// "Previous: {}, Current: {}",
26/// values.read().0,
27/// values.read().1
28/// ))
29/// }
30/// ```
31pub fn use_previous_and_current<T: 'static + Clone + PartialEq>(
32 value: impl IntoReadable<T>,
33) -> State<(T, T)> {
34 let value = value.into_readable();
35 let mut state = use_state(|| (value.read().clone(), value.read().clone()));
36
37 use_side_effect(move || {
38 let value = value.read();
39 let mut state = state.write();
40 let old_current = mem::replace(&mut state.1, value.clone());
41 state.0 = old_current;
42 });
43
44 state
45}