From ef1159c1398dacd025259511ed55402764511281 Mon Sep 17 00:00:00 2001 From: Rob Watson Date: Fri, 4 Sep 2020 13:42:16 +0200 Subject: [PATCH] Add basic file reading functionality --- Cargo.toml | 12 +++++++++ src/app.rs | 1 - src/canvas.rs | 8 ++++-- src/controls.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++----- src/home.rs | 1 - src/lib.rs | 5 ++++ 6 files changed, 85 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c8ae0b0..041d6d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,15 @@ crate-type = ["cdylib", "rlib"] [dependencies] yew = "0.17" wasm-bindgen = "0.2" +gloo-events = "0.1.0" +js-sys = "0.3.44" +futures = "0.3.5" +wasm-bindgen-futures = "0.4" +console_error_panic_hook = "0.1.6" + +[dependencies.web-sys] +version = "0.3.44" +features = [ + "console", + "AudioContext", +] diff --git a/src/app.rs b/src/app.rs index 601f121..5da0a50 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,4 +1,3 @@ -use wasm_bindgen::prelude::*; use yew::prelude::*; use crate::home::Home; diff --git a/src/canvas.rs b/src/canvas.rs index 4ccd317..a0ad994 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -1,10 +1,14 @@ -use wasm_bindgen::prelude::*; use yew::prelude::*; pub struct Canvas {} +pub enum Msg { + Reset, + SamplesLoaded, +} + impl Component for Canvas { - type Message = (); + type Message = Msg; type Properties = (); fn create(_: Self::Properties, _: ComponentLink) -> Self { diff --git a/src/controls.rs b/src/controls.rs index 9135c92..4107f06 100644 --- a/src/controls.rs +++ b/src/controls.rs @@ -1,13 +1,18 @@ -use wasm_bindgen::prelude::*; +use web_sys::HtmlInputElement; use yew::prelude::*; -use yew::web_sys::console; +use yew::services::reader::{FileChunk, ReaderTask}; +use yew::services::{ConsoleService, ReaderService}; pub struct Controls { link: ComponentLink, + file_input: NodeRef, + reader_service: ReaderService, + reader_task: Option, } pub enum Msg { SubmitForm, + FileProgress(Option), } impl Component for Controls { @@ -15,13 +20,27 @@ impl Component for Controls { type Properties = (); fn create(_: Self::Properties, link: ComponentLink) -> Self { - Self { link } + Self { + link, + file_input: NodeRef::default(), + reader_service: ReaderService::new(), + reader_task: None, + } } fn update(&mut self, msg: Self::Message) -> ShouldRender { match msg { - Msg::SubmitForm => console::log_1(&"Handle submit form".into()), - } + Msg::SubmitForm => { + if let Err(e) = self.handle_submit_form() { + ConsoleService::error(&e); + }; + } + Msg::FileProgress(c) => { + if let Err(e) = self.handle_file_progress(c) { + ConsoleService::error(&e); + }; + } + }; true } @@ -29,15 +48,52 @@ impl Component for Controls { false } + fn rendered(&mut self, _: bool) {} + fn view(&self) -> Html { html! {
} } } + +impl Controls { + fn handle_submit_form(&mut self) -> Result<(), String> { + let file_input = self + .file_input + .cast::() + .ok_or("could not cast file_input")?; + + let file_list = file_input.files().ok_or("could not get file list")?; + let file = file_list.get(0).ok_or("could not get file")?; + let cb = self.link.callback(Msg::FileProgress); + + let task = self + .reader_service + .read_file_by_chunks(file, cb, 256) + .map_err(|e| e.to_string())?; + + self.reader_task = Some(task); + Ok(()) + } + + fn handle_file_progress(&self, chunk: Option) -> Result<(), String> { + match chunk { + Some(FileChunk::Started { name, .. }) => { + ConsoleService::log(&format!("Started: {}", name)) + } + Some(FileChunk::DataChunk { progress, .. }) => { + ConsoleService::log(&format!("Got chunk, progress: {}", progress)) + } + Some(FileChunk::Finished) => ConsoleService::log("Finished"), + _ => (), + } + Ok(()) + } +} diff --git a/src/home.rs b/src/home.rs index 0b3763f..a2a1088 100644 --- a/src/home.rs +++ b/src/home.rs @@ -1,6 +1,5 @@ use crate::canvas::Canvas; use crate::controls::Controls; -use wasm_bindgen::prelude::*; use yew::prelude::*; pub struct Home {} diff --git a/src/lib.rs b/src/lib.rs index ac2c30c..5ee3cf5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,7 @@ +extern crate console_error_panic_hook; +extern crate js_sys; + +use std::panic; use wasm_bindgen::prelude::*; use yew::prelude::*; @@ -8,5 +12,6 @@ mod home; #[wasm_bindgen(start)] pub fn run_app() { + panic::set_hook(Box::new(console_error_panic_hook::hook)); App::::new().mount_to_body(); }