diff --git a/.gitignore b/.gitignore index 331202a..b0e20f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target/ -/.direnv/ \ No newline at end of file +/.direnv/ +/crates/frontend/dist/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 9abc37e..ad0fd74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + [[package]] name = "async-trait" version = "0.1.68" @@ -10,7 +16,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -102,6 +108,15 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -117,6 +132,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + [[package]] name = "byteorder" version = "1.4.3" @@ -143,6 +170,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "cpufeatures" version = "0.2.6" @@ -190,6 +227,31 @@ dependencies = [ [[package]] name = "frontend" version = "0.1.0" +dependencies = [ + "common", + "futures", + "log", + "reqwasm", + "wasm-bindgen-futures", + "wasm-logger", + "yew", + "yew-router", +] + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] [[package]] name = "futures-channel" @@ -198,6 +260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -206,6 +269,34 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + [[package]] name = "futures-sink" version = "0.3.28" @@ -224,9 +315,13 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -253,6 +348,200 @@ dependencies = [ "wasi", ] +[[package]] +name = "gloo" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4bef6b277b3ab073253d4bca60761240cf8d6998f4bd142211957b69a61b20" +dependencies = [ + "gloo-console", + "gloo-dialogs", + "gloo-events", + "gloo-file", + "gloo-history", + "gloo-net 0.2.6", + "gloo-render", + "gloo-storage", + "gloo-timers", + "gloo-utils", + "gloo-worker", +] + +[[package]] +name = "gloo-console" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b7ce3c05debe147233596904981848862b068862e9ec3e34be446077190d3f" +dependencies = [ + "gloo-utils", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-dialogs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67062364ac72d27f08445a46cab428188e2e224ec9e37efdba48ae8c289002e6" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-events" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b107f8abed8105e4182de63845afcc7b69c098b7852a813ea7462a320992fc" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d5564e570a38b43d78bdc063374a0c3098c4f0d64005b12f9bbe87e869b6d7" +dependencies = [ + "futures-channel", + "gloo-events", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-history" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd451019e0b7a2b8a7a7b23e74916601abf1135c54664e57ff71dcc26dfcdeb7" +dependencies = [ + "gloo-events", + "gloo-utils", + "serde", + "serde-wasm-bindgen", + "serde_urlencoded", + "thiserror", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2899cb1a13be9020b010967adc6b2a8a343b6f1428b90238c9d53ca24decc6db" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-render" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd9306aef67cfd4449823aadcd14e3958e0800aa2183955a309112a84ec7764" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-storage" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6ab60bf5dbfd6f0ed1f7843da31b41010515c745735c970e821945ca91e480" +dependencies = [ + "gloo-utils", + "js-sys", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e8fc851e9c7b9852508bc6e3f690f452f474417e8545ec9857b7f7377036b5" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13471584da78061a28306d1359dd0178d8d6fc1c7c80e5e35d27260346e0516a" +dependencies = [ + "anymap2", + "bincode", + "gloo-console", + "gloo-utils", + "js-sys", + "serde", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "headers" version = "0.3.8" @@ -360,12 +649,40 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "implicit-clone" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40fc102e70475c320b185cd18c1e48bba2d7210b63970a4d581ef903e4368ef7" +dependencies = [ + "indexmap", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itoa" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +[[package]] +name = "js-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -390,9 +707,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "matchit" @@ -511,7 +828,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -526,12 +843,57 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pinned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a829027bd95e54cfe13e3e258a1ae7b645960553fb82b75ff852c29688ee595b" +dependencies = [ + "futures", + "rustversion", + "thiserror", +] + [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.60" @@ -541,6 +903,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prokio" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b55e106e5791fa5a13abd13c85d6127312e8e09098059ca2bc9b03ca4cf488" +dependencies = [ + "futures", + "gloo", + "num_cpus", + "once_cell", + "pin-project", + "pinned", + "tokio", + "tokio-stream", + "wasm-bindgen-futures", +] + [[package]] name = "quote" version = "1.0.28" @@ -589,6 +968,21 @@ dependencies = [ "bitflags", ] +[[package]] +name = "reqwasm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b89870d729c501fa7a68c43bf4d938bbb3a8c156d333d90faa0e8b3e3212fb" +dependencies = [ + "gloo-net 0.1.0", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + [[package]] name = "rustversion" version = "1.0.12" @@ -616,6 +1010,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_derive" version = "1.0.164" @@ -624,7 +1029,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -713,6 +1118,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.18" @@ -747,7 +1163,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -802,7 +1218,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -916,7 +1332,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -1070,6 +1486,95 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +dependencies = [ + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.18", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "wasm-logger" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718" +dependencies = [ + "log", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1157,3 +1662,72 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "yew" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dbecfe44343b70cc2932c3eb445425969ae21754a8ab3a0966981c1cf7af1cc" +dependencies = [ + "console_error_panic_hook", + "futures", + "gloo", + "implicit-clone", + "indexmap", + "js-sys", + "prokio", + "rustversion", + "serde", + "slab", + "thiserror", + "tokio", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "yew-macro", +] + +[[package]] +name = "yew-macro" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64c253c1d401f1ea868ca9988db63958cfa15a69f739101f338d6f05eea8301" +dependencies = [ + "boolinator", + "once_cell", + "prettyplease", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "yew-router" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426ee0486d2572a6c5e39fbdbc48b58d59bb555f3326f54631025266cf04146e" +dependencies = [ + "gloo", + "js-sys", + "route-recognizer", + "serde", + "serde_urlencoded", + "tracing", + "wasm-bindgen", + "web-sys", + "yew", + "yew-router-macro", +] + +[[package]] +name = "yew-router-macro" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b249cdb39e0cddaf0644dedc781854524374664793479fdc01e6a65d6e6ae3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/crates/backend/src/main.rs b/crates/backend/src/main.rs index 382458a..b9b5e1f 100644 --- a/crates/backend/src/main.rs +++ b/crates/backend/src/main.rs @@ -29,7 +29,7 @@ const APP_STATE_FILE: &str = "achievements.json"; type SharedState = Arc>; struct SharedStateParts { app_state: AppState, - watcher_tx: tokio::sync::watch::Sender, + watcher_tx: tokio::sync::watch::Sender, } #[tokio::main] @@ -47,7 +47,7 @@ async fn main() { } Err(e) => panic!("Unexpected error: {:?}", e), }; - let (app_state_watch_tx, app_state_watch_rx) = tokio::sync::watch::channel(init_app_state.clone()); + let (app_state_watch_tx, app_state_watch_rx) = tokio::sync::watch::channel(init_app_state.state.clone()); let app_state: SharedState = Arc::new(tokio::sync::RwLock::new(SharedStateParts { app_state: init_app_state, watcher_tx: app_state_watch_tx, @@ -166,9 +166,9 @@ async fn create_achievement( uuid: uuid::Uuid::new_v4(), }; let mut lock = app_state.write().await; - lock.app_state.achievements.push(achievement); + lock.app_state.state.achievements.push(achievement); lock.watcher_tx - .send(lock.app_state.clone()) + .send(lock.app_state.state.clone()) .expect("watch channel is closed, every receiver was dropped."); Ok((StatusCode::CREATED, ())) } @@ -180,13 +180,14 @@ async fn delete_achievement( let mut lock = app_state.write().await; if let Some(pos) = lock .app_state + .state .achievements .iter() .position(|x| x.uuid == delete_achievement.uuid) { - lock.app_state.achievements.remove(pos); + lock.app_state.state.achievements.remove(pos); lock.watcher_tx - .send(lock.app_state.clone()) + .send(lock.app_state.state.clone()) .expect("watch channel is closed, every receiver was dropped."); } Ok((StatusCode::OK, ())) @@ -220,7 +221,7 @@ async fn shutdown_signal() { #[derive(Clone, Debug, Serialize, Deserialize, Default)] struct AppState { - achievements: Vec, + state: common::State, } impl AppState { diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 09fe82d..8d73fce 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -1,7 +1,12 @@ use serde::Deserialize; use serde::Serialize; -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct State { + pub achievements: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Achievement { pub goal: String, pub completed: bool, diff --git a/crates/frontend/Cargo.toml b/crates/frontend/Cargo.toml index dfe5c3e..d09ef54 100644 --- a/crates/frontend/Cargo.toml +++ b/crates/frontend/Cargo.toml @@ -5,3 +5,11 @@ authors.workspace = true edition.workspace = true [dependencies] +log = "0.4.19" +wasm-logger = "0.2.0" +yew = { version = "0.20", features = ["csr"] } +yew-router = "0.17.0" +common.workspace = true +futures = "0.3.28" +wasm-bindgen-futures = "0.4.36" +reqwasm = "0.5.0" diff --git a/crates/frontend/index.html b/crates/frontend/index.html new file mode 100644 index 0000000..5d0ae09 --- /dev/null +++ b/crates/frontend/index.html @@ -0,0 +1,7 @@ + + + + + Achievements + + diff --git a/crates/frontend/src/components/achievement.rs b/crates/frontend/src/components/achievement.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/crates/frontend/src/components/achievement.rs @@ -0,0 +1 @@ + diff --git a/crates/frontend/src/components/admin.rs b/crates/frontend/src/components/admin.rs new file mode 100644 index 0000000..72c7763 --- /dev/null +++ b/crates/frontend/src/components/admin.rs @@ -0,0 +1,9 @@ +use crate::Route; +use yew::functional::*; +use yew::prelude::*; +use yew_router::prelude::*; + +#[function_component(Admin)] +pub fn admin() -> Html { + html! {} +} diff --git a/crates/frontend/src/components/mod.rs b/crates/frontend/src/components/mod.rs new file mode 100644 index 0000000..1f6ec97 --- /dev/null +++ b/crates/frontend/src/components/mod.rs @@ -0,0 +1,3 @@ +pub mod achievement; +pub mod admin; +pub mod root; diff --git a/crates/frontend/src/components/root.rs b/crates/frontend/src/components/root.rs new file mode 100644 index 0000000..7893c1f --- /dev/null +++ b/crates/frontend/src/components/root.rs @@ -0,0 +1,26 @@ +use crate::Route; +use yew::functional::*; +use yew::prelude::*; +use yew_router::prelude::*; + +#[function_component(Root)] +pub fn root() -> Html { + let app_state = use_context::().expect("no context found"); + + let achievements = app_state + .state + .achievements + .iter() + .map(|a| { + html! { +

{format!("{}", a.goal)}

+ } + }) + .collect::(); + + html! { +
+ {achievements} +
+ } +} diff --git a/crates/frontend/src/main.rs b/crates/frontend/src/main.rs index f328e4d..2fed41c 100644 --- a/crates/frontend/src/main.rs +++ b/crates/frontend/src/main.rs @@ -1 +1,64 @@ -fn main() {} +use components::admin::Admin; +use components::root::Root; +use std::rc::Rc; +use yew::prelude::*; +use yew_router::BrowserRouter; +use yew_router::Routable; +use yew_router::Switch; + +mod components; +mod services; + +#[derive(Debug, Clone, Copy, PartialEq, Routable)] +enum Route { + #[at("/")] + Root, + #[at("/chat")] + Admin, + #[not_found] + #[at("/404")] + NotFound, +} + +fn switch(selected_route: Route) -> Html { + match selected_route { + Route::Root => html! {}, + Route::Admin => html! {}, + Route::NotFound => html! {

{"404 not found"}

}, + } +} + +#[derive(Default, Clone, Debug, PartialEq, Eq)] +struct AppStateInner { + state: common::State, +} +type AppState = Rc; + +#[function_component] +fn App() -> Html { + // let counter = use_state(|| 0); + // let onclick = { + // let counter = counter.clone(); + // move |_| { + // let value = *counter + 1; + // counter.set(value); + // } + // }; + + let ctx = use_state(|| Rc::new(AppStateInner::default())); + + html! { + context={(*ctx).clone()}> + +
+ render={switch}/> +
+
+
> + } +} + +fn main() { + wasm_logger::init(wasm_logger::Config::default()); + yew::Renderer::::new().render(); +} diff --git a/crates/frontend/src/services/mod.rs b/crates/frontend/src/services/mod.rs new file mode 100644 index 0000000..6eba44d --- /dev/null +++ b/crates/frontend/src/services/mod.rs @@ -0,0 +1 @@ +pub mod websocket; diff --git a/crates/frontend/src/services/websocket.rs b/crates/frontend/src/services/websocket.rs new file mode 100644 index 0000000..92e59f4 --- /dev/null +++ b/crates/frontend/src/services/websocket.rs @@ -0,0 +1,49 @@ +use futures::channel::mpsc::Sender; +use futures::SinkExt; +use futures::StreamExt; +use reqwasm::websocket::futures::WebSocket; +use reqwasm::websocket::Message; +use wasm_bindgen_futures::spawn_local; + +pub struct WebsocketService { + pub tx: Sender, +} + +impl WebsocketService { + pub fn new() -> Self { + let ws = WebSocket::open("ws://127.0.0.1:4000").unwrap(); + + let (mut write, mut read) = ws.split(); + + let (in_tx, mut in_rx) = futures::channel::mpsc::channel::(1000); + + spawn_local(async move { + while let Some(s) = in_rx.next().await { + log::debug!("got event from channel! {}", s); + write.send(Message::Text(s)).await.unwrap(); + } + }); + + spawn_local(async move { + while let Some(msg) = read.next().await { + match msg { + Ok(Message::Text(data)) => { + log::debug!("from websocket: {}", data); + } + Ok(Message::Bytes(b)) => { + let decoded = std::str::from_utf8(&b); + if let Ok(val) = decoded { + log::debug!("from websocket: {}", val); + } + } + Err(e) => { + log::error!("ws: {:?}", e) + } + } + } + log::debug!("WebSocket Closed"); + }); + + Self { tx: in_tx } + } +} diff --git a/flake.nix b/flake.nix index 5c5bce5..860c372 100644 --- a/flake.nix +++ b/flake.nix @@ -45,6 +45,7 @@ packages = [ (rust-toolchain.override { extensions = ["rust-std" "rust-src" "clippy" "rust-analyzer"]; + targets = ["wasm32-unknown-unknown"]; }) (rust-toolchain-nightly.override { extensions = ["rustfmt"]; @@ -54,6 +55,7 @@ pkgs.cargo-nextest pkgs.xh pkgs.websocat + pkgs.trunk ]; }; }; diff --git a/justfile b/justfile index ba250f7..84504bf 100644 --- a/justfile +++ b/justfile @@ -27,3 +27,6 @@ create-gul-bus: # ws:///ws subscribe-ws: websocat ws://127.0.0.1:4000/ws + +trunk-serve: + trunk serve crates/frontend/index.html