|
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}; |
2 | 8 | use yew::prelude::*;
|
| 9 | +use yew_router::components::Link; |
| 10 | +use yewdux::use_store_value; |
3 | 11 |
|
4 |
| -const STYLE: &str = include_str!("styles/signUp.css"); |
| 12 | +const STYLE: &str = include_str!("styles/postAdd.css"); |
5 | 13 |
|
6 | 14 | #[function_component(AddPost)]
|
7 | 15 | pub fn add_post() -> Html {
|
8 | 16 | 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| {}) }; |
9 | 91 |
|
10 | 92 | 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 | + } |
16 | 143 | }
|
17 | 144 | }
|
0 commit comments