import { useEffect, useMemo, useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { CheckCircle2, UserCheck } from 'lucide-react'; import { AIDecisionCard, Avatar, Badge, Button, Card, formatINR, Select } from '../components'; import { LookupField } from '../components/form'; import type { LookupValue } from '../components/form'; import { useQuery, useZino } from '../api/provider'; import { useLeads } from '../api/leads'; import { decisionToCard } from '../api/adapters'; import { fieldFromSchema } from '../api/schema'; import { ACTIVITY_META } from '../api/forms'; const DEF = ACTIVITY_META.assign; export function AssignScreen() { const { client } = useZino(); const navigate = useNavigate(); const [params] = useSearchParams(); const instanceParam = params.get('instance'); const { records, refetch } = useLeads(); // Lookup field config (templates / display+storage cols) comes from the live // form schema, not hardcoded. const schemaQ = useQuery(() => client.formSchema(DEF.uid), []); const REGION = useMemo(() => fieldFromSchema(schemaQ.data, 'assigned_region_input'), [schemaQ.data]); const OWNER = useMemo(() => fieldFromSchema(schemaQ.data, 'owner_agent_input'), [schemaQ.data]); // Assign Lead is valid at the Qualified state. const eligible = useMemo(() => records.filter((r) => r.current_state_name === 'Qualified'), [records]); const [selectedId, setSelectedId] = useState(''); useEffect(() => { if (instanceParam) setSelectedId(instanceParam); else if (!selectedId && eligible[0]) setSelectedId(String(eligible[0].instance_id)); }, [instanceParam, eligible, selectedId]); const record = useMemo(() => records.find((r) => String(r.instance_id) === selectedId), [records, selectedId]); const [region, setRegion] = useState(null); const [agent, setAgent] = useState(null); useEffect(() => { if (!record) return; setRegion((record.assigned_region as LookupValue) ?? null); setAgent((record.owner_agent as LookupValue) ?? null); }, [record]); const [submitting, setSubmitting] = useState(false); const [result, setResult] = useState<{ ok: boolean; msg: string } | null>(null); async function submit() { if (!record) return; if (!region) { setResult({ ok: false, msg: 'Assigned region is required.' }); return; } setSubmitting(true); setResult(null); try { await client.performActivity(record.instance_id, DEF.uid, { assigned_region_input: region, ...(agent ? { owner_agent_input: agent } : {}), }); setResult({ ok: true, msg: 'Lead assigned — advanced to Assigned.' }); refetch(); } catch (e) { setResult({ ok: false, msg: e instanceof Error ? e.message : ((e as { message?: string })?.message ?? 'Submit failed') }); } finally { setSubmitting(false); } } return (
{/* context strip + lead picker */}
{record ? ( <>
{record.lead_name ?? `Lead ${record.instance_id}`} · #{record.instance_id}
{record.city ?? record.state_region ?? '—'} · {record.product_interest ?? 'No stated interest'} · income ₹ {formatINR(record.annual_income ?? 0)}
{record.lead_segment && {record.lead_segment}} ) : (
Select a lead at the Qualified stage.
)}