79 lines
1.7 KiB
TypeScript
79 lines
1.7 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import { useSoundsStore } from "@/stores/sounds-store";
|
|
|
|
export function useGlobalPrefetcher() {
|
|
const {
|
|
hasLoaded,
|
|
setTopSoundEffects,
|
|
setLoading,
|
|
setError,
|
|
setHasLoaded,
|
|
setCurrentPage,
|
|
setHasNextPage,
|
|
setTotalCount,
|
|
} = useSoundsStore();
|
|
|
|
useEffect(() => {
|
|
if (hasLoaded) return;
|
|
|
|
let ignore = false;
|
|
|
|
const prefetchTopSounds = async () => {
|
|
try {
|
|
if (!ignore) {
|
|
setLoading(true);
|
|
setError(null);
|
|
}
|
|
|
|
const response = await fetch(
|
|
"/api/sounds/search?page_size=50&sort=downloads"
|
|
);
|
|
|
|
if (!ignore) {
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to fetch: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
setTopSoundEffects(data.results);
|
|
setHasLoaded(true);
|
|
|
|
// Set pagination state for top sounds
|
|
setCurrentPage(1);
|
|
setHasNextPage(!!data.next);
|
|
setTotalCount(data.count);
|
|
}
|
|
} catch (error) {
|
|
if (!ignore) {
|
|
console.error("Failed to prefetch top sounds:", error);
|
|
setError(
|
|
error instanceof Error ? error.message : "Failed to load sounds"
|
|
);
|
|
}
|
|
} finally {
|
|
if (!ignore) {
|
|
setLoading(false);
|
|
}
|
|
}
|
|
};
|
|
|
|
const timeoutId = setTimeout(prefetchTopSounds, 100);
|
|
|
|
return () => {
|
|
clearTimeout(timeoutId);
|
|
ignore = true;
|
|
};
|
|
}, [
|
|
hasLoaded,
|
|
setTopSoundEffects,
|
|
setLoading,
|
|
setError,
|
|
setHasLoaded,
|
|
setCurrentPage,
|
|
setHasNextPage,
|
|
setTotalCount,
|
|
]);
|
|
}
|