|
|
|
|
@ -14,9 +14,8 @@ use yew_router::prelude::*;
|
|
|
|
|
/// Submit page component.
|
|
|
|
|
///
|
|
|
|
|
/// Provides a form for creating a new quote with fields for text, author,
|
|
|
|
|
/// source, date, tags, and an optional custom auth code. On success, displays
|
|
|
|
|
/// the returned auth code prominently so the user can save it, and stores it
|
|
|
|
|
/// in session storage for immediate use.
|
|
|
|
|
/// source, date, tags, and an optional custom auth code. On success, navigates
|
|
|
|
|
/// directly to the quote detail page and stores the auth code in session storage.
|
|
|
|
|
#[function_component(SubmitPage)]
|
|
|
|
|
pub fn submit_page() -> Html {
|
|
|
|
|
let text = use_state(String::new);
|
|
|
|
|
@ -27,8 +26,8 @@ pub fn submit_page() -> Html {
|
|
|
|
|
let custom_auth = use_state(String::new);
|
|
|
|
|
let submitting = use_state(|| false);
|
|
|
|
|
let error: UseStateHandle<Option<String>> = use_state(|| None);
|
|
|
|
|
let success: UseStateHandle<Option<(String, String)>> = use_state(|| None); // (quote_id, auth_code)
|
|
|
|
|
let turnstile_token: UseStateHandle<Option<String>> = use_state(|| None);
|
|
|
|
|
let navigator = use_navigator().unwrap();
|
|
|
|
|
|
|
|
|
|
// Register the Turnstile callback in the global window object.
|
|
|
|
|
{
|
|
|
|
|
@ -57,7 +56,7 @@ pub fn submit_page() -> Html {
|
|
|
|
|
let custom_auth = custom_auth.clone();
|
|
|
|
|
let submitting = submitting.clone();
|
|
|
|
|
let error = error.clone();
|
|
|
|
|
let success = success.clone();
|
|
|
|
|
let navigator = navigator.clone();
|
|
|
|
|
let turnstile_token = turnstile_token.clone();
|
|
|
|
|
Callback::from(move |e: SubmitEvent| {
|
|
|
|
|
e.prevent_default();
|
|
|
|
|
@ -114,12 +113,13 @@ pub fn submit_page() -> Html {
|
|
|
|
|
|
|
|
|
|
let submitting = submitting.clone();
|
|
|
|
|
let error = error.clone();
|
|
|
|
|
let success = success.clone();
|
|
|
|
|
let navigator = navigator.clone();
|
|
|
|
|
spawn_local(async move {
|
|
|
|
|
match api::create_quote(&input).await {
|
|
|
|
|
Ok(resp) => {
|
|
|
|
|
storage::set_auth_code(&resp.quote.id, &resp.auth_code);
|
|
|
|
|
success.set(Some((resp.quote.id, resp.auth_code)));
|
|
|
|
|
storage::mark_new_quote(&resp.quote.id);
|
|
|
|
|
navigator.push(&Route::QuoteDetail { id: resp.quote.id });
|
|
|
|
|
submitting.set(false);
|
|
|
|
|
}
|
|
|
|
|
Err(ApiError::Server { status, message }) => {
|
|
|
|
|
@ -135,30 +135,6 @@ pub fn submit_page() -> Html {
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if let Some((quote_id, auth_code)) = (*success).clone() {
|
|
|
|
|
return html! {
|
|
|
|
|
<div class="page-submit page-submit--success">
|
|
|
|
|
<h1 class="page-submit__title">{ "Quote Submitted!" }</h1>
|
|
|
|
|
<p>{ "Your quote has been added. Save your auth code below — you'll need it to edit or delete this quote." }</p>
|
|
|
|
|
<div class="page-submit__auth-code-box">
|
|
|
|
|
<strong>{ "Auth Code: " }</strong>
|
|
|
|
|
<code class="page-submit__auth-code">{ &auth_code }</code>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="page-submit__actions">
|
|
|
|
|
<Link<Route>
|
|
|
|
|
to={Route::QuoteDetail { id: quote_id.clone() }}
|
|
|
|
|
classes="btn btn--primary"
|
|
|
|
|
>
|
|
|
|
|
{ "View your quote" }
|
|
|
|
|
</Link<Route>>
|
|
|
|
|
<Link<Route> to={Route::Browse} classes="btn">
|
|
|
|
|
{ "Browse all quotes" }
|
|
|
|
|
</Link<Route>>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
html! {
|
|
|
|
|
<div class="page-submit">
|
|
|
|
|
<h1 class="page-submit__title">{ "Submit a Quote" }</h1>
|
|
|
|
|
|