fix(quotesdb): home page friendly empty state when no quotes

Detect 404 from random quote endpoint and render a friendly
'Nothing here yet — Submit a quote!' message with a link to
/submit instead of the generic error display.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
Elijah Voigt 3 months ago
parent 8086ca06a1
commit cd3afa1920

@ -1,6 +1,6 @@
//! Home page — displays a random quote on load. //! Home page — displays a random quote on load.
use crate::api; use crate::api::{self, ApiError};
use crate::components::error::ErrorDisplay; use crate::components::error::ErrorDisplay;
use crate::components::quote_card::QuoteCard; use crate::components::quote_card::QuoteCard;
use crate::Route; use crate::Route;
@ -17,11 +17,13 @@ use yew_router::prelude::*;
pub fn home_page() -> Html { pub fn home_page() -> Html {
let quote: UseStateHandle<Option<Quote>> = use_state(|| None); let quote: UseStateHandle<Option<Quote>> = use_state(|| None);
let error: UseStateHandle<Option<String>> = use_state(|| None); let error: UseStateHandle<Option<String>> = use_state(|| None);
let empty = use_state(|| false);
let loading = use_state(|| true); let loading = use_state(|| true);
{ {
let quote = quote.clone(); let quote = quote.clone();
let error = error.clone(); let error = error.clone();
let empty = empty.clone();
let loading = loading.clone(); let loading = loading.clone();
use_effect_with((), move |_| { use_effect_with((), move |_| {
spawn_local(async move { spawn_local(async move {
@ -30,6 +32,10 @@ pub fn home_page() -> Html {
quote.set(Some(q)); quote.set(Some(q));
loading.set(false); loading.set(false);
} }
Err(ApiError::Server { status: 404, .. }) => {
empty.set(true);
loading.set(false);
}
Err(e) => { Err(e) => {
error.set(Some(e.to_string())); error.set(Some(e.to_string()));
loading.set(false); loading.set(false);
@ -46,6 +52,13 @@ pub fn home_page() -> Html {
if *loading { if *loading {
<p class="page-home__loading">{ "Loading..." }</p> <p class="page-home__loading">{ "Loading..." }</p>
} else if *empty {
<div class="page-home__empty">
<p>{ "Nothing here yet." }</p>
<Link<Route> to={Route::Submit} classes="btn btn--primary">
{ "Submit a quote!" }
</Link<Route>>
</div>
} else if let Some(err) = (*error).clone() { } else if let Some(err) = (*error).clone() {
<ErrorDisplay message={err} /> <ErrorDisplay message={err} />
} else if let Some(q) = (*quote).clone() { } else if let Some(q) = (*quote).clone() {

Loading…
Cancel
Save