import { useState, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import apiClient from '../api/client'; import { useBusiness } from '../context/BusinessContext'; export default function GlobalSms() { const { businessId } = useParams(); const { setHasGlobalSms } = useBusiness(); const [loading, setLoading] = useState(true); const [profiles, setProfiles] = useState([]); const [activeProfileId, setActiveProfileId] = useState(null); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); // Form state for Create / Edit const [editingId, setEditingId] = useState(null); const [formName, setFormName] = useState(''); const [formCurl, setFormCurl] = useState(''); const [formSetActive, setFormSetActive] = useState(true); useEffect(() => { loadProfiles(); }, [businessId]); async function loadProfiles() { try { setLoading(true); const res = await apiClient.get(`/api/businesses/${businessId}/global-sms/profiles`); setProfiles(res.data.profiles || []); setActiveProfileId(res.data.activeProfileId); if (res.data.activeProfileId) { setHasGlobalSms(true); } } catch (err) { setError('Failed to load cURL profiles'); } finally { setLoading(false); } } function handleAddClick() { setEditingId(null); setFormName(''); setFormCurl(''); setFormSetActive(profiles.length === 0); setError(''); setSuccess(''); } function handleEditClick(profile) { setEditingId(profile.id); setFormName(profile.name); setFormCurl(profile.rawCurl); setFormSetActive(false); // only matters for create setError(''); setSuccess(''); } async function handleSubmit(e) { e.preventDefault(); if (!formName.trim() || !formCurl.trim()) return; setSaving(true); setError(''); setSuccess(''); try { if (editingId) { await apiClient.patch(`/api/businesses/${businessId}/global-sms/profiles/${editingId}`, { name: formName, rawCurl: formCurl, }); setSuccess('Profile updated successfully.'); } else { await apiClient.post(`/api/businesses/${businessId}/global-sms/profiles`, { name: formName, rawCurl: formCurl, setActive: formSetActive, }); setSuccess('Profile created successfully.'); } await loadProfiles(); setFormName(''); setFormCurl(''); setEditingId(null); } catch (err) { setError(err.response?.data?.error || 'Failed to save cURL profile'); } finally { setSaving(false); } } async function handleDelete(id) { if (!window.confirm('Delete this cURL profile?')) return; try { await apiClient.delete(`/api/businesses/${businessId}/global-sms/profiles/${id}`); await loadProfiles(); } catch (err) { setError(err.response?.data?.error || 'Failed to delete profile'); } } async function handleActivate(id) { try { await apiClient.post(`/api/businesses/${businessId}/global-sms/profiles/${id}/activate`); await loadProfiles(); } catch (err) { setError(err.response?.data?.error || 'Failed to activate profile'); } } if (loading) { return (
); } return (
{/* Header */}

cURL Profiles

Manage the cURL commands used to generate and test SMS templates. The active profile will be used across the application.

{error && (
{error}
)} {success && (
{success}
)} {/* Profiles List */}
{profiles.length > 0 ? ( profiles.map(p => { const isActive = p.id === activeProfileId; return (

{p.name}

{isActive && ( Active Profile )} {p.isDefault && !isActive && ( Default )}

Updated: {new Date(p.updatedAt).toLocaleString()}

{p.rawCurl}

{!isActive && ( )} {profiles.length > 1 && ( )}
); }) ) : (

No cURL profiles configured yet.

)}
{/* Inline Form (Create / Edit) */}

{editingId ? 'Edit Profile' : 'Add New Profile'}

{editingId && ( )}
setFormName(e.target.value)} placeholder="e.g. Production SMS, Staging Twilio" className="w-full px-4 py-2.5 rounded-lg bg-page-bg border border-border-main text-text-primary placeholder-placeholder-bg focus:outline-none focus:ring-2 focus:ring-primary-blue transition text-sm" required />