'use client'; import { useEffect, useState, type CSSProperties } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faPlay } from '@fortawesome/free-solid-svg-icons'; import { DONATION_AMOUNT_MIN, DONATION_AMOUNT_MAX, DONATION_AMOUNT_STEP, DONATION_AMOUNT_DEFAULT } from '@/constants/donation'; import type { FormState } from '../types'; type Props = { form: FormState; }; export default function GoalPreviewPanel({ form }: Props) { const [previewAmount, setPreviewAmount] = useState(DONATION_AMOUNT_DEFAULT); const [simulatedAmount, setSimulatedAmount] = useState(0); // form.startAmount가 변경되면 시뮬레이션 누적값 초기화 useEffect(() => { setSimulatedAmount(0); }, [form.startAmount]); const currentAmount = form.startAmount + simulatedAmount; const percent = form.targetAmount > 0 ? Math.min((currentAmount / form.targetAmount) * 100, 100) : 0; const titleStyle = { '--title-font': form.titleFontFamily || 'inherit', '--title-size': `${form.titleFontSizePx}px`, '--title-color': form.titleFontColor } as CSSProperties; const barWrapStyle = { '--bar-height': `${form.barHeightPx}px`, '--bar-bg': form.barBackgroundColor } as CSSProperties; const barFillStyle = { '--bar-percent': `${percent}%`, '--bar-color': form.barColor } as CSSProperties; const amountStyle = { '--amount-font': form.amountFontFamily || 'inherit', '--amount-size': `${form.amountFontSizePx}px`, '--amount-color': form.amountFontColor } as CSSProperties; const handlePreview = () => { setSimulatedAmount(prev => prev + (previewAmount || DONATION_AMOUNT_DEFAULT)); }; const handleReset = () => { setSimulatedAmount(0); }; return ( ); }