import api from './client';
import type {
SmsMessage,
CallRecord,
LeadTouchpoint,
OptOutRecord,
LeadMetrics,
} from '../types';
// ---------------------------------------------------------------------------
// SMS API
// ---------------------------------------------------------------------------
export interface SendSmsPayload {
to_phone: string;
body: string;
lead_id?: string;
}
export interface SendSmsResponse {
success: boolean;
sms_id: string;
status: string;
provider_sid: string;
to_phone: string;
body: string;
}
export interface MessagesResponse {
messages: SmsMessage[];
total: number;
limit: number;
offset: number;
}
// ---------------------------------------------------------------------------
// Call API
// ---------------------------------------------------------------------------
export interface TriggerCallPayload {
to_phone: string;
lead_id?: string;
twiml_url?: string;
}
export interface TriggerCallResponse {
success: boolean;
call_id: string;
status: string;
provider_sid: string;
to_phone: string;
}
export interface CallsResponse {
calls: CallRecord[];
total: number;
limit: number;
offset: number;
}
// ---------------------------------------------------------------------------
// Timeline API
// ---------------------------------------------------------------------------
export interface TimelineResponse {
lead_id: string;
lead_status: string;
touchpoints: LeadTouchpoint[];
total: number;
}
// ---------------------------------------------------------------------------
// Opt-Out API
// ---------------------------------------------------------------------------
export interface OptOutsResponse {
opt_outs: OptOutRecord[];
total: number;
limit: number;
offset: number;
}
export interface AddOptOutPayload {
phone: string;
reason: 'stop' | 'manual' | 'bounced' | 'complaint';
}
// ---------------------------------------------------------------------------
// Metrics API
// ---------------------------------------------------------------------------
export interface MetricsResponse {
lead_id: string;
lead_created_at: string | null;
time_to_first_contact_minutes: number | null;
time_to_first_sms_minutes: number | null;
time_to_first_call_minutes: number | null;
first_contact_type: string | null;
first_contact_at: string | null;
}
// ---------------------------------------------------------------------------
// smsCallApi
// ---------------------------------------------------------------------------
export const smsCallApi = {
// --- SMS ---
sendSms: async (payload: SendSmsPayload): Promise<SendSmsResponse> => {
const { data } = await api.post<SendSmsResponse>('/api/sms/send', payload);
return data;
},
listMessages: async (params?: {
lead_id?: string;
direction?: 'inbound' | 'outbound';
status?: string;
phone?: string;
limit?: number;
offset?: number;
}): Promise<MessagesResponse> => {
const { data } = await api.get<MessagesResponse>('/api/sms/messages', { params });
return data;
},
getMessage: async (messageId: string): Promise<SmsMessage> => {
const { data } = await api.get<SmsMessage>(`/api/sms/messages/${messageId}`);
return data;
},
// --- Calls ---
triggerCall: async (payload: TriggerCallPayload): Promise<TriggerCallResponse> => {
const { data } = await api.post<TriggerCallResponse>('/api/sms/call', payload);
return data;
},
listCalls: async (params?: {
lead_id?: string;
disposition?: string;
limit?: number;
offset?: number;
}): Promise<CallsResponse> => {
const { data } = await api.get<CallsResponse>('/api/sms/calls', { params });
return data;
},
updateCallDisposition: async (
callId: string,
disposition: string,
): Promise<{ success: boolean }> => {
const { data } = await api.put<{ success: boolean }>(
`/api/sms/calls/${callId}/disposition`,
{ disposition },
);
return data;
},
// --- Timeline ---
getLeadTimeline: async (leadId: string): Promise<TimelineResponse> => {
const { data } = await api.get<TimelineResponse>(`/api/sms/leads/${leadId}/timeline`);
return data;
},
// --- Opt-Outs ---
listOptOuts: async (params?: {
limit?: number;
offset?: number;
}): Promise<OptOutsResponse> => {
const { data } = await api.get<OptOutsResponse>('/api/sms/opt-outs', { params });
return data;
},
addOptOut: async (payload: AddOptOutPayload): Promise<{ success: boolean }> => {
const { data } = await api.post<{ success: boolean }>('/api/sms/opt-outs', payload);
return data;
},
removeOptOut: async (optOutId: string): Promise<{ success: boolean; removed_phone: string }> => {
const { data } = await api.delete<{ success: boolean; removed_phone: string }>(
`/api/sms/opt-outs/${optOutId}`,
);
return data;
},
// --- Metrics ---
getLeadMetrics: async (leadId: string): Promise<MetricsResponse> => {
const { data } = await api.get<MetricsResponse>(`/api/sms/leads/${leadId}/metrics`);
return data;
},
};