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}