mirror of
https://github.com/leptos-rs/leptos.git
synced 2026-05-16 18:23:55 -04:00
* fix(CI): toolchain will be determined and test against by CI * chore: formatting examples * fix: clippy
95 lines
2.3 KiB
Rust
95 lines
2.3 KiB
Rust
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
|
|
|
pub fn story(path: &str) -> String {
|
|
format!("https://node-hnapi.herokuapp.com/{path}")
|
|
}
|
|
|
|
pub fn user(path: &str) -> String {
|
|
format!("https://hacker-news.firebaseio.com/v0/user/{path}.json")
|
|
}
|
|
|
|
#[cfg(not(feature = "ssr"))]
|
|
pub fn fetch_api<T>(
|
|
path: &str,
|
|
) -> impl std::future::Future<Output = Option<T>> + Send + '_
|
|
where
|
|
T: Serialize + DeserializeOwned,
|
|
{
|
|
use leptos::prelude::on_cleanup;
|
|
use send_wrapper::SendWrapper;
|
|
|
|
SendWrapper::new(async move {
|
|
let abort_controller =
|
|
SendWrapper::new(web_sys::AbortController::new().ok());
|
|
let abort_signal = abort_controller.as_ref().map(|a| a.signal());
|
|
|
|
// abort in-flight requests if, e.g., we've navigated away from this page
|
|
on_cleanup(move || {
|
|
if let Some(abort_controller) = abort_controller.take() {
|
|
abort_controller.abort()
|
|
}
|
|
});
|
|
|
|
gloo_net::http::Request::get(path)
|
|
.abort_signal(abort_signal.as_ref())
|
|
.send()
|
|
.await
|
|
.map_err(|e| log::error!("{e}"))
|
|
.ok()?
|
|
.json()
|
|
.await
|
|
.ok()
|
|
})
|
|
}
|
|
|
|
#[cfg(feature = "ssr")]
|
|
pub async fn fetch_api<T>(path: &str) -> Option<T>
|
|
where
|
|
T: Serialize + DeserializeOwned,
|
|
{
|
|
reqwest::get(path)
|
|
.await
|
|
.map_err(|e| log::error!("{e}"))
|
|
.ok()?
|
|
.json()
|
|
.await
|
|
.ok()
|
|
}
|
|
|
|
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
|
|
pub struct Story {
|
|
pub id: usize,
|
|
pub title: String,
|
|
pub points: Option<i32>,
|
|
pub user: Option<String>,
|
|
pub time: usize,
|
|
pub time_ago: String,
|
|
#[serde(alias = "type")]
|
|
pub story_type: String,
|
|
pub url: String,
|
|
#[serde(default)]
|
|
pub domain: String,
|
|
#[serde(default)]
|
|
pub comments: Option<Vec<Comment>>,
|
|
pub comments_count: Option<usize>,
|
|
}
|
|
|
|
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
|
|
pub struct Comment {
|
|
pub id: usize,
|
|
pub level: usize,
|
|
pub user: Option<String>,
|
|
pub time: usize,
|
|
pub time_ago: String,
|
|
pub content: Option<String>,
|
|
pub comments: Vec<Comment>,
|
|
}
|
|
|
|
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
|
|
pub struct User {
|
|
pub created: usize,
|
|
pub id: String,
|
|
pub karma: i32,
|
|
pub about: Option<String>,
|
|
}
|