Commit 0b0c5fee1ac7c68d63041d7b1bf4f2d9e7d4ad64
1 parent
02651455
Fixes #3 - basic client for file upload
Showing
5 changed files
with
42 additions
and
18 deletions
... | ... | @@ -2,20 +2,31 @@ use std::fmt::Display; |
2 | 2 | |
3 | 3 | use super::super::error::*; |
4 | 4 | use super::super::client::Client; |
5 | +use crate::upload::upload::Upload; | |
5 | 6 | |
6 | 7 | #[derive(Debug, Clone)] |
7 | -pub struct Upload { | |
8 | - client: Client, | |
8 | +pub struct UploadApi { | |
9 | + client :Client, | |
9 | 10 | } |
10 | 11 | |
11 | -impl Upload { | |
12 | - pub(crate) async fn new(name :&str) -> Result<()> { | |
13 | - Ok(()) | |
14 | - /* | |
12 | +impl UploadApi { | |
13 | + pub(crate) async fn new() -> Result<UploadApi> { | |
14 | + let client = Client::new()?; | |
15 | + Ok(UploadApi { client }) | |
16 | + } | |
17 | + | |
18 | + pub(crate) async fn store(&self, upload :&Upload) -> Result<&UploadApi> { | |
19 | + let response = self.client.post_stream( "/api/v0/upload" | |
20 | + , &upload.mime_type() | |
21 | + , upload.data() ).await?; | |
15 | 22 | match response.status() { |
16 | 23 | 200 => Ok(self), |
17 | 24 | status => Err(Self::status_error(status)), |
18 | 25 | } |
19 | - */ | |
26 | + } | |
27 | + | |
28 | + fn status_error<I: Display>(status :I) -> Error { | |
29 | + let err_str = format!("Invalid response status: {}", status); | |
30 | + Error::from(err_str.as_str()) | |
20 | 31 | } |
21 | 32 | } | ... | ... |
1 | 1 | use mogwai::prelude::*; |
2 | -use web_sys::{HtmlInputElement, ImageBitmap, HtmlCanvasElement, CanvasRenderingContext2d}; | |
2 | +use web_sys::{HtmlInputElement, HtmlCanvasElement, CanvasRenderingContext2d}; | |
3 | + | |
4 | +use crate::api::upload::UploadApi; | |
3 | 5 | |
4 | 6 | use super::upload::Upload; |
5 | 7 | |
... | ... | @@ -7,6 +9,7 @@ use super::upload::Upload; |
7 | 9 | pub(super) enum UploadLogic { |
8 | 10 | Add(DomEvent), |
9 | 11 | Remove(usize), |
12 | + Upload, | |
10 | 13 | } |
11 | 14 | |
12 | 15 | pub(super) async fn upload_preview_logic( mut rx_canvas :broadcast::Receiver<Dom> |
... | ... | @@ -27,7 +30,7 @@ pub(super) async fn upload_preview_logic( mut rx_canvas :broadcast::Receiver<Dom |
27 | 30 | } |
28 | 31 | } |
29 | 32 | |
30 | - while let Some(event) = rx_click.next().await { | |
33 | + while let Some(_) = rx_click.next().await { | |
31 | 34 | upload.tx_logic . try_broadcast(UploadLogic::Remove(upload.id)) |
32 | 35 | . unwrap(); |
33 | 36 | } |
... | ... | @@ -38,6 +41,7 @@ pub(super) async fn upload_logic( mut rx_logic :broadcast::Receiver<UploadLogic> |
38 | 41 | , tx_previews: mpmc::Sender<ListPatch<ViewBuilder<Dom>>> |
39 | 42 | ) { |
40 | 43 | let mut uploads: ListPatchModel<Upload> = ListPatchModel::new(); |
44 | + let api = UploadApi::new().await.unwrap(); | |
41 | 45 | |
42 | 46 | mogwai::spawn(uploads.stream().for_each(move |patch| { |
43 | 47 | let patch = patch.map(|u| u.into()); |
... | ... | @@ -80,6 +84,14 @@ pub(super) async fn upload_logic( mut rx_logic :broadcast::Receiver<UploadLogic> |
80 | 84 | uploads.list_patch_remove(index).unwrap(); |
81 | 85 | } |
82 | 86 | }, |
87 | + UploadLogic::Upload => { | |
88 | + for upload in uploads.read().await.iter() { | |
89 | + match api.store(upload).await { | |
90 | + Ok(_) => (), | |
91 | + Err(e) => log::error!("{:?}", e), | |
92 | + } | |
93 | + } | |
94 | + } | |
83 | 95 | } |
84 | 96 | } |
85 | 97 | } | ... | ... |
... | ... | @@ -4,7 +4,7 @@ use web_sys::{File, ImageBitmap, ReadableStream}; |
4 | 4 | use super::{view::upload_preview_view, logic::{upload_preview_logic, UploadLogic}}; |
5 | 5 | |
6 | 6 | #[derive(Clone, Debug)] |
7 | -pub(super) struct Upload { | |
7 | +pub(crate) struct Upload { | |
8 | 8 | pub(super) id :usize, |
9 | 9 | file :File, |
10 | 10 | bitmap :ImageBitmap, |
... | ... | @@ -26,11 +26,11 @@ impl Upload { |
26 | 26 | Self { id, file, bitmap, tx_logic } |
27 | 27 | } |
28 | 28 | |
29 | - pub(super) fn mime_type(&self) -> String { | |
29 | + pub(crate) fn mime_type(&self) -> String { | |
30 | 30 | self.file.type_() |
31 | 31 | } |
32 | 32 | |
33 | - pub(super) fn data(&self) -> ReadableStream { | |
33 | + pub(crate) fn data(&self) -> ReadableStream { | |
34 | 34 | self.file.stream() |
35 | 35 | } |
36 | 36 | ... | ... |
... | ... | @@ -32,9 +32,10 @@ pub(super) fn upload_preview_view( tx_canvas :broadcast::Sender<Dom> |
32 | 32 | pub(super) fn upload_view( tx_logic: broadcast::Sender<UploadLogic> |
33 | 33 | , rx_previews: mpmc::Receiver<ListPatch<ViewBuilder<Dom>>> |
34 | 34 | ) -> ViewBuilder<Dom> { |
35 | - let on_change_filter = tx_logic | |
36 | - . sink() | |
37 | - . contra_map(|e| UploadLogic::Add(e)); | |
35 | + let select_filter = tx_logic.sink() | |
36 | + . contra_map(|e| UploadLogic::Add(e)); | |
37 | + let upload_filter = tx_logic.sink() | |
38 | + . contra_map(|_| UploadLogic::Upload); | |
38 | 39 | |
39 | 40 | // <div class="spin"></div> |
40 | 41 | builder! { |
... | ... | @@ -43,8 +44,8 @@ pub(super) fn upload_view( tx_logic: broadcast::Sender<UploadLogic> |
43 | 44 | <input type="file" |
44 | 45 | multiple="multiple" |
45 | 46 | accept="image/*" |
46 | - on:change=on_change_filter /> | |
47 | - <button>"Upload"</button> | |
47 | + on:change=select_filter /> | |
48 | + <button on:click=upload_filter>"Upload"</button> | |
48 | 49 | </div> |
49 | 50 | <ul patch:children=rx_previews> |
50 | 51 | </ul> | ... | ... |
Please
register
or
login
to post a comment