aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-24 12:55:25 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-24 13:20:23 -0500
commitf7c5e6d380a6125534e900931f710109e863b892 (patch)
tree111980b9e8f9ed5423f0532f559e97a62f0bb00c /teleterm-web
parent861b611555ee2266c8d9708a943906a7cf0b7261 (diff)
downloadteleterm-f7c5e6d380a6125534e900931f710109e863b892.tar.gz
teleterm-f7c5e6d380a6125534e900931f710109e863b892.zip
simplify the update logic a bit
Diffstat (limited to 'teleterm-web')
-rw-r--r--teleterm-web/src/lib.rs6
-rw-r--r--teleterm-web/src/model.rs81
2 files changed, 41 insertions, 46 deletions
diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs
index 4c2e366..eb87c44 100644
--- a/teleterm-web/src/lib.rs
+++ b/teleterm-web/src/lib.rs
@@ -10,10 +10,10 @@ use crate::prelude::*;
#[allow(clippy::large_enum_variant)]
#[derive(Clone)]
enum Msg {
- Login,
+ Login(String),
LoggedIn(seed::fetch::ResponseDataResult<()>),
- List(seed::fetch::ResponseDataResult<Vec<crate::protocol::Session>>),
Refresh,
+ List(seed::fetch::ResponseDataResult<Vec<crate::protocol::Session>>),
StartWatching(String),
Watch(String, crate::ws::WebSocketEvent),
StopWatching,
@@ -21,7 +21,7 @@ enum Msg {
fn init(_: Url, orders: &mut impl Orders<Msg>) -> Init<crate::model::Model> {
log::trace!("init");
- orders.send_msg(Msg::Login);
+ orders.send_msg(Msg::Login("foo".to_string()));
Init::new(crate::model::Model::new(crate::config::Config::load()))
}
diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs
index 90c07a0..68676b8 100644
--- a/teleterm-web/src/model.rs
+++ b/teleterm-web/src/model.rs
@@ -6,6 +6,16 @@ struct WatchConn {
received_data: bool,
}
+impl WatchConn {
+ fn new(ws: WebSocket) -> Self {
+ Self {
+ ws,
+ term: vt100::Parser::default(),
+ received_data: false,
+ }
+ }
+}
+
impl Drop for WatchConn {
fn drop(&mut self) {
self.ws.close().unwrap();
@@ -38,39 +48,27 @@ impl Model {
orders: &mut impl Orders<crate::Msg>,
) {
match msg {
- crate::Msg::Login => {
- log::debug!("logging in");
- let url = format!(
- "http://{}/login?username=foo",
- self.config.public_address
- );
- orders.perform_cmd(
- seed::Request::new(url)
- .fetch_json_data(crate::Msg::LoggedIn),
- );
+ crate::Msg::Login(username) => {
+ log::debug!("login");
+ self.login(&username, orders);
}
crate::Msg::LoggedIn(..) => {
log::debug!("logged in");
- self.state = State::List(vec![]);
orders.send_msg(crate::Msg::Refresh);
}
+ crate::Msg::Refresh => {
+ log::debug!("refreshing");
+ self.list(orders);
+ }
crate::Msg::List(sessions) => match sessions {
Ok(sessions) => {
log::debug!("got sessions");
- self.update_sessions(sessions);
+ self.state = State::List(sessions);
}
Err(e) => {
log::error!("error getting sessions: {:?}", e);
}
},
- crate::Msg::Refresh => {
- log::debug!("refreshing");
- let url =
- format!("http://{}/list", self.config.public_address);
- orders.perform_cmd(
- seed::Request::new(url).fetch_json_data(crate::Msg::List),
- );
- }
crate::Msg::StartWatching(id) => {
log::debug!("watching {}", id);
self.watch(&id, orders);
@@ -92,8 +90,7 @@ impl Model {
self.process(&data);
}
crate::protocol::Message::Disconnected => {
- self.disconnect_watch();
- orders.send_msg(crate::Msg::Refresh);
+ self.list(orders);
}
crate::protocol::Message::Resize { size } => {
self.set_size(size.rows, size.cols);
@@ -105,8 +102,7 @@ impl Model {
}
},
crate::Msg::StopWatching => {
- self.disconnect_watch();
- orders.send_msg(crate::Msg::Refresh);
+ self.list(orders);
}
}
}
@@ -155,29 +151,28 @@ impl Model {
}
}
- fn watch(&mut self, id: &str, orders: &mut impl Orders<crate::Msg>) {
- let url =
- format!("ws://{}/watch?id={}", self.config.public_address, id);
- let ws = crate::ws::connect(&url, id, crate::Msg::Watch, orders);
- let term = vt100::Parser::default();
- self.state = State::Watch(WatchConn {
- ws,
- term,
- received_data: false,
- })
+ fn login(&self, username: &str, orders: &mut impl Orders<crate::Msg>) {
+ let url = format!(
+ "http://{}/login?username={}",
+ self.config.public_address, username
+ );
+ orders.perform_cmd(
+ seed::Request::new(url).fetch_json_data(crate::Msg::LoggedIn),
+ );
}
- fn update_sessions(
- &mut self,
- new_sessions: Vec<crate::protocol::Session>,
- ) {
- if let State::List(ref mut sessions) = self.state {
- *sessions = new_sessions;
- }
+ fn list(&self, orders: &mut impl Orders<crate::Msg>) {
+ let url = format!("http://{}/list", self.config.public_address);
+ orders.perform_cmd(
+ seed::Request::new(url).fetch_json_data(crate::Msg::List),
+ );
}
- fn disconnect_watch(&mut self) {
- self.state = State::List(vec![])
+ fn watch(&mut self, id: &str, orders: &mut impl Orders<crate::Msg>) {
+ let url =
+ format!("ws://{}/watch?id={}", self.config.public_address, id);
+ let ws = crate::ws::connect(&url, id, crate::Msg::Watch, orders);
+ self.state = State::Watch(WatchConn::new(ws));
}
fn process(&mut self, bytes: &[u8]) {