Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 'use client'; import { Center, SimpleGrid, Skeleton, Stack, Text } from '@mantine/core'; import { IconMoodSad } from '@tabler/icons-react'; import { useTranslations } from 'next-intl'; import RecipeCard from './RecipeCard'; import type { RecipeGridProps } from './types'; const SKELETON_ITEMS = [1, 2, 3, 4, 5, 6, 7, 8]; const RecipeGrid = ({ recipes, loading = false, withFavorite = true, emptyMessage, columns = { base: 1, sm: 2, md: 3, lg: 4 }, }: RecipeGridProps) => { const t = useTranslations('recipe'); const empty = emptyMessage ?? t('empty'); if (loading) { return ( <SimpleGrid cols={columns}> {SKELETON_ITEMS.map((item) => ( <Skeleton key={`skeleton-${item}`} height={320} radius="md" /> ))} </SimpleGrid> ); } if (!recipes.length) { return ( <Center py="xl"> <Stack align="center" gap="xs"> <IconMoodSad size={48} color="var(--mantine-color-dimmed)" /> <Text c="dimmed" size="lg"> {empty} </Text> </Stack> </Center> ); } return ( <SimpleGrid cols={columns}> {recipes.map((recipe) => ( <RecipeCard key={recipe.id} recipe={recipe} withFavorite={withFavorite} /> ))} </SimpleGrid> ); }; export default RecipeGrid; |