index.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { FC, MouseEventHandler } from 'react';
  2. import Image from 'next/image';
  3. import { Recipe } from '@/types/recipes';
  4. import Heart from '@/components/Icon/heart';
  5. import { Subtitle } from '@/components/Typography';
  6. import dayjs from 'dayjs';
  7. import duration from 'dayjs/plugin/duration';
  8. import styles from './RecipeItem.module.css';
  9. import Time from '../Icon/time';
  10. import classNames from 'classnames';
  11. dayjs.extend(duration);
  12. type RecipeItemProps = {
  13. tagName?: keyof JSX.IntrinsicElements,
  14. onClick?: MouseEventHandler,
  15. recipe: Recipe,
  16. };
  17. export const RecipeItem: FC<RecipeItemProps> = ({ tagName, recipe, onClick }) => {
  18. const Tag = tagName as keyof JSX.IntrinsicElements;
  19. return (
  20. <Tag className={classNames(styles.recipeItem, {
  21. [styles.recipeItemClickeable]: !!onClick,
  22. })} onClick={onClick}>
  23. <div className={styles.recipeItemMedia}>
  24. {recipe.image && <Image src={`http://localhost:3000/${recipe.image}`} alt={recipe.name} layout='fill' />}
  25. </div>
  26. <div className={styles.recipeItemContent}>
  27. <Subtitle alternative>{recipe.name}</Subtitle>
  28. <p className={styles.recipeItemContentDescription}>
  29. <Time />
  30. {`${dayjs.duration(recipe.details.cookingTime).add(recipe.details.preparationTime).asMinutes()}'` || '-'}</p>
  31. </div>
  32. <div className={styles.recipeItemAction}>
  33. <Heart />
  34. </div>
  35. </Tag>
  36. )
  37. };
  38. RecipeItem.defaultProps = {
  39. tagName: 'div',
  40. };
  41. export default RecipeItem;