1
- use std:: { fs:: File , ops:: Deref } ;
2
-
3
1
use crate :: { helpers, store:: Store , Api } ;
4
2
use gloo_net:: http:: Method ;
5
- // use gloo::file::File ;
3
+ use std :: ops :: Deref ;
6
4
use stylist:: { css, Style } ;
7
- use web_sys:: HtmlTextAreaElement ;
5
+ use web_sys:: { FileList , FormData , HtmlInputElement , HtmlTextAreaElement } ;
8
6
use yew:: prelude:: * ;
9
7
use yewdux:: use_store_value;
10
8
@@ -13,19 +11,17 @@ const STYLE: &str = include_str!("styles/postAdd.css");
13
11
#[ function_component( AddPost ) ]
14
12
pub fn add_post ( ) -> Html {
15
13
let style = Style :: new ( STYLE ) . unwrap ( ) ;
14
+ let files: UseStateHandle < Option < FileList > > = use_state ( || None ) ;
16
15
let description = use_state ( || String :: default ( ) ) ;
17
16
let char_count = use_state ( || 0 ) ;
18
- // let files = use_state(|| vec![File::open("Hello.txt").unwrap()]);
19
17
let loading = use_state ( || false ) ;
20
18
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 ( ) ) ;
23
20
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 ( ) ) ;
26
22
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 ( ) ) ;
29
25
let store = use_store_value :: < Store > ( ) ;
30
26
31
27
let char_count_clone = char_count. clone ( ) ;
@@ -34,61 +30,108 @@ pub fn add_post() -> Html {
34
30
char_count_clone. set ( description_clone. len ( ) ) ;
35
31
} ) ;
36
32
33
+ // create post
37
34
let onsubmit = {
38
35
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
+
39
41
let discord = * discord. clone ( ) ;
42
+ let discord_status = discord_status. clone ( ) ;
43
+
40
44
let mastodon = * mastodon. clone ( ) ;
45
+ let mastodon_status = mastodon_status. clone ( ) ;
46
+
41
47
let devblog = * devblog. clone ( ) ;
48
+ let devblog_status = devblog_status. clone ( ) ;
49
+
42
50
Callback :: from ( move |e : SubmitEvent | {
43
51
e. prevent_default ( ) ;
44
52
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
+
45
60
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
+ }
46
75
47
76
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 ;
49
80
50
81
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 ) ;
55
98
} ) ;
56
99
} )
57
100
} ;
58
101
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 {
60
104
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: " }
62
106
<span class={ if ( status) . to_string( ) . starts_with( '2' ) { css!( "color: green;" ) } else { css!( "color: red;" ) } } >
63
- { status}
107
+ { status} { err . deref ( ) }
64
108
</span>
65
- if status != 200 {
66
- <p>{ err} </p>
67
- }
68
109
</h4>
69
110
}
70
111
} ;
71
112
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
+
73
122
html ! {
74
123
<li>
75
124
<label>
76
125
<input
77
126
type ="checkbox"
78
- checked={ upload}
79
- onchange={ callback} />
127
+ onchange={ on_checkbox_change} />
80
128
{ platform}
81
129
</label>
82
130
</li>
83
131
}
84
132
} ;
85
133
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
92
135
let update_char_count = {
93
136
let description = description. clone ( ) ;
94
137
Callback :: from ( move |e : InputEvent | {
@@ -97,6 +140,18 @@ pub fn add_post() -> Html {
97
140
} )
98
141
} ;
99
142
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
+
100
155
html ! {
101
156
if store. admin {
102
157
<section class={ style} >
@@ -107,18 +162,20 @@ pub fn add_post() -> Html {
107
162
// PLATFORM UPLOAD OPTIONS
108
163
<p>{ "Upload to:" } </p>
109
164
<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 ( ) ) }
113
168
</ul>
114
169
115
- <span class="loader" >{ "Loading..." } </span>
170
+ if * loading {
171
+ <span class="loader" >{ "Loading..." } </span>
172
+ }
116
173
117
174
// UPLOAD STATUSES
118
175
<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( ) ) }
122
179
</div>
123
180
</div>
124
181
@@ -127,7 +184,8 @@ pub fn add_post() -> Html {
127
184
<label>{ "Image" }
128
185
<input type ="file"
129
186
required=true
130
- multiple=true />
187
+ multiple=true
188
+ onchange={ update_imgs} />
131
189
</label>
132
190
133
191
<label>{ "Description" }
@@ -141,6 +199,9 @@ pub fn add_post() -> Html {
141
199
<p>{ "Preview:" } </p>
142
200
<div class="post-preview" >
143
201
<span>{ "preview content:" } </span>
202
+ <p>
203
+ // {parser}
204
+ </p>
144
205
</div>
145
206
<button>{ "Create Post" } </button>
146
207
</div>
0 commit comments