import { useState, useEffect } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; import { Card, CardContent } from "@/components/ui/card"; import { Eye, EyeOff, CheckCircle } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { apiRequest, queryClient } from "@/lib/queryClient"; type TwilioSettings = { id?: number; accountSid: string; authToken: string; phoneNumber: string; greetingMessage?: string | null; twimlAppSid?: string | null; }; export function TwilioSettingsCard() { const { toast } = useToast(); const [accountSid, setAccountSid] = useState(""); const [authToken, setAuthToken] = useState(""); const [phoneNumber, setPhoneNumber] = useState(""); const [greetingMessage, setGreetingMessage] = useState(""); const [twimlAppSid, setTwimlAppSid] = useState(""); const [showAuthToken, setShowAuthToken] = useState(false); const { data: settings, isLoading } = useQuery({ queryKey: ["/api/twilio/settings"], queryFn: async () => { const res = await apiRequest("GET", "/api/twilio/settings"); if (!res.ok) return null; return res.json(); }, }); useEffect(() => { if (settings) { setAccountSid(settings.accountSid ?? ""); setAuthToken(settings.authToken ?? ""); setPhoneNumber(settings.phoneNumber ?? ""); setGreetingMessage(settings.greetingMessage ?? ""); setTwimlAppSid(settings.twimlAppSid ?? ""); } }, [settings]); const saveMutation = useMutation({ mutationFn: async (data: TwilioSettings) => { const res = await apiRequest("PUT", "/api/twilio/settings", data); if (!res.ok) { const err = await res.json().catch(() => null); throw new Error(err?.message || "Failed to save Twilio settings"); } return res.json(); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/twilio/settings"] }); toast({ title: "Twilio Settings Saved", description: "Your Twilio credentials have been saved." }); }, onError: (err: any) => { toast({ title: "Error", description: err?.message || "Failed to save settings", variant: "destructive" }); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!accountSid.trim() || !authToken.trim() || !phoneNumber.trim()) return; saveMutation.mutate({ accountSid: accountSid.trim(), authToken: authToken.trim(), phoneNumber: phoneNumber.trim(), greetingMessage: greetingMessage.trim() || null, twimlAppSid: twimlAppSid.trim() || null }); }; const isConfigured = !!(settings?.accountSid && settings?.authToken && settings?.phoneNumber); return (

Twilio Settings

{isConfigured && ( Configured )}

Enter your Twilio credentials to enable SMS and calling features. Find these in your{" "} Twilio Console → Account Info.

{isLoading ? (

Loading...

) : (
setAccountSid(e.target.value)} className="mt-1 p-2 border rounded w-full font-mono text-sm" placeholder="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" required />
setAuthToken(e.target.value)} className="p-2 border rounded w-full pr-10 font-mono text-sm" placeholder="••••••••••••••••••••••••••••••••" required />
setPhoneNumber(e.target.value)} className="mt-1 p-2 border rounded w-full font-mono text-sm" placeholder="+1xxxxxxxxxx" required />

Must be in E.164 format, e.g. +16175551234