import { useState, type FormEvent } from 'react'; import type { Transaction, Category, CreateCategoryRuleRequest, } from '@family-budget/shared'; import { updateTransaction } from '../api/transactions'; import { createCategoryRule } from '../api/rules'; import { formatAmount, formatDateTime } from '../utils/format'; interface Props { transaction: Transaction; categories: Category[]; onClose: () => void; onSave: () => void; } function extractPattern(description: string): string { return description .replace(/Оплата товаров и услуг\.\s*/i, '') .replace(/\s*по карте\s*\*\d+.*/i, '') .replace(/\s*Перевод средств.*/i, '') .trim() .slice(0, 50); } export function EditTransactionModal({ transaction, categories, onClose, onSave, }: Props) { const [categoryId, setCategoryId] = useState( transaction.categoryId != null ? String(transaction.categoryId) : '', ); const [comment, setComment] = useState(transaction.comment || ''); const [createRule, setCreateRule] = useState(true); const [pattern, setPattern] = useState( extractPattern(transaction.description), ); const [requiresConfirmation, setRequiresConfirmation] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setSaving(true); setError(''); try { await updateTransaction(transaction.id, { categoryId: categoryId ? Number(categoryId) : null, comment: comment || null, }); if (createRule && categoryId && pattern.trim()) { const ruleData: CreateCategoryRuleRequest = { pattern: pattern.trim(), matchType: 'contains', categoryId: Number(categoryId), priority: 100, requiresConfirmation, }; await createCategoryRule(ruleData); } onSave(); } catch (err: unknown) { const msg = err instanceof Error ? err.message : 'Ошибка сохранения'; setError(msg); } finally { setSaving(false); } }; return (
e.stopPropagation()}>

Редактирование операции

{error &&
{error}
}
Дата {formatDateTime(transaction.operationAt)}
Сумма {formatAmount(transaction.amountSigned)}
Описание {transaction.description}