import Link from "next/link" import { fetchQuery } from "convex/nextjs" import { Phone, Search } from "lucide-react" import { api } from "@/convex/_generated/api" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { formatPhoneCallDuration, formatPhoneCallTimestamp, normalizePhoneFromIdentity, } from "@/lib/phone-calls" type PageProps = { searchParams: Promise<{ search?: string status?: "started" | "completed" | "failed" page?: string }> } function getStatusVariant(status: "started" | "completed" | "failed") { if (status === "failed") { return "destructive" as const } if (status === "started") { return "secondary" as const } return "default" as const } export default async function AdminCallsPage({ searchParams }: PageProps) { const params = await searchParams const page = Math.max(1, Number.parseInt(params.page || "1", 10) || 1) const status = params.status const search = params.search?.trim() || undefined const data = await fetchQuery(api.voiceSessions.listAdminPhoneCalls, { search, status, page, limit: 25, }) return (

Phone Calls

Every direct LiveKit phone call mirrored into RMV admin, including partial and non-lead calls.

Call Inbox Search by caller number, room, summary, or linked lead ID.
{data.items.length === 0 ? ( ) : ( data.items.map((call: any) => ( )) )}
Caller Started Duration Status Answered Transcript Recording Lead Email Summary Open
No phone calls matched this filter.
{normalizePhoneFromIdentity( call.participantIdentity ) || call.participantIdentity}
{call.roomName}
{formatPhoneCallTimestamp(call.startedAt)} {formatPhoneCallDuration(call.durationMs)} {call.callStatus} {call.answered ? "Yes" : "No"} {call.transcriptTurnCount > 0 ? `${call.transcriptTurnCount} turns` : "No transcript"} {call.recordingStatus || "Unavailable"} {call.leadOutcome === "none" ? "—" : call.leadOutcome} {call.notificationStatus} {call.summaryText || "No summary yet"}

Showing page {data.pagination.page} of{" "} {data.pagination.totalPages} ({data.pagination.total} calls)

{data.pagination.page > 1 ? ( ) : null} {data.pagination.page < data.pagination.totalPages ? ( ) : null}
) } export const metadata = { title: "Phone Calls | Admin", description: "View direct phone calls, transcript history, and lead outcomes", }