Skip to content

Commit 6c509ed

Browse files
committed
Fix add post page
1 parent 8bec5e5 commit 6c509ed

File tree

5 files changed

+102
-42
lines changed

5 files changed

+102
-42
lines changed

devblog/devblog/client/src/components/comment_add.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub fn add_comment(props: &Props) -> Html {
4141
Callback::from(move |e: SubmitEvent| {
4242
e.prevent_default();
4343
let hdrs = helpers::create_auth_header(&store.token);
44+
hdrs.append("content-type", "application/json");
4445

4546
let new_comment = CommentModel::new(
4647
post_id,

devblog/devblog/client/src/components/comment_edit.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub fn edit_comment(props: &Props) -> Html {
5151
let on_save = on_save.clone();
5252
let body = Some(helpers::to_jsvalue(content.deref().clone()));
5353
let hdrs = helpers::create_auth_header(&store.token);
54+
hdrs.append("content-type", "application/json");
5455

5556
wasm_bindgen_futures::spawn_local(async move {
5657
let response = Api::EditComment(id)

devblog/devblog/client/src/helpers.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::store::Store;
22
use crate::{helpers, Api};
33
use crate::{router::Route, User, UserField};
44
use gloo::console::log;
5-
// use gloo::utils::format::JsValueSerdeExt;
65
use gloo_net::http::{Headers, Method, Response};
76
use serde::de::DeserializeOwned;
87
use serde::Serialize;
@@ -108,7 +107,6 @@ pub fn create_auth_header(token: &String) -> Headers {
108107
let auth = format!("Bearer {}", token);
109108
let hdrs = Headers::new();
110109
hdrs.append("Authorization", &auth);
111-
hdrs.append("content-type", "application/json");
112110
hdrs
113111
}
114112

devblog/devblog/client/src/pages/insights.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ pub fn insights() -> Html {
4242
<th>{"Username"}</th>
4343
<th>{"Email"}</th>
4444
<th>{"Subscribed"}</th>
45-
<th>{"Delete"}</th>
4645
</tr>
4746
</thead>
4847
<tbody>

devblog/devblog/client/src/pages/post_add.rs

Lines changed: 100 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
use std::{fs::File, ops::Deref};
2-
31
use crate::{helpers, store::Store, Api};
42
use gloo_net::http::Method;
5-
// use gloo::file::File;
3+
use std::ops::Deref;
64
use stylist::{css, Style};
7-
use web_sys::HtmlTextAreaElement;
5+
use web_sys::{FileList, FormData, HtmlInputElement, HtmlTextAreaElement};
86
use yew::prelude::*;
97
use yewdux::use_store_value;
108

@@ -13,19 +11,17 @@ const STYLE: &str = include_str!("styles/postAdd.css");
1311
#[function_component(AddPost)]
1412
pub fn add_post() -> Html {
1513
let style = Style::new(STYLE).unwrap();
14+
let files: UseStateHandle<Option<FileList>> = use_state(|| None);
1615
let description = use_state(|| String::default());
1716
let char_count = use_state(|| 0);
18-
// let files = use_state(|| vec![File::open("Hello.txt").unwrap()]);
1917
let loading = use_state(|| false);
2018
let devblog = use_state(|| false);
21-
let devblog_status = use_state(|| 0);
22-
let devblog_err = use_state(|| String::default());
19+
let devblog_status = use_state(|| String::default());
2320
let mastodon = use_state(|| false);
24-
let mastodon_status = use_state(|| 0);
25-
let mastodon_err = use_state(|| String::default());
21+
let mastodon_status = use_state(|| String::default());
2622
let discord = use_state(|| false);
27-
let discord_status = use_state(|| 0);
28-
let discord_err = use_state(|| String::default());
23+
let discord_status = use_state(|| String::default());
24+
let err = use_state(|| String::default());
2925
let store = use_store_value::<Store>();
3026

3127
let char_count_clone = char_count.clone();
@@ -34,61 +30,108 @@ pub fn add_post() -> Html {
3430
char_count_clone.set(description_clone.len());
3531
});
3632

33+
// create post
3734
let onsubmit = {
3835
let token = store.token.clone();
36+
let description = description.clone();
37+
let err = err.clone();
38+
let files = files.clone();
39+
let loading = loading.clone();
40+
3941
let discord = *discord.clone();
42+
let discord_status = discord_status.clone();
43+
4044
let mastodon = *mastodon.clone();
45+
let mastodon_status = mastodon_status.clone();
46+
4147
let devblog = *devblog.clone();
48+
let devblog_status = devblog_status.clone();
49+
4250
Callback::from(move |e: SubmitEvent| {
4351
e.prevent_default();
4452
loading.set(true);
53+
let loading = loading.clone();
54+
let err = err.clone();
55+
56+
let discord_status = discord_status.clone();
57+
let mastodon_status = mastodon_status.clone();
58+
let devblog_status = devblog_status.clone();
59+
4560
let hdrs = helpers::create_auth_header(&token);
61+
let form_data = FormData::new().unwrap();
62+
let _ = form_data.append_with_str("description", &description);
63+
let _ = form_data.append_with_str("postToDiscord", &discord.to_string());
64+
let _ = form_data.append_with_str("postToMastodon", &mastodon.to_string());
65+
let _ = form_data.append_with_str("postToDevBlog", &devblog.to_string());
66+
67+
// add imgs to FileList
68+
if let Some(f) = files.deref() {
69+
for i in 0..f.length() {
70+
if let Some(file) = f.item(i) {
71+
let _ = form_data.append_with_blob("files", &file).unwrap();
72+
}
73+
}
74+
}
4675

4776
wasm_bindgen_futures::spawn_local(async move {
48-
let response = Api::AddPost.fetch(Some(hdrs), None, Method::POST).await;
77+
let response = Api::AddPost
78+
.fetch(Some(hdrs), Some(form_data.into()), Method::POST)
79+
.await;
4980

5081
if let Some(res) = response {
51-
if discord {}
52-
if mastodon {}
53-
if devblog {}
54-
};
82+
let status = format!("{}: {}", res.status(), res.status_text());
83+
84+
if discord {
85+
discord_status.set(status.clone());
86+
}
87+
if mastodon {
88+
mastodon_status.set(status.clone());
89+
}
90+
if devblog {
91+
devblog_status.set(status);
92+
}
93+
} else {
94+
err.set("Failed to send request.".to_string());
95+
}
96+
97+
loading.set(false);
5598
});
5699
})
57100
};
58101

59-
let upload_status = |platform: String, upload: bool, status: i32, err: String| -> Html {
102+
// status of platform upload
103+
let upload_status = |platform: String, upload: bool, status: String| -> Html {
60104
html! {
61-
<h4 class={match upload {true => css!("color: green;"), false => css!("color: red;")}}>{platform}{" Upload Status: "}
105+
<h4 class={match upload {true => css!("display: block;"), false => css!("display: none;")}}>{platform}{" Upload Status: "}
62106
<span class={if (status).to_string().starts_with('2') {css!("color: green;")} else {css!("color: red;")}}>
63-
{status}
107+
{status}{err.deref()}
64108
</span>
65-
if status != 200 {
66-
<p>{err}</p>
67-
}
68109
</h4>
69110
}
70111
};
71112

72-
let upload_to = |platform: String, upload: bool, callback: Callback<Event>| -> Html {
113+
// checkboxes for platform upload selection
114+
let upload_to = |platform: String, platform_state: UseStateHandle<bool>| -> Html {
115+
let on_checkbox_change = {
116+
Callback::from(move |e: Event| {
117+
let checkbox = e.target_dyn_into::<HtmlInputElement>().unwrap();
118+
platform_state.set(checkbox.checked());
119+
})
120+
};
121+
73122
html! {
74123
<li>
75124
<label>
76125
<input
77126
type="checkbox"
78-
checked={upload}
79-
onchange={callback}/>
127+
onchange={on_checkbox_change}/>
80128
{platform}
81129
</label>
82130
</li>
83131
}
84132
};
85133

86-
let update_checkbox = {
87-
Callback::from(move |e| {
88-
// let input = e.target_dyn_into::<HtmlElement>().unwrap();
89-
})
90-
};
91-
134+
// update the character limits
92135
let update_char_count = {
93136
let description = description.clone();
94137
Callback::from(move |e: InputEvent| {
@@ -97,6 +140,18 @@ pub fn add_post() -> Html {
97140
})
98141
};
99142

143+
// set files for upload
144+
let update_imgs = {
145+
let files = files.clone();
146+
Callback::from(move |e: Event| {
147+
let input = e.target_dyn_into::<HtmlInputElement>();
148+
if let Some(f) = input {
149+
let selected_files = f.files().unwrap();
150+
files.set(Some(selected_files));
151+
}
152+
})
153+
};
154+
100155
html! {
101156
if store.admin {
102157
<section class={style}>
@@ -107,18 +162,20 @@ pub fn add_post() -> Html {
107162
// PLATFORM UPLOAD OPTIONS
108163
<p>{"Upload to:"}</p>
109164
<ul>
110-
{upload_to("Discord".to_string(), *discord, update_checkbox.clone())}
111-
{upload_to("Mastodon".to_string(), *mastodon, update_checkbox.clone())}
112-
{upload_to("DevBlog".to_string(), *devblog, update_checkbox)}
165+
{upload_to("Discord".to_string(), discord.clone())}
166+
{upload_to("Mastodon".to_string(), mastodon.clone())}
167+
{upload_to("DevBlog".to_string(), devblog.clone())}
113168
</ul>
114169

115-
<span class="loader">{"Loading..."}</span>
170+
if *loading {
171+
<span class="loader">{"Loading..."}</span>
172+
}
116173

117174
// UPLOAD STATUSES
118175
<div class="upload-status">
119-
{upload_status("Discord".to_string(), *discord.clone(), *discord_status, discord_err.deref().clone())}
120-
{upload_status("Mastodon".to_string(), *mastodon.clone(), *mastodon_status, mastodon_err.deref().clone())}
121-
{upload_status("DevBlog".to_string(), *devblog.clone(), *devblog_status, devblog_err.deref().clone())}
176+
{upload_status("Discord".to_string(), *discord.clone(), discord_status.deref().clone())}
177+
{upload_status("Mastodon".to_string(), *mastodon.clone(), mastodon_status.deref().clone())}
178+
{upload_status("DevBlog".to_string(), *devblog.clone(), devblog_status.deref().clone())}
122179
</div>
123180
</div>
124181

@@ -127,7 +184,8 @@ pub fn add_post() -> Html {
127184
<label>{"Image"}
128185
<input type="file"
129186
required=true
130-
multiple=true/>
187+
multiple=true
188+
onchange={update_imgs}/>
131189
</label>
132190

133191
<label>{"Description"}
@@ -141,6 +199,9 @@ pub fn add_post() -> Html {
141199
<p>{"Preview:"}</p>
142200
<div class="post-preview">
143201
<span>{"preview content:"}</span>
202+
<p>
203+
// {parser}
204+
</p>
144205
</div>
145206
<button>{"Create Post"}</button>
146207
</div>

0 commit comments

Comments
 (0)