import { useState } from 'react'; import { useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { createNumberInputHandler } from '../utils/inputHelpers'; import { couponsApi, type CouponBatchCreated } from '../api/coupons'; import { tariffsApi } from '../api/tariffs'; import { usePlatform } from '../platform/hooks/usePlatform'; import { copyToClipboard } from '../utils/clipboard'; import { getApiErrorMessage } from '../utils/api-error'; import { BackIcon, CheckIcon, CopyIcon, DownloadIcon } from '@/components/icons'; const downloadLinksFile = (batch: CouponBatchCreated | { id: number; links: string[] }) => { const blob = new Blob([batch.links.join('\n') + '\n'], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); const anchor = document.createElement('a'); anchor.href = url; anchor.download = `coupons_batch_${batch.id}.txt`; anchor.click(); URL.revokeObjectURL(url); }; export default function AdminCouponCreate() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { capabilities } = usePlatform(); // Form state const [name, setName] = useState(''); const [tariffId, setTariffId] = useState(null); const [periodDays, setPeriodDays] = useState(30); const [couponsCount, setCouponsCount] = useState(50); const [priceRubles, setPriceRubles] = useState(''); const [validDays, setValidDays] = useState(''); const [maxPerUser, setMaxPerUser] = useState(''); const [validationErrors, setValidationErrors] = useState([]); const [serverError, setServerError] = useState(null); // Result state (batch created — show the generated links) const [created, setCreated] = useState(null); const [copied, setCopied] = useState(false); const { data: tariffsData } = useQuery({ queryKey: ['admin-tariffs-for-coupon'], queryFn: () => tariffsApi.getTariffs(true), }); const tariffs = (tariffsData?.tariffs || []).filter((tariff) => tariff.is_active); const createMutation = useMutation({ mutationFn: couponsApi.createBatch, onSuccess: (batch) => { queryClient.invalidateQueries({ queryKey: ['admin-coupon-batches'] }); setCreated(batch); }, onError: (err) => { setServerError(getApiErrorMessage(err, t('admin.coupons.errors.createFailed'))); }, }); const validate = (): boolean => { const errors: string[] = []; if (!name.trim()) errors.push('nameRequired'); if (!tariffId) errors.push('tariffRequired'); if (!periodDays || periodDays < 1 || periodDays > 3650) errors.push('periodInvalid'); if (!couponsCount || couponsCount < 1 || couponsCount > 500) errors.push('countInvalid'); setValidationErrors(errors); return errors.length === 0; }; const handleSubmit = () => { setServerError(null); if (!validate()) return; createMutation.mutate({ name: name.trim(), tariff_id: tariffId!, period_days: Number(periodDays), coupons_count: Number(couponsCount), wholesale_price_kopeks: priceRubles === '' ? 0 : Math.round(Number(priceRubles) * 100), valid_days: validDays === '' ? 0 : Number(validDays), max_per_user: maxPerUser === '' ? 0 : Number(maxPerUser), }); }; const handleCopyAll = () => { if (!created) return; void copyToClipboard(created.links.join('\n')); setCopied(true); setTimeout(() => setCopied(false), 2000); }; // Step 2: the batch is created — show the one-time links if (created) { return (

{t('admin.coupons.created.title')}

#{created.id} {created.name} · {created.tariff_name} · {created.period_days}{' '} {t('admin.coupons.days')}

{t('admin.coupons.created.linksLabel', { count: created.links.length })}