'use client' import { useMemo, useState } from 'react' import { Pencil, Plus, Trash2, FunctionSquare, Workflow } from 'lucide-react' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { useMailRules, useCreateMailRule, useUpdateMailRule, useDeleteMailRule, } from '@/lib/api/hooks/use-mail-automation-queries' import { useAuthReady } from '@/lib/api/use-auth-ready' import { SettingsSyncBanner } from '@/components/gmail/settings/settings-sync-banner' import { RuleWorkflowEditor } from './rule-workflow-editor' import { RuleSimulatorPanel } from './rule-simulator-panel' import type { ApiRule } from '@/lib/api/types' import type { RuleEditorState } from '@/lib/mail-automation/types' import { createDefaultRuleEditorState, workflowToApiPayload, } from '@/lib/mail-automation/defaults' import { parseWorkflowFromRule } from '@/lib/mail-automation/workflow-flow' import { AutomationSuggestionsProvider } from './automation-suggest-input' export function AutomationRulesPanel() { const { ready, authenticated } = useAuthReady() const { data: rules = [], isFetching, isError, refetch, isPending } = useMailRules() const createRule = useCreateMailRule() const updateRule = useUpdateMailRule() const deleteRule = useDeleteMailRule() const [editorOpen, setEditorOpen] = useState(false) const [editingId, setEditingId] = useState(null) const [editorState, setEditorState] = useState(() => createDefaultRuleEditorState('rule') ) const showInitialLoad = ready && authenticated && isPending && rules.length === 0 const rulesOnly = useMemo(() => rules.filter((r) => (r.rule_kind ?? 'rule') === 'rule'), [rules]) const functionsOnly = useMemo(() => rules.filter((r) => r.rule_kind === 'function'), [rules]) function openNew(kind: 'rule' | 'function') { setEditingId(null) setEditorState(createDefaultRuleEditorState(kind)) setEditorOpen(true) } function openEdit(rule: ApiRule) { const kind = rule.rule_kind ?? 'rule' const workflow = parseWorkflowFromRule(rule.workflow, kind) setEditingId(rule.id) setEditorState({ name: rule.name, priority: rule.priority, is_active: rule.is_active, rule_kind: kind, account_id: rule.account_id, workflow: workflow ?? createDefaultRuleEditorState(kind).workflow, }) setEditorOpen(true) } async function handleSave() { const payload = workflowToApiPayload(editorState) if (editingId) { await updateRule.mutateAsync({ ruleId: editingId, ...payload }) } else { await createRule.mutateAsync(payload) } setEditorOpen(false) } return (
refetch()} />
{showInitialLoad ? null : rules.length === 0 ? (

Aucune règle. Créez une règle graphique avec déclencheurs, conditions et actions.

) : ( <> deleteRule.mutate(id)} /> {functionsOnly.length > 0 ? ( deleteRule.mutate(id)} /> ) : null} )} {editingId ? 'Modifier' : 'Créer'}{' '} {editorState.rule_kind === 'function' ? 'une fonction' : 'une règle'}
) } function RuleList({ title, icon: Icon, items, onEdit, onDelete, }: { title: string icon: typeof Workflow items: ApiRule[] onEdit: (rule: ApiRule) => void onDelete: (id: string) => void }) { if (items.length === 0) return null return (
{title}
    {items.map((rule) => (
  • {rule.name}

    Priorité {rule.priority} {rule.is_active === false ? ' · inactive' : ''} {rule.match_count != null ? ` · ${rule.match_count} exécutions` : ''} {rule.workflow ? ' · graphique' : ' · legacy'}

  • ))}
) }