diff --git a/app/src/infra/functional.rs b/app/src/infra/functional.rs index 2e2cbb5..8d3fac5 100644 --- a/app/src/infra/functional.rs +++ b/app/src/infra/functional.rs @@ -2,7 +2,7 @@ use crate::infra::api::HostService; use anyhow::Result; use graphql_client::GraphQLQuery; use wasm_bindgen_futures::spawn_local; -use yew::{use_effect, use_state, UseStateHandle}; +use yew::{use_effect, use_state_eq, UseStateHandle}; // Enum to represent a result that is fetched asynchronously. #[derive(Debug)] @@ -13,14 +13,28 @@ pub enum LoadableResult { Loaded(Result), } +impl PartialEq for LoadableResult { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (LoadableResult::Loading, LoadableResult::Loading) => true, + (LoadableResult::Loaded(Ok(d1)), LoadableResult::Loaded(Ok(d2))) => d1.eq(d2), + (LoadableResult::Loaded(Err(e1)), LoadableResult::Loaded(Err(e2))) => { + e1.to_string().eq(&e2.to_string()) + } + _ => false, + } + } +} + pub fn use_graphql_call( variables: QueryType::Variables, ) -> UseStateHandle> where QueryType: GraphQLQuery + 'static, + ::ResponseData: std::cmp::PartialEq, { let loadable_result: UseStateHandle> = - use_state(|| LoadableResult::Loading); + use_state_eq(|| LoadableResult::Loading); { let loadable_result = loadable_result.clone(); use_effect(move || {