feat: coin flip

feat:  button trigger
This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-03-09 03:35:17 +03:00
parent 75cf0be90d
commit aeafc3cf4e
3 changed files with 82 additions and 38 deletions

View file

@ -7,6 +7,7 @@ edition = "2021"
[dependencies] [dependencies]
axum = "0.7.4" axum = "0.7.4"
rand = "0.8.5"
serde = { version = "1.0.197", features = ["derive"] } serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.114" serde_json = "1.0.114"
tokio = { version = "1.36.0", features = ["full"] } tokio = { version = "1.36.0", features = ["full"] }

View file

@ -1,20 +1,35 @@
use crate::AppState; use crate::AppState;
use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router}; use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router};
use tower_http::cors::CorsLayer; use tower_http::cors::CorsLayer;
use rand::prelude::*;
pub async fn routing(State(state): State<AppState>) -> Router{ pub async fn routing(State(state): State<AppState>) -> Router {
Router::new() Router::new()
.route("/", get(alive)) .route("/", get(alive))
.route("/coin", get(flip_coin))
.layer(CorsLayer::permissive()) .layer(CorsLayer::permissive())
.with_state(state.clone()) .with_state(state.clone())
} }
async fn alive() -> impl IntoResponse{ async fn alive() -> impl IntoResponse {
let alive_json = serde_json::json!({ let alive_json = serde_json::json!({
"status":"Alive", "status":"Alive",
}); });
println!("Alive"); println!("Alive");
(StatusCode::OK, Json(alive_json)) (StatusCode::OK, Json(alive_json))
}
async fn flip_coin() -> impl IntoResponse {
let mut rng = rand::thread_rng();
let random:f64 = rng.gen();
let mut flip_status:String = "Tail".to_string();
if random > 0.5 {
flip_status = "Head".to_string();
}
let coin_json = serde_json::json!({
"status":flip_status,
});
println!("Coin Flip");
(StatusCode::OK, Json(coin_json))
} }

View file

@ -20,37 +20,13 @@ async fn server_status_check() ->Result<ServerStatus, reqwest::Error> {
Ok(reqwest::get(SERVER_ADDRESS).await.unwrap().json::<ServerStatus>().await.unwrap()) Ok(reqwest::get(SERVER_ADDRESS).await.unwrap().json::<ServerStatus>().await.unwrap())
} }
async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> { async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> {
Ok(reqwest::get(SERVER_ADDRESS).await.unwrap().json::<CoinStatus>().await.unwrap()) Ok(reqwest::get(format!("{}{}", SERVER_ADDRESS, "/coin")).await.unwrap().json::<CoinStatus>().await.unwrap())
} }
fn app() -> Element { fn app() -> Element {
let server_status = use_resource(move || server_status_check()); rsx! {
match &*server_status.value().read() { { page_base() }
Some(Ok(server_status)) => { { coin_status_renderer() }
rsx! { { server_status_renderer() }
{ page_base() }
h5 {
ShowServerStatus { server_status: server_status.clone() }
}
}
}
Some(Err(_)) => {
rsx! {
{ page_base() }
div {
"A"
}
}
}
None => {
rsx! {
{ page_base() }
h5 {
"Server Status: Dead"
}
}
}
} }
} }
@ -63,19 +39,71 @@ fn page_base() ->Element {
div { div {
class: "flex items-center", class: "flex items-center",
span { span {
button {
"style":"width: 70px; height: 40px;",
"Coin Flip"
}
} }
span { " " },
span { }
} }
} }
} }
} }
fn server_status_renderer() -> Element {
let server_status = use_resource(move || server_status_check());
match &*server_status.value().read() {
Some(Ok(server_status)) => {
rsx! {
h5 {
ShowServerStatus { server_status: server_status.clone() }
}
}
}
Some(Err(err_val)) => {
rsx! {
h5 {
"Server Status: "
{ err_val.to_string() }
}
}
}
None => {
rsx! {
h5 {
"Server Status: Dead"
}
}
}
}
}
fn coin_status_renderer() -> Element {
let mut coin_response = use_resource(move || coin_status_check());
match &*coin_response.value().read() {
Some(Ok(coin_status)) => {
rsx! {
button {
onclick: move |_| coin_response.restart(),
"style":"width: 70px; height: 40px;",
"Coin Flip"
}
ShowCoinStatus{ coin_status: coin_status.clone() }
}
}
Some(Err(err_val)) => {
rsx! {
div {
"Coin Status: "
{ err_val.to_string() }
}
}
}
None => {
rsx! {
div {
"Coin Status: None"
}
}
}
}
}
#[component] #[component]
fn ShowServerStatus(server_status: ServerStatus) -> Element { fn ShowServerStatus(server_status: ServerStatus) -> Element {
rsx! { rsx! {