import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { promoOffersApi, PromoOfferTemplateUpdateRequest, OFFER_TYPE_CONFIG, OfferType, } from '../api/promoOffers'; import { AdminBackButton } from '../components/admin'; import { createNumberInputHandler, toNumber } from '../utils/inputHelpers'; const getOfferTypeIcon = (offerType: string): string => { return OFFER_TYPE_CONFIG[offerType as OfferType]?.icon || '🎁'; }; export default function AdminPromoOfferTemplateEdit() { const { t } = useTranslation(); const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); const queryClient = useQueryClient(); // Form state const [name, setName] = useState(''); const [messageText, setMessageText] = useState(''); const [buttonText, setButtonText] = useState(''); const [validHours, setValidHours] = useState(24); const [discountPercent, setDiscountPercent] = useState(0); const [activeDiscountHours, setActiveDiscountHours] = useState(0); const [testDurationHours, setTestDurationHours] = useState(0); const [isActive, setIsActive] = useState(true); const [isTestAccess, setIsTestAccess] = useState(false); // Query template const { data: templatesData, isLoading } = useQuery({ queryKey: ['admin-promo-templates'], queryFn: promoOffersApi.getTemplates, }); const template = templatesData?.items.find((t) => t.id === Number(id)); // Populate form when template loads useEffect(() => { if (template) { setName(template.name); setMessageText(template.message_text); setButtonText(template.button_text); setValidHours(template.valid_hours); setDiscountPercent(template.discount_percent); setActiveDiscountHours(template.active_discount_hours || 0); setTestDurationHours(template.test_duration_hours || 0); setIsActive(template.is_active); setIsTestAccess(template.offer_type === 'test_access'); } }, [template]); // Update mutation const updateMutation = useMutation({ mutationFn: (data: PromoOfferTemplateUpdateRequest) => promoOffersApi.updateTemplate(Number(id), data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-promo-templates'] }); navigate('/admin/promo-offers'); }, }); const handleSubmit = () => { const data: PromoOfferTemplateUpdateRequest = { name, message_text: messageText, button_text: buttonText, valid_hours: toNumber(validHours, 1), discount_percent: toNumber(discountPercent), is_active: isActive, }; const testHours = toNumber(testDurationHours); const discountHours = toNumber(activeDiscountHours); if (isTestAccess) { data.test_duration_hours = testHours > 0 ? testHours : undefined; } else { data.active_discount_hours = discountHours > 0 ? discountHours : undefined; } updateMutation.mutate(data); }; if (isLoading) { return (
); } if (!template) { return (

{t('admin.promoOffers.form.editTemplate')}

{t('admin.promoOffers.notFound')}

); } return (
{/* Header */}
{getOfferTypeIcon(template.offer_type)}

{t('admin.promoOffers.form.editTemplate')}

{/* Form */}
setName(e.target.value)} className={`input ${name.length > 0 && !name.trim() ? 'border-error-500/50' : ''}`} />