import { useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { addTracker, getTrackerFields } from "../../lib/api"; import { getErrorMessage } from "../../lib/errors"; import type { FilterGroup, TrackerField, AgentConfig } from "../../lib/types"; import FilterBuilder from "./FilterBuilder"; export default function TrackerConfig() { const { projectId } = useParams<{ projectId: string }>(); const navigate = useNavigate(); const [trackerId, setTrackerId] = useState(""); const [trackerLabel, setTrackerLabel] = useState(""); const [pollingInterval, setPollingInterval] = useState(10); const [fields, setFields] = useState([]); const [fieldsLoaded, setFieldsLoaded] = useState(false); const [fieldsLoading, setFieldsLoading] = useState(false); const [filters, setFilters] = useState([]); const [analystCommand, setAnalystCommand] = useState("claude"); const [developerCommand, setDeveloperCommand] = useState("claude"); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); async function handleLoadFields() { if (!trackerId) return; setFieldsLoading(true); setError(null); try { const result = await getTrackerFields(Number(trackerId)); setFields(result); setFieldsLoaded(true); } catch (err: unknown) { setError(getErrorMessage(err)); } finally { setFieldsLoading(false); } } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!projectId || trackerId === "") return; setError(null); setLoading(true); const agentConfig: AgentConfig = { analyst_command: analystCommand, analyst_args: [], developer_command: developerCommand, developer_args: [], }; try { await addTracker(projectId, Number(trackerId), trackerLabel, pollingInterval, agentConfig, filters); navigate(`/projects/${projectId}`); } catch (err: unknown) { setError(getErrorMessage(err)); } finally { setLoading(false); } } return (

Add tracker

{/* Basic fields */}
{ setTrackerId(e.target.value === "" ? "" : Number(e.target.value)); setFieldsLoaded(false); setFields([]); }} required min={1} className="w-40 border border-gray-300 rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="e.g. 42" />
setTrackerLabel(e.target.value)} required placeholder="e.g. Bugs" className="w-full border border-gray-300 rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
setPollingInterval(Number(e.target.value))} required min={1} className="w-40 border border-gray-300 rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Filter builder */} {fieldsLoaded && (

Filters

)} {/* Agent config */}

Agent configuration

setAnalystCommand(e.target.value)} className="w-full border border-gray-300 rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
setDeveloperCommand(e.target.value)} className="w-full border border-gray-300 rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
{error && (
{error}
)}
); }