use std::time::Duration;
use chimeras::Device;
use dioxus::prelude::*;
use crate::channel::Channel;
const POLL_INTERVAL: Duration = Duration::from_millis(50);
#[derive(Copy, Clone, PartialEq)]
pub struct UseDevices {
pub devices: Signal<Vec<Device>>,
pub ready: Signal<bool>,
pub refresh: Callback<()>,
}
pub fn use_devices() -> UseDevices {
let mut devices = use_signal(Vec::<Device>::new);
let mut ready = use_signal(|| false);
let channel = use_hook(Channel::<Vec<Device>>::new);
let poll_channel = channel.clone();
use_hook(move || {
spawn(async move {
loop {
futures_timer::Delay::new(POLL_INTERVAL).await;
if let Some(latest) = poll_channel.drain().into_iter().last() {
devices.set(latest);
if !*ready.peek() {
ready.set(true);
}
}
}
})
});
let refresh_tx = channel.sender.clone();
let refresh = use_callback(move |()| {
let tx = refresh_tx.clone();
let _ = std::thread::Builder::new()
.name("chimeras-devices".into())
.spawn(move || {
if let Ok(list) = chimeras::devices() {
let _ = tx.send(list);
}
});
});
use_effect(move || refresh.call(()));
UseDevices {
devices,
ready,
refresh,
}
}