"use client"; import { useState, useMemo, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Checkbox } from "@/components/ui/checkbox"; import { CategoryCombobox } from "@/components/ui/category-combobox"; import { Tag, AlertCircle, CheckCircle2 } from "lucide-react"; import type { Category, Transaction } from "@/lib/types"; interface TransactionGroup { key: string; displayName: string; transactions: Transaction[]; totalAmount: number; suggestedKeyword: string; } interface RuleCreateDialogProps { open: boolean; onOpenChange: (open: boolean) => void; group: TransactionGroup | null; categories: Category[]; onSave: (data: { keyword: string; categoryId: string; applyToExisting: boolean; transactionIds: string[]; }) => Promise; } export function RuleCreateDialog({ open, onOpenChange, group, categories, onSave, }: RuleCreateDialogProps) { const [keyword, setKeyword] = useState(""); const [categoryId, setCategoryId] = useState(null); const [applyToExisting, setApplyToExisting] = useState(true); const [isLoading, setIsLoading] = useState(false); // Reset form when group changes useEffect(() => { if (group) { setKeyword(group.suggestedKeyword); setCategoryId(null); setApplyToExisting(true); } }, [group]); // Check if keyword already exists in any category const existingCategory = useMemo(() => { if (!keyword) return null; const lowerKeyword = keyword.toLowerCase(); return categories.find((c) => c.keywords.some((k) => k.toLowerCase() === lowerKeyword) ); }, [keyword, categories]); const selectedCategory = categories.find((c) => c.id === categoryId); const handleSave = async () => { if (!keyword || !categoryId || !group) return; setIsLoading(true); try { await onSave({ keyword, categoryId, applyToExisting, transactionIds: group.transactions.map((t) => t.id), }); onOpenChange(false); } catch (error) { console.error("Failed to create rule:", error); } finally { setIsLoading(false); } }; if (!group) return null; return ( Créer une règle de catégorisation Associez un mot-clé à une catégorie pour catégoriser automatiquement les transactions similaires.
{/* Group info */}
{group.displayName}
{group.transactions.length} transaction {group.transactions.length > 1 ? "s" : ""} seront catégorisées
{/* Keyword input */}
setKeyword(e.target.value)} placeholder="ex: spotify, carrefour, sncf..." className="pl-10" />

Les transactions contenant ce mot-clé seront automatiquement catégorisées.

{existingCategory && (
Ce mot-clé existe déjà dans "{existingCategory.name}"
)}
{/* Category select with search */}
{selectedCategory && (
Mots-clés actuels: {selectedCategory.keywords.length > 0 ? ( selectedCategory.keywords.map((k, i) => ( {k} )) ) : ( Aucun )}
)}
{/* Apply to existing checkbox */}
setApplyToExisting(checked as boolean) } />

Catégoriser immédiatement les {group.transactions.length}{" "} transaction {group.transactions.length > 1 ? "s" : ""} de ce groupe

{/* Preview */} {keyword && categoryId && (
Le mot-clé "{keyword}" sera ajouté à la catégorie "{selectedCategory?.name}"
)}
); }