1use rate_ui::shared_object::{RouterState, SharedObject};
2use rate_ui::storage::typed_storage::Storable;
3use serde::{Deserialize, Serialize};
4use std::collections::VecDeque;
5
6thread_local! {
7    pub static ALERTS: SharedObject<ToastState> = SharedObject::new();
8}
9
10#[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq, Eq)]
11pub struct TimedAlert {
12    pub origin: String,
13    pub ms: u64,
14    pub message: String,
15}
16
17impl TimedAlert {
18    pub fn new(origin: String, message: String) -> Self {
19        let ms = js_sys::Date::now();
20        Self {
21            origin,
22            ms: ms as u64,
23            message,
24        }
25    }
26
27    fn renew(&mut self) {
28        self.ms = js_sys::Date::now() as u64;
29    }
30}
31
32#[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq, Eq)]
33pub struct ToastState {
34    pub alerts: VecDeque<TimedAlert>,
35}
36
37impl Storable for ToastState {
38    fn key() -> &'static str {
39        module_path!()
40    }
41}
42
43impl RouterState for ToastState {
44    fn restored(&mut self) {
45        for alert in &mut self.alerts {
47            alert.renew();
48        }
49    }
50}