diff --git a/src/routes.rs b/src/routes.rs index 4d4af1e..253874a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -2,7 +2,13 @@ use async_std::channel::Sender; use log::{info, warn}; -use rocket::{form::Form, get, post, response::Redirect, uri, FromForm, State}; +use rocket::{ + form::Form, + get, post, + request::FlashMessage, + response::{Flash, Redirect}, + uri, FromForm, State, +}; use rocket_dyn_templates::{context, Template}; use crate::{ @@ -18,7 +24,7 @@ pub struct PeerForm { } #[get("/")] -pub async fn home(db: &State) -> Template { +pub async fn home(db: &State, flash: Option>) -> Template { let peers = db.get_peers(); let mut peers_unread = Vec::new(); for peer in peers { @@ -26,7 +32,7 @@ pub async fn home(db: &State) -> Template { peers_unread.push((peer, unread_count.to_string())); } - Template::render("base", context! { peers: &peers_unread }) + Template::render("base", context! { peers: &peers_unread, flash: flash }) } #[get("/posts///delete")] @@ -153,11 +159,13 @@ pub async fn subscribe_form( db: &State, tx: &State>, peer: Form, -) -> Redirect { +) -> Result> { info!("Subscribing to peer {}", &peer.public_key); if let Err(e) = utils::validate_public_key(&peer.public_key) { - warn!("Public key {} is invalid: {}", &peer.public_key, e) + let err_msg = format!("Public key {} is invalid: {}", &peer.public_key, e); + warn!("{}", err_msg); + return Err(Flash::error(Redirect::to(uri!(home)), err_msg)); } else { info!("Public key {} is valid", &peer.public_key); @@ -191,15 +199,20 @@ pub async fn subscribe_form( } } - Redirect::to(uri!(home)) + Ok(Redirect::to(uri!(home))) } #[post("/unsubscribe", data = "")] -pub async fn unsubscribe_form(db: &State, peer: Form) -> Redirect { +pub async fn unsubscribe_form( + db: &State, + peer: Form, +) -> Result> { info!("Unsubscribing from peer {}", &peer.public_key); if let Err(e) = utils::validate_public_key(&peer.public_key) { - warn!("Public key {} is invalid: {}", &peer.public_key, e) + let err_msg = format!("Public key {} is invalid: {}", &peer.public_key, e); + warn!("{}", err_msg); + return Err(Flash::error(Redirect::to(uri!(home)), err_msg)); } else { info!("Public key {} is valid", &peer.public_key); if db.remove_peer(&peer.public_key).is_ok() { @@ -216,5 +229,5 @@ pub async fn unsubscribe_form(db: &State, peer: Form) -> Red } } - Redirect::to(uri!(home)) + Ok(Redirect::to(uri!(home))) } diff --git a/static/css/lykin.css b/static/css/lykin.css index f8bd100..0ea6505 100644 --- a/static/css/lykin.css +++ b/static/css/lykin.css @@ -19,6 +19,14 @@ pointer-events: none; } +.flash-message { + margin-left: auto; + margin-right: 0; + margin-top: 0; + margin-bottom: 0; + color: red; +} + .flex-container { display: flex; align-items: center; diff --git a/templates/topbar.html.tera b/templates/topbar.html.tera index fa55e68..0121b53 100644 --- a/templates/topbar.html.tera +++ b/templates/topbar.html.tera @@ -46,5 +46,8 @@ + {% if flash and flash.kind == "error" %} +

[ {{ flash.message }} ]

+ {% endif %}