import { useState } from 'react'; import { Button, FormField, Input, useToast } from '@cameleer/design-system'; import { useTestEvaluate } from '../../../api/queries/alertRules'; import { describeApiError } from '../../../api/errors'; import type { FormState } from './form-state'; export function TriggerStep({ form, setForm, ruleId, }: { form: FormState; setForm: (f: FormState) => void; ruleId?: string; }) { const testEvaluate = useTestEvaluate(); const { toast } = useToast(); const [lastResult, setLastResult] = useState(null); // PER_EXCHANGE fires exactly once per exchange (Task 3.3 server validator // rejects non-zero reNotifyMinutes / forDurationSeconds for this mode). // Gate the two inputs here so users can't type values the server will reject. const isPerExchange = form.conditionKind === 'EXCHANGE_MATCH' && (form.condition as Record).fireMode === 'PER_EXCHANGE'; const onTest = async () => { if (!ruleId) { toast({ title: 'Save rule first to run test evaluate', variant: 'error' }); return; } try { const result = await testEvaluate.mutateAsync({ id: ruleId, req: {} }); setLastResult(JSON.stringify(result, null, 2)); } catch (e) { toast({ title: 'Test-evaluate failed', description: describeApiError(e), variant: 'error' }); } }; return (
setForm({ ...form, evaluationIntervalSeconds: Number(e.target.value) })} /> {!isPerExchange && ( setForm({ ...form, forDurationSeconds: Number(e.target.value) })} /> )} setForm({ ...form, reNotifyMinutes: Number(e.target.value) })} disabled={isPerExchange} title={ isPerExchange ? 'Per-exchange rules fire exactly once per exchange — re-notify does not apply.' : undefined } />
{!ruleId && (

Save the rule first to enable test-evaluate.

)} {lastResult && (
            {lastResult}
          
)}
); }