@ -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 ( ) {