From 77252d40b6562be06a665fee3846c45faef4f38e Mon Sep 17 00:00:00 2001 From: mc1098 Date: Tue, 14 Sep 2021 22:37:40 +0100 Subject: [PATCH] Fix file upload example (#2054) --- examples/file_upload/src/main.rs | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/examples/file_upload/src/main.rs b/examples/file_upload/src/main.rs index c71354e97ad..57350da7853 100644 --- a/examples/file_upload/src/main.rs +++ b/examples/file_upload/src/main.rs @@ -1,18 +1,21 @@ +use std::collections::HashMap; + use yew::services::reader::{File, FileChunk, FileData, ReaderService, ReaderTask}; use yew::{html, ChangeData, Component, ComponentLink, Html, ShouldRender}; +type FileName = String; type Chunks = bool; pub enum Msg { - Loaded(FileData), - Chunk(Option), + Loaded((FileName, FileData)), + Chunk((FileName, Option)), Files(Vec, Chunks), ToggleByChunks, } pub struct Model { link: ComponentLink, - tasks: Vec, + tasks: HashMap, files: Vec, by_chunks: bool, } @@ -24,7 +27,7 @@ impl Component for Model { fn create(_props: Self::Properties, link: ComponentLink) -> Self { Self { link, - tasks: vec![], + tasks: HashMap::default(), files: vec![], by_chunks: false, } @@ -32,28 +35,38 @@ impl Component for Model { fn update(&mut self, msg: Self::Message) -> ShouldRender { match msg { - Msg::Loaded(file) => { + Msg::Loaded((file_name, file)) => { let info = format!("file: {:?}", file); self.files.push(info); + self.tasks.remove(&file_name); true } - Msg::Chunk(Some(chunk)) => { + Msg::Chunk((file_name, Some(chunk))) => { let info = format!("chunk: {:?}", chunk); self.files.push(info); + if let FileChunk::Finished = chunk { + self.tasks.remove(&file_name); + } true } Msg::Files(files, chunks) => { for file in files.into_iter() { + let file_name = file.name(); let task = { + let file_name = file_name.clone(); if chunks { - let callback = self.link.callback(Msg::Chunk); + let callback = self + .link + .callback(move |chunk| Msg::Chunk((file_name.clone(), chunk))); ReaderService::read_file_by_chunks(file, callback, 10).unwrap() } else { - let callback = self.link.callback(Msg::Loaded); + let callback = self + .link + .callback(move |data| Msg::Loaded((file_name.clone(), data))); ReaderService::read_file(file, callback).unwrap() } }; - self.tasks.push(task); + self.tasks.insert(file_name, task); } true }