diff --git a/apps/web/app/admin/bots/page.tsx b/apps/web/app/admin/bots/page.tsx index 930d731..5818856 100644 --- a/apps/web/app/admin/bots/page.tsx +++ b/apps/web/app/admin/bots/page.tsx @@ -8,15 +8,23 @@ export default function BotsPage() { const { admin, loading } = useSuperAdmin(); const router = useRouter(); const [bots, setBots] = useState([]); + const [tenants, setTenants] = useState([]); const [initiating, setInitiating] = useState(false); const [pairingInfo, setPairingInfo] = useState<{ pairingToken: string; expiresAt: string } | null>(null); const [qrDataUrl, setQrDataUrl] = useState(null); const [qrStatus, setQrStatus] = useState('PAIRING'); + const [assigningBotId, setAssigningBotId] = useState(null); + const [assignTenantId, setAssignTenantId] = useState(''); + const [assignBusy, setAssignBusy] = useState(false); const pollRef = useRef | null>(null); async function load() { - const res = await fetch('/api/admin/bots'); - if (res.ok) setBots(await res.json()); + const [botsRes, tenantsRes] = await Promise.all([ + fetch('/api/admin/bots'), + fetch('/api/admin/tenants'), + ]); + if (botsRes.ok) setBots(await botsRes.json()); + if (tenantsRes.ok) setTenants(await tenantsRes.json()); } useEffect(() => { @@ -78,6 +86,28 @@ export default function BotsPage() { } } + async function assignBot() { + if (!assigningBotId || !assignTenantId) return; + setAssignBusy(true); + try { + const res = await fetch(`/api/admin/bots/${assigningBotId}/assign`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ tenantId: assignTenantId }), + }); + if (!res.ok) { + const err = await res.json().catch(() => ({})); + alert(err.message ?? 'Failed to assign bot'); + return; + } + setAssigningBotId(null); + setAssignTenantId(''); + void load(); + } finally { + setAssignBusy(false); + } + } + if (loading) return

Loading...

; if (!admin) return null; @@ -120,34 +150,74 @@ export default function BotsPage() { JID Name Status - Tenants + Chapters Created {bots.map((b: any) => ( - - {b.jid?.slice(0, 30) ?? 'pending...'} - {b.displayName ?? '—'} - - {b.status} - - {b.tenantCount} - {new Date(b.createdAt).toLocaleDateString()} - - - - + <> + + {b.jid?.slice(0, 30) ?? 'pending...'} + {b.displayName ?? '—'} + + {b.status} + + {b.tenantCount} + {new Date(b.createdAt).toLocaleDateString()} + + + + + + {assigningBotId === b.id && ( + + +
+ Assign to chapter: + + + +
+ + + )} + ))}