loader removed, load all items at once instead
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { Alert, Box, useTheme } from "@mui/material";
|
import { Alert, Box, useTheme } from "@mui/material";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import Item from "../components/Item";
|
import Item from "../components/Item";
|
||||||
@@ -34,7 +34,6 @@ export default function Home() {
|
|||||||
}))
|
}))
|
||||||
];
|
];
|
||||||
|
|
||||||
const [itemsToShow, setItemsToShow] = useState<number>(20); // Anzahl Items, die geladen sind
|
|
||||||
const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
|
const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
|
||||||
const [selectedRating, setSelectedRating] = useState<string | null>(null);
|
const [selectedRating, setSelectedRating] = useState<string | null>(null);
|
||||||
|
|
||||||
@@ -100,53 +99,11 @@ export default function Home() {
|
|||||||
|
|
||||||
|
|
||||||
// Items, die aktuell angezeigt werden
|
// Items, die aktuell angezeigt werden
|
||||||
const visibleItems:Item[] = filteredItems.slice(0, itemsToShow);
|
const visibleItems: Item[] = filteredItems;
|
||||||
|
|
||||||
// Intersection Observer Ref
|
|
||||||
const loaderRef = useRef<HTMLDivElement | null>(null);
|
|
||||||
|
|
||||||
// Container Ref
|
// Container Ref
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
// Callback für Observer
|
|
||||||
const handleObserver = useCallback(
|
|
||||||
(entries: IntersectionObserverEntry[]) => {
|
|
||||||
const target = entries[0];
|
|
||||||
if (target.isIntersecting) {
|
|
||||||
// Wenn noch mehr Items da sind, lade 20 weitere
|
|
||||||
setItemsToShow((prev) => {
|
|
||||||
if (prev >= filteredItems.length) return prev;
|
|
||||||
return prev + 20;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[filteredItems.length]
|
|
||||||
);
|
|
||||||
|
|
||||||
// Observer Setup
|
|
||||||
useEffect(() => {
|
|
||||||
const option = {
|
|
||||||
root: null,
|
|
||||||
rootMargin: "20px",
|
|
||||||
threshold: 1,
|
|
||||||
};
|
|
||||||
const observer = new IntersectionObserver(handleObserver, option);
|
|
||||||
const currentLoaderRef = loaderRef.current;
|
|
||||||
if (currentLoaderRef) observer.observe(currentLoaderRef);
|
|
||||||
return () => {
|
|
||||||
if (currentLoaderRef) observer.unobserve(currentLoaderRef);
|
|
||||||
};
|
|
||||||
}, [handleObserver]);
|
|
||||||
|
|
||||||
// Reset itemsToShow bei Filteränderungen
|
|
||||||
useEffect(() => {
|
|
||||||
setItemsToShow(20);
|
|
||||||
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
containerRef.current?.scrollTo(0, 0);
|
|
||||||
});
|
|
||||||
}, [selectedCategory, selectedRating, priceRange]);
|
|
||||||
|
|
||||||
const prevItemsLength = useRef(items.length);
|
const prevItemsLength = useRef(items.length);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -151,13 +151,6 @@
|
|||||||
margin: 30px
|
margin: 30px
|
||||||
}
|
}
|
||||||
|
|
||||||
.loader-container {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
margin-top: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.no-results {
|
.no-results {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
|
|||||||
Reference in New Issue
Block a user