"use client"; import type { RecordingResponseSchema } from "@/client/types.gen"; import { CredentialSelector, ParameterEditor, type ToolParameter } from "@/components/http"; import { RecordingSelect, StaticTextWarning } from "@/components/flow/TextOrAudioInput"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { Plus, Trash2 } from "lucide-react"; import { type EndCallMessageType, type TransferApprovedRouteRow, type TransferResolverPolicy, } from "../../config"; export interface TransferCallToolConfigProps { name: string; onNameChange: (name: string) => void; description: string; onDescriptionChange: (description: string) => void; destination: string; onDestinationChange: (destination: string) => void; messageType: EndCallMessageType; onMessageTypeChange: (messageType: EndCallMessageType) => void; customMessage: string; onCustomMessageChange: (message: string) => void; audioRecordingId: string; onAudioRecordingIdChange: (id: string) => void; recordings?: RecordingResponseSchema[]; timeout?: number; // Make optional to match API type onTimeoutChange: (timeout: number) => void; resolverEnabled: boolean; onResolverEnabledChange: (enabled: boolean) => void; resolverUrl: string; onResolverUrlChange: (url: string) => void; resolverCredentialUuid: string; onResolverCredentialUuidChange: (uuid: string) => void; resolverTimeoutMs: number; onResolverTimeoutMsChange: (timeoutMs: number) => void; resolverWaitMessage: string; onResolverWaitMessageChange: (message: string) => void; resolverPolicy: TransferResolverPolicy; onResolverPolicyChange: (policy: TransferResolverPolicy) => void; approvedRoutes: TransferApprovedRouteRow[]; onApprovedRoutesChange: (routes: TransferApprovedRouteRow[]) => void; fallbackRoute: string; onFallbackRouteChange: (route: string) => void; parameters: ToolParameter[]; onParametersChange: (parameters: ToolParameter[]) => void; } export function TransferCallToolConfig({ name, onNameChange, description, onDescriptionChange, destination, onDestinationChange, messageType, onMessageTypeChange, customMessage, onCustomMessageChange, audioRecordingId, onAudioRecordingIdChange, recordings = [], timeout, onTimeoutChange, resolverEnabled, onResolverEnabledChange, resolverUrl, onResolverUrlChange, resolverCredentialUuid, onResolverCredentialUuidChange, resolverTimeoutMs, onResolverTimeoutMsChange, resolverWaitMessage, onResolverWaitMessageChange, resolverPolicy, onResolverPolicyChange, approvedRoutes, onApprovedRoutesChange, fallbackRoute, onFallbackRouteChange, parameters, onParametersChange, }: TransferCallToolConfigProps) { const updateRoute = ( index: number, patch: Partial, ) => { onApprovedRoutesChange( approvedRoutes.map((route, i) => i === index ? { ...route, ...patch } : route, ), ); }; const removeRoute = (index: number) => { onApprovedRoutesChange(approvedRoutes.filter((_, i) => i !== index)); }; const addRoute = () => { onApprovedRoutesChange([ ...approvedRoutes, { key: "", destination: "", message: "", timeout_seconds: 30, }, ]); }; return ( Transfer Call Configuration Configure call transfer settings. Supports phone numbers (Twilio) and SIP endpoints (Asterisk ARI).
onNameChange(e.target.value)} placeholder="e.g., Transfer Call" />