diff --git a/components/Heart/Heart.tsx b/components/Heart/Heart.tsx new file mode 100644 index 0000000..14cd890 --- /dev/null +++ b/components/Heart/Heart.tsx @@ -0,0 +1,46 @@ +import { useState } from 'react'; + +import HeartIcon from './HeartIcon'; + +interface HeartProps { + initialCount: number; + onClick?: () => void; +} + +/** + * Heart count component + * @param {number} initialCount - 초기 카운트 수 + * @param {function} onClick - 클릭 시 동작 할 이벤트(옵션) + * @example console.log('클릭')} /> + */ +export default function Heart({ initialCount, onClick }: HeartProps) { + const [isClicked, setIsClicked] = useState(false); + const [count, setCount] = useState(initialCount); + + const handleClick = () => { + if (onClick) { + onClick(); + setIsClicked((prev) => !prev); + setCount((prevCount) => (isClicked ? prevCount - 1 : prevCount + 1)); + } + }; + + const clickStyles = { + icon: isClicked ? 'var(--red-100)' : 'var(--gray-400)', + text: isClicked && 'text-red-100', + }; + + const Wrapper = onClick ? 'button' : 'div'; + + return ( + + + + {count} + + + ); +} diff --git a/components/Heart/HeartIcon.tsx b/components/Heart/HeartIcon.tsx new file mode 100644 index 0000000..a1d461f --- /dev/null +++ b/components/Heart/HeartIcon.tsx @@ -0,0 +1,19 @@ +/** + * Heart icon + * @param {string} fill - 색상 + */ +export default function HeartIcon({ fill = '#8F95B2' }: { fill?: string }) { + return ( + + + + ); +} diff --git a/pages/test/heart.tsx b/pages/test/heart.tsx new file mode 100644 index 0000000..0ea4e38 --- /dev/null +++ b/pages/test/heart.tsx @@ -0,0 +1,10 @@ +import Heart from '@/components/Heart/Heart'; + +export default function HeartTest() { + return ( + <> + + console.log('클릭')} /> + + ); +}