aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web/src/model.rs
blob: 9f7ab05b07b644d22dfc9e902d2b96891262f49d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::prelude::*;

const LIST_URL: &str = "http://127.0.0.1:4145/list";
const WATCH_URL: &str = "ws://127.0.0.1:4145/watch";

struct WatchConn {
    id: String,
    #[allow(dead_code)] // no idea why it thinks this is dead
    ws: WebSocket,
}

#[derive(Clone, Debug, serde::Deserialize)]
pub struct Session {
    pub id: String,
    pub username: String,
}

#[derive(Default)]
pub struct Model {
    sessions: Vec<Session>,
    watch_conn: Option<WatchConn>,
}

impl Model {
    pub(crate) fn list(
        &self,
    ) -> impl futures::Future<Item = crate::Msg, Error = crate::Msg> {
        seed::Request::new(LIST_URL).fetch_json_data(crate::Msg::List)
    }

    pub(crate) fn watch(
        &mut self,
        id: &str,
        orders: &mut impl Orders<crate::Msg>,
    ) {
        let ws = crate::ws::connect(WATCH_URL, crate::Msg::Watch, orders);
        self.watch_conn = Some(WatchConn {
            id: id.to_string(),
            ws,
        })
    }

    pub fn sessions(&self) -> &[Session] {
        &self.sessions
    }

    pub fn update_sessions(&mut self, sessions: Vec<Session>) {
        self.sessions = sessions;
    }

    pub fn watch_id(&self) -> Option<&str> {
        if let Some(conn) = &self.watch_conn {
            Some(&conn.id)
        } else {
            None
        }
    }

    pub fn watch_disconnect(&mut self) {
        self.watch_conn = None;
    }
}