45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
/**
|
|
* Homepage data — fetches featured plants from the Turso DB.
|
|
* Uses React's cache() to ensure one fetch per render pass.
|
|
* Backed by the async fetch for SSR but stays sync in exported interface
|
|
* via a module-level cache pattern.
|
|
*/
|
|
|
|
import { unstable_cache } from "next/cache";
|
|
|
|
// Re-export the type for convenience
|
|
export type { PlantCardData } from "@/components/PlantCard";
|
|
|
|
/**
|
|
* Get featured plants for the homepage.
|
|
* Cached via next/cache to avoid repeated DB calls.
|
|
*/
|
|
export const getFeaturedPlants = unstable_cache(
|
|
async () => {
|
|
const { getBrowsePlants } = await import("./browse");
|
|
const all = await getBrowsePlants();
|
|
const FEATURED_IDS = [
|
|
"tomato",
|
|
"basil",
|
|
"rose",
|
|
"monstera",
|
|
"snake-plant",
|
|
"pepper",
|
|
"apple",
|
|
"corn",
|
|
"wheat",
|
|
"strawberry",
|
|
"blueberry",
|
|
"lettuce",
|
|
];
|
|
const featured = all.filter((p) => FEATURED_IDS.includes(p.id));
|
|
if (featured.length < 6) {
|
|
const rest = all.filter((p) => !FEATURED_IDS.includes(p.id));
|
|
return [...featured, ...rest].slice(0, 12);
|
|
}
|
|
return featured.slice(0, 12);
|
|
},
|
|
["featured-plants"],
|
|
{ revalidate: 3600 },
|
|
);
|