diff --git a/.gitignore b/.gitignore index cc460e8..56b4379 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ static pkg ./Cargo.lock package-lock.json +data diff --git a/Cargo.toml b/Cargo.toml index 58e3479..50d469a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" env_logger = "0.10.0" log = "0.4.20" +once_cell = "1.18.0" [target.'cfg(engine)'.dev-dependencies] fantoccini = "0.19" diff --git a/src/components/layout.rs b/src/components/layout.rs index 87044d7..383ac75 100644 --- a/src/components/layout.rs +++ b/src/components/layout.rs @@ -47,16 +47,11 @@ pub fn Layout<'a, G: Html>( main(style = "my-8") { div(class = "container mx-auto px-6") { div(class = "md:flex mt-8 md:-mx-4") { - div(class = "h-64 rounded-md overflow-hidden bg-cover bg-center") { + div(class = "rounded-md overflow-hidden bg-cover bg-center") { (children) } } } } - footer(class = "bg-gray-200") { - p(class = "container mx-auto px-6 py-3 flex justify-between items-center"){ - "Hey there, I'm a footer!" - } - } } } diff --git a/src/data/mod.rs b/src/data/mod.rs new file mode 100644 index 0000000..733a262 --- /dev/null +++ b/src/data/mod.rs @@ -0,0 +1,2 @@ +pub mod pool_match; +pub mod store; \ No newline at end of file diff --git a/src/data/pool_match.rs b/src/data/pool_match.rs new file mode 100644 index 0000000..31e3e6e --- /dev/null +++ b/src/data/pool_match.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone)] +pub struct PoolMatch { + pub players: Vec, + pub winner: String, +} +#[derive(Serialize, Deserialize, Clone)] +pub struct PoolMatchList { + pub pool_matches: Vec, +} diff --git a/src/data/store.rs b/src/data/store.rs new file mode 100644 index 0000000..a3c3889 --- /dev/null +++ b/src/data/store.rs @@ -0,0 +1,40 @@ +#![cfg(engine)] + +use std::collections::HashMap; +use once_cell::sync::Lazy; +use std::sync::Mutex; +use serde::{Serialize, Deserialize}; +use crate::data::pool_match::{PoolMatchList, PoolMatch}; +use std::fs; +use std::path::Path; + + +#[derive(Serialize, Deserialize, Clone)] +pub struct Store { + pub matches: PoolMatchList, +} + +impl Store { + fn new() -> Store { + fs::create_dir_all("data"); + match Path::new("data/store.json").exists() { + false => { + Store { + matches: PoolMatchList { pool_matches: vec![] }, + } + } + true => { + let contents = fs::read_to_string("data/store.json").unwrap(); + serde_json::from_str(&contents).unwrap() + } + } + } + pub fn write(&self) { + let contents = serde_json::to_string(&self).unwrap(); + fs::write("data/store.json", contents).unwrap(); + } +} + +pub static DATA: Lazy> = Lazy::new(|| { + Mutex::new(Store::new()) +}); diff --git a/src/main.rs b/src/main.rs index b0daf1e..e7e5f1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod components; mod templates; +mod data; mod error_views; use perseus::prelude::*; @@ -7,7 +8,6 @@ use sycamore::prelude::view; #[perseus::main(perseus_axum::dflt_server)] pub fn main() -> PerseusApp { - use log::{info, warn}; env_logger::init(); PerseusApp::new() diff --git a/src/templates/add_game_form.rs b/src/templates/add_game_form.rs index 1f371ea..3fb2d8e 100644 --- a/src/templates/add_game_form.rs +++ b/src/templates/add_game_form.rs @@ -1,7 +1,6 @@ use crate::components::layout::Layout; use perseus::prelude::*; use serde::{Deserialize, Serialize}; -use std::fs; use sycamore::prelude::*; // Reactive page diff --git a/src/templates/one_v_one_board.rs b/src/templates/one_v_one_board.rs index 3a9ac4c..787cffb 100644 --- a/src/templates/one_v_one_board.rs +++ b/src/templates/one_v_one_board.rs @@ -1,7 +1,6 @@ use crate::components::layout::Layout; use perseus::prelude::*; use serde::{Deserialize, Serialize}; -use std::fs; use sycamore::prelude::*; // Reactive page diff --git a/src/templates/overall_board.rs b/src/templates/overall_board.rs index 7eee3be..acbed55 100644 --- a/src/templates/overall_board.rs +++ b/src/templates/overall_board.rs @@ -1,22 +1,46 @@ use crate::components::layout::Layout; use perseus::prelude::*; use serde::{Deserialize, Serialize}; -use std::fs; +#[cfg(engine)] +use crate::data::store::DATA; +#[cfg(engine)] +use std::thread; use sycamore::prelude::*; +use crate::data::pool_match::{ + PoolMatchList, PoolMatch +}; + // Reactive page #[derive(Serialize, Deserialize, Clone, ReactiveState)] #[rx(alias = "PageStateRx")] struct PageState { - + matches: PoolMatchList, } fn overall_board_page<'a, G: Html>(cx: BoundedScope<'_, 'a>, state: &'a PageStateRx) -> View { view! { cx, Layout(title = "Overall Leaderboard") { // Anything we put in here will be rendered inside the `
` block of the layout - p { "leaderboard" } + ul { + (View::new_fragment( + state.matches.get() + .pool_matches + .iter() + .rev() + .enumerate() + .map(|(index, item)| { + let game = item.clone(); + view! { cx, + li { + (game.winner) + } + } + }) + .collect(), + )) + } } } } @@ -26,7 +50,20 @@ async fn get_request_state( _info: StateGeneratorInfo<()>, req: Request, ) -> Result> { - Ok(PageState {}) + + let matches = thread::spawn(move || { + let mut db = DATA.lock().unwrap(); + db.matches.pool_matches.push(PoolMatch { + players: vec![], + winner: "lol".to_string(), + }); + db.write(); + db.matches.clone() + }).join().unwrap(); + + Ok(PageState { + matches + }) } #[engine_only_fn]