Skip to content

Commit 3c19755

Browse files
committed
Add post_add
1 parent 35d3f27 commit 3c19755

File tree

4 files changed

+144
-12
lines changed

4 files changed

+144
-12
lines changed

devblog/devblog/client/src/components/comment.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use crate::{
88
use chrono::{Local, TimeZone};
99
use gloo::console::log;
1010
use stylist::Style;
11-
use web_sys::MouseEvent;
12-
use yew::{function_component, html, use_effect_with, use_state, Callback, Html, Properties};
11+
use yew::{function_component, html, use_state, Callback, Html, Properties};
1312
use yewdux::use_store_value;
1413

1514
const STYLE: &str = include_str!("styles/comment.css");
@@ -39,7 +38,6 @@ pub fn comment(props: &Props) -> Html {
3938
let on_edit_save = move |value: String| {
4039
log!("SAVE EDIT COMMENT");
4140
content_clone.set(value);
42-
// props.comment.content = "HOOOOYAHHHH".to_string();
4341
};
4442

4543
html! {
@@ -78,7 +76,6 @@ pub fn comment(props: &Props) -> Html {
7876
}
7977

8078
// CONTENT
81-
// <p>{&props.comment.content}</p>
8279
<p>{content.deref()}</p>
8380
</div>
8481
</div>

devblog/devblog/client/src/components/navbar.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ pub fn navbar() -> Html {
2323
<div class="nav-menus-container">
2424
<Link<Route> to={Route::Home}>{"Home"}</Link<Route>>
2525
<Link<Route> to={Route::Posts}>{"Posts"}</Link<Route>>
26-
<Link<Route> to={Route::AddPost}>{"AddPost"}</Link<Route>>
2726
<Link<Route> to={Route::About}>{"About"}</Link<Route>>
2827

2928
if store.admin {
Lines changed: 134 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,144 @@
1-
use stylist::Style;
1+
use std::{fs::File, ops::Deref};
2+
3+
use crate::{router::Route, store::Store, Api};
4+
use gloo::console::log;
5+
use gloo_net::http::{Headers, Method};
6+
// use gloo::file::File;
7+
use stylist::{css, Style};
28
use yew::prelude::*;
9+
use yew_router::components::Link;
10+
use yewdux::use_store_value;
311

4-
const STYLE: &str = include_str!("styles/signUp.css");
12+
const STYLE: &str = include_str!("styles/postAdd.css");
513

614
#[function_component(AddPost)]
715
pub fn add_post() -> Html {
816
let style = Style::new(STYLE).unwrap();
17+
let description = use_state(|| String::default());
18+
let char_count = use_state(|| 0);
19+
// let files = use_state(|| vec![File::open("Hello.txt").unwrap()]);
20+
let loading = use_state(|| false);
21+
let devblog = use_state(|| false);
22+
let devblog_status = use_state(|| 0);
23+
let devblog_err = use_state(|| String::default());
24+
let mastodon = use_state(|| false);
25+
let mastodon_status = use_state(|| 0);
26+
let mastodon_err = use_state(|| String::default());
27+
let discord = use_state(|| false);
28+
let discord_status = use_state(|| 0);
29+
let discord_err = use_state(|| String::default());
30+
let store = use_store_value::<Store>();
31+
32+
// let char_count_clone = char_count.clone();
33+
use_effect(move || {
34+
// char_count_clone.set(description.len()); // causing page to not load
35+
log!("FIRST RENDER");
36+
});
37+
38+
let onsubmit = {
39+
let store = store.clone();
40+
let discord = *discord.clone();
41+
let mastodon = *mastodon.clone();
42+
let devblog = *devblog.clone();
43+
Callback::from(move |e: SubmitEvent| {
44+
e.prevent_default();
45+
loading.set(true);
46+
let auth = format!("Bearer {}", store.token);
47+
let hdrs = Headers::new();
48+
hdrs.append("Authorization", &auth);
49+
hdrs.append("content-type", "application/json");
50+
51+
wasm_bindgen_futures::spawn_local(async move {
52+
let response = Api::AddPost.fetch(Some(hdrs), None, Method::POST).await;
53+
54+
if let Some(res) = response {
55+
if discord {}
56+
if mastodon {}
57+
if devblog {}
58+
};
59+
});
60+
})
61+
};
62+
63+
let upload_status = |platform: String, upload: bool, status: i32, err: String| -> Html {
64+
html! {
65+
<h4 class={match upload {true => css!("color: green;"), false => css!("color: red;")}}>{platform}{" Upload Status: "}
66+
<span class={if (status).to_string().starts_with('2') {css!("color: green;")} else {css!("color: red;")}}>
67+
{status}
68+
</span>
69+
if status != 200 {
70+
<p>{err}</p>
71+
}
72+
</h4>
73+
}
74+
};
75+
76+
let upload_to = |platform: String, upload: bool, callback: Callback<Event>| -> Html {
77+
html! {
78+
<li>
79+
<label>
80+
<input
81+
type="checkbox"
82+
checked={upload}
83+
onchange={callback}/>
84+
{platform}
85+
</label>
86+
</li>
87+
}
88+
};
89+
90+
let onchange = { Callback::from(move |e: Event| {}) };
991

1092
html! {
11-
<section class={style}>
12-
<div class="create-post">
13-
<h1>{"Add Post Page"}</h1>
14-
</div>
15-
</section>
93+
if store.admin {
94+
<section class={style}>
95+
<div class="create-post">
96+
<form {onsubmit}>
97+
<div class="upload-platforms">
98+
99+
// PLATFORM UPLOAD OPTIONS
100+
<p>{"Upload to:"}</p>
101+
<ul>
102+
{upload_to("Discord".to_string(), *discord, onchange.clone())}
103+
{upload_to("Mastodon".to_string(), *mastodon, onchange.clone())}
104+
{upload_to("DevBlog".to_string(), *devblog, onchange)}
105+
</ul>
106+
107+
<span class="loader">{"Loading..."}</span>
108+
109+
// UPLOAD STATUSES
110+
<div class="upload-status">
111+
{upload_status("Discord".to_string(), *discord.clone(), *discord_status, discord_err.deref().clone())}
112+
{upload_status("Mastodon".to_string(), *mastodon.clone(), *mastodon_status, mastodon_err.deref().clone())}
113+
{upload_status("DevBlog".to_string(), *devblog.clone(), *devblog_status, devblog_err.deref().clone())}
114+
</div>
115+
</div>
116+
117+
// NEW POST INFO
118+
<div class="new-post-info">
119+
<label>{"Image"}
120+
<input type="file"
121+
required=true
122+
multiple=true/>
123+
</label>
124+
125+
<label>{"Description"}
126+
<p>{"Mastodon character limit: "}{*char_count}{"/500"}</p>
127+
<p>{"Discord character limit: "}{*char_count}{"/2000"}</p>
128+
<div class="addpost-description">
129+
<textarea placeholder="Write description here..."/>
130+
</div>
131+
</label>
132+
133+
<p>{"Preview:"}</p>
134+
<div class="post-preview">
135+
<span>{"preview content:"}</span>
136+
</div>
137+
<button>{"Create Post"}</button>
138+
</div>
139+
</form>
140+
</div>
141+
</section>
142+
}
16143
}
17144
}

devblog/devblog/client/src/pages/posts.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
use crate::{
22
components::{pager::Pager, post::Post},
33
helpers::{self, CustomCallback},
4+
router::Route,
5+
store::Store,
46
Api, PostModel,
57
};
68
use gloo_net::http::Method;
79
use stylist::Style;
810
use yew::prelude::*;
11+
use yew_router::components::Link;
12+
use yewdux::use_store_value;
913

1014
const STYLE: &str = include_str!("styles/posts.css");
1115

1216
#[function_component(Posts)]
1317
pub fn posts() -> Html {
1418
let style = Style::new(STYLE).unwrap();
19+
let store = use_store_value::<Store>();
1520
let loading = use_state(|| true);
1621
let page_num = use_state(|| 1i32);
1722
let posts = use_state(|| vec![PostModel::default()]);
@@ -76,6 +81,10 @@ pub fn posts() -> Html {
7681
<div class="posts">
7782
<Pager page_num={*page_num} on_click={&on_pager_click} total_pages={*pages_count}/>
7883

84+
if store.admin {
85+
<Link<Route> to={Route::AddPost}>{"Create Post"}</Link<Route>>
86+
}
87+
7988
// ALL POSTS
8089
if *loading {
8190
{for posts.iter().enumerate().map(|(idx, post)| html! {

0 commit comments

Comments
 (0)