rss bug fixes
This commit is contained in:
@@ -13,7 +13,6 @@ pub struct Project {
|
||||
pub code_url: String,
|
||||
}
|
||||
|
||||
// Deine vordefinierte Liste
|
||||
fn get_all_projects() -> Vec<Project> {
|
||||
vec![
|
||||
Project {
|
||||
@@ -27,12 +26,20 @@ fn get_all_projects() -> Vec<Project> {
|
||||
Project {
|
||||
id: 2,
|
||||
title: "Anderes Projekt".into(),
|
||||
description: "Beschreibung deines zweiten Projekts hier.".into(),
|
||||
description: "Ein weiteres Beispielprojekt mit einer etwas längeren Beschreibung, um das Grid zu testen.".into(),
|
||||
image_url: "/assets/bytemalte_de.png".into(),
|
||||
download_url: "#".into(),
|
||||
code_url: "#".into(),
|
||||
},
|
||||
// Füge hier weitere hinzu...
|
||||
Project {
|
||||
id: 3,
|
||||
title: "Projekt Drei".into(),
|
||||
description: "Hier ist ein drittes Projekt, das ebenfalls in der Liste erscheint.".into(),
|
||||
image_url: "/assets/Logo.jpg".into(),
|
||||
download_url: "#".into(),
|
||||
code_url: "#".into(),
|
||||
},
|
||||
// Füge hier weitere Projekte hinzu...
|
||||
]
|
||||
}
|
||||
|
||||
@@ -41,14 +48,13 @@ pub fn HomePage() -> impl IntoView {
|
||||
let items_per_page = 3;
|
||||
let all_data = get_all_projects();
|
||||
|
||||
// WICHTIG: Wir laden die erste Seite direkt hier für das SSR!
|
||||
// Initialer Zustand für SSR & Client
|
||||
let initial_projects = all_data.iter().take(items_per_page).cloned().collect::<Vec<_>>();
|
||||
let has_more_initially = all_data.len() > items_per_page;
|
||||
|
||||
|
||||
let (projects, set_projects) = signal(initial_projects);
|
||||
let (page, set_page) = signal(1);
|
||||
let (loading, set_loading) = signal(false);
|
||||
let (all_loaded, set_all_loaded) = signal(!has_more_initially);
|
||||
let (all_loaded, set_all_loaded) = signal(all_data.len() <= items_per_page);
|
||||
|
||||
let sentinel = NodeRef::<Div>::new();
|
||||
|
||||
@@ -66,7 +72,7 @@ pub fn HomePage() -> impl IntoView {
|
||||
return;
|
||||
}
|
||||
|
||||
// Simuliere Netzwerk-Delay für den Spinner
|
||||
// Kurze Verzögerung für den Lade-Effekt
|
||||
set_timeout(move || {
|
||||
let slice = all_my_projects[start..end].to_vec();
|
||||
set_projects.update(|projs| projs.extend(slice));
|
||||
@@ -75,10 +81,9 @@ pub fn HomePage() -> impl IntoView {
|
||||
set_all_loaded.set(true);
|
||||
}
|
||||
set_loading.set(false);
|
||||
}, std::time::Duration::from_millis(300));
|
||||
}, std::time::Duration::from_millis(200));
|
||||
};
|
||||
|
||||
// Scroll-Event-Listener (Nur im Browser aktiv)
|
||||
Effect::new(move |_| {
|
||||
let w = window();
|
||||
let w_clone = w.clone();
|
||||
@@ -92,10 +97,10 @@ pub fn HomePage() -> impl IntoView {
|
||||
let inner_height = w_clone.inner_height().unwrap().as_f64().unwrap_or(0.0);
|
||||
let total_height = el.offset_height() as f64;
|
||||
|
||||
if scroll_y + inner_height >= total_height - 250.0 {
|
||||
let next_page = page.get_untracked();
|
||||
set_page.set(next_page + 1);
|
||||
fetch_projects(next_page);
|
||||
if scroll_y + inner_height >= total_height - 300.0 {
|
||||
let current_page = page.get_untracked();
|
||||
set_page.set(current_page + 1);
|
||||
fetch_projects(current_page);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,7 +115,8 @@ pub fn HomePage() -> impl IntoView {
|
||||
<p>"Entdecke meine neuesten Projekte."</p>
|
||||
</header>
|
||||
|
||||
<main class="projects-grid">
|
||||
// Der Container MUSS die Klasse projects-grid haben
|
||||
<div class="projects-grid">
|
||||
<For
|
||||
each=move || projects.get()
|
||||
key=|p| p.id
|
||||
@@ -124,15 +130,15 @@ pub fn HomePage() -> impl IntoView {
|
||||
<h3>{p.title}</h3>
|
||||
<p>{p.description}</p>
|
||||
<div class="project-links">
|
||||
<a href=p.download_url target="_blank" class="btn-download">"Download"</a>
|
||||
<a href=p.code_url target="_blank" class="btn-code">"Source Code"</a>
|
||||
<a href=p.download_url target="_blank" rel="noopener noreferrer" class="btn-download">"Download"</a>
|
||||
<a href=p.code_url target="_blank" rel="noopener noreferrer" class="btn-code">"Source Code"</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
/>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<div node_ref=sentinel class="loading-trigger">
|
||||
{move || match (loading.get(), all_loaded.get()) {
|
||||
|
||||
Reference in New Issue
Block a user