'use client' import { useEffect, useState } from 'react' import { useTranslations } from 'next-intl' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Loader2 } from 'lucide-react' interface EditTransactionTitleDialogProps { open: boolean onOpenChange: (open: boolean) => void /** Current (possibly edited) title shown in the input. */ currentTitle: string /** Bank's original title; when it differs from the current title a restore * affordance is offered. */ originalTitle: string | null /** Persist a new title. Resolves true on success (dialog closes), false to * keep the dialog open (e.g. the request failed). */ onSave: (description: string) => Promise } /** * Edit a bank transaction's working title. Carries the product-required warning * ("Är du säker…") in the dialog body and offers a one-click restore back to * the bank's original name. Gating (only unbooked/unmatched rows) is enforced * server-side; callers only open this for editable rows. */ export default function EditTransactionTitleDialog({ open, onOpenChange, currentTitle, originalTitle, onSave, }: EditTransactionTitleDialogProps) { const t = useTranslations('tx_inbox_card') const [value, setValue] = useState(currentTitle) const [isSaving, setIsSaving] = useState(false) // Re-seed the field each time the dialog opens for a (possibly different) row. useEffect(() => { if (open) setValue(currentTitle) }, [open, currentTitle]) const trimmed = value.trim() const canRestore = originalTitle != null && originalTitle !== currentTitle const isUnchanged = trimmed === currentTitle.trim() async function persist(next: string) { setIsSaving(true) try { const ok = await onSave(next) if (ok) onOpenChange(false) } finally { setIsSaving(false) } } return ( { if (isSaving) return onOpenChange(v) }} > {t('edit_title_dialog_title')} {t('edit_title_warning')}
setValue(e.target.value)} maxLength={500} autoFocus disabled={isSaving} onKeyDown={(e) => { if (e.key === 'Enter' && trimmed && !isUnchanged && !isSaving) { e.preventDefault() void persist(trimmed) } }} /> {canRestore && (

{t('edit_title_original_hint', { name: originalTitle as string })}{' '}

)}
) }