Twilio account mode
diff --git a/app/app/settings/actions.ts b/app/app/settings/actions.ts
index 934d859..0be9874 100644
--- a/app/app/settings/actions.ts
+++ b/app/app/settings/actions.ts
@@ -5,8 +5,10 @@ import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
import {
BusinessPhoneSetupPath,
+ ForwardedCallAnswerMode,
ForwardingVerificationStatus,
ManagedTwilioStatus,
+ MessagingSetupMode,
MessagingComplianceType,
PortingStatus,
Prisma,
@@ -98,6 +100,8 @@ export async function saveBusinessSettingsAction(formData: FormData) {
: user?.emailAddresses[0]?.emailAddress) || null;
const publicBusinessPhone = normalizePhoneNumber(parsed.data.publicBusinessPhone || '') || null;
const phoneSetupPath = parsed.data.phoneSetupPath as BusinessPhoneSetupPath;
+ const forwardedCallAnswerMode = parsed.data.forwardedCallAnswerMode as ForwardedCallAnswerMode;
+ const messagingSetupMode = parsed.data.messagingSetupMode as MessagingSetupMode;
const shouldResetForwardingVerification =
phoneSetupPath === BusinessPhoneSetupPath.CURRENT_NUMBER_FORWARDING &&
(business.phoneSetupPath !== phoneSetupPath || business.publicBusinessPhone !== publicBusinessPhone);
@@ -110,6 +114,8 @@ export async function saveBusinessSettingsAction(formData: FormData) {
forwardingNumber: normalizePhoneNumber(parsed.data.forwardingNumber),
notifyPhone: normalizePhoneNumber(parsed.data.notifyPhone || '') || null,
phoneSetupPath,
+ forwardedCallAnswerMode,
+ messagingSetupMode,
twilioNumberSetupMode: deriveTwilioNumberSetupModeFromPhoneSetupPath(phoneSetupPath),
forwardingVerificationStatus:
phoneSetupPath === BusinessPhoneSetupPath.CURRENT_NUMBER_FORWARDING
@@ -180,6 +186,8 @@ export async function saveBusinessTwilioSetupChoiceAction(formData: FormData) {
data: {
twilioAccountMode: parsed.data.twilioAccountMode as TwilioAccountMode,
phoneSetupPath,
+ forwardedCallAnswerMode: parsed.data.forwardedCallAnswerMode as ForwardedCallAnswerMode,
+ messagingSetupMode: parsed.data.messagingSetupMode as MessagingSetupMode,
twilioNumberSetupMode: deriveTwilioNumberSetupModeFromPhoneSetupPath(phoneSetupPath),
forwardingVerificationStatus:
phoneSetupPath === BusinessPhoneSetupPath.CURRENT_NUMBER_FORWARDING
@@ -219,6 +227,8 @@ export async function saveBusinessTwilioAdminOverridesAction(formData: FormData)
const twilioAccountMode = parsed.data.twilioAccountMode as TwilioAccountMode;
const phoneSetupPath = parsed.data.phoneSetupPath as BusinessPhoneSetupPath;
+ const forwardedCallAnswerMode = parsed.data.forwardedCallAnswerMode as ForwardedCallAnswerMode;
+ const messagingSetupMode = parsed.data.messagingSetupMode as MessagingSetupMode;
const twilioNumberSetupMode = deriveTwilioNumberSetupModeFromPhoneSetupPath(phoneSetupPath) as TwilioNumberSetupMode;
const twilioSubaccountSid = twilioAccountMode === TwilioAccountMode.MAIN_ACCOUNT ? null : normalizeOptionalSid(parsed.data.twilioSubaccountSid);
const twilioPhoneNumberSid = normalizeOptionalSid(parsed.data.twilioPhoneNumberSid);
@@ -282,6 +292,8 @@ export async function saveBusinessTwilioAdminOverridesAction(formData: FormData)
const twilioMappingChanged =
business.twilioAccountMode !== twilioAccountMode ||
business.phoneSetupPath !== phoneSetupPath ||
+ business.forwardedCallAnswerMode !== forwardedCallAnswerMode ||
+ business.messagingSetupMode !== messagingSetupMode ||
business.twilioNumberSetupMode !== twilioNumberSetupMode ||
business.twilioSubaccountSid !== twilioSubaccountSid ||
existingTwilioPhoneNumber !== twilioPhoneNumber ||
@@ -309,6 +321,12 @@ export async function saveBusinessTwilioAdminOverridesAction(formData: FormData)
? { key: 'twilioAccountMode', before: business.twilioAccountMode, after: twilioAccountMode }
: null,
business.phoneSetupPath !== phoneSetupPath ? { key: 'phoneSetupPath', before: business.phoneSetupPath, after: phoneSetupPath } : null,
+ business.forwardedCallAnswerMode !== forwardedCallAnswerMode
+ ? { key: 'forwardedCallAnswerMode', before: business.forwardedCallAnswerMode, after: forwardedCallAnswerMode }
+ : null,
+ business.messagingSetupMode !== messagingSetupMode
+ ? { key: 'messagingSetupMode', before: business.messagingSetupMode, after: messagingSetupMode }
+ : null,
business.twilioNumberSetupMode !== twilioNumberSetupMode
? { key: 'twilioNumberSetupMode', before: business.twilioNumberSetupMode, after: twilioNumberSetupMode }
: null,
@@ -366,6 +384,8 @@ export async function saveBusinessTwilioAdminOverridesAction(formData: FormData)
data: {
twilioAccountMode,
phoneSetupPath,
+ forwardedCallAnswerMode,
+ messagingSetupMode,
twilioNumberSetupMode,
twilioSubaccountSid,
notifyPhone: ownerPhone,
@@ -522,6 +542,7 @@ export async function sendBusinessTwilioTestSmsAction(formData: FormData) {
context: 'admin_test',
twilioSubaccountSid: business.twilioAccountMode === 'MAIN_ACCOUNT' ? null : business.twilioSubaccountSid,
messagingServiceSid: business.twilioMessagingServiceSid,
+ messagingSetupMode: business.messagingSetupMode,
managedTwilioStatus: business.managedTwilioStatus,
a2pFailureReason: business.a2pFailureReason,
messagingComplianceType: business.messagingComplianceType,
diff --git a/app/app/settings/page.tsx b/app/app/settings/page.tsx
index cd37771..34be29a 100644
--- a/app/app/settings/page.tsx
+++ b/app/app/settings/page.tsx
@@ -13,7 +13,14 @@ import { getAdminTestSmsConfidenceState } from '@/lib/admin-dashboard';
import { getTwilioWebhookSnapshot } from '@/lib/admin-provisioning';
import { requireBusiness } from '@/lib/auth';
import { getBusinessNotificationSettingsForBusiness } from '@/lib/business-access';
-import { TwilioSetupTone, buildTwilioSetupFlow, businessPhonePathOptions, twilioAccountModeOptions } from '@/lib/twilio-setup';
+import {
+ TwilioSetupTone,
+ buildTwilioSetupFlow,
+ businessPhonePathOptions,
+ forwardedCallAnswerOptions,
+ messagingSetupOptions,
+ twilioAccountModeOptions,
+} from '@/lib/twilio-setup';
import { db } from '@/lib/db';
import {
getManagedTextingNumber,
@@ -38,6 +45,8 @@ const adminChangedFieldLabels: Record
= {
ownerPhone: 'owner alert phone',
twilioAccountMode: 'Twilio account mode',
phoneSetupPath: 'business number path',
+ forwardedCallAnswerMode: 'forwarded call answer mode',
+ messagingSetupMode: 'messaging setup mode',
twilioNumberSetupMode: 'routing number mode',
twilioSubaccountSid: 'Twilio subaccount SID',
twilioPhoneNumber: 'Twilio number',
@@ -61,6 +70,8 @@ const adminChangedFieldLabels: Record = {
type BusinessTwilioDefaults = {
twilioAccountMode: string;
phoneSetupPath: string;
+ forwardedCallAnswerMode: string;
+ messagingSetupMode: string;
twilioNumberSetupMode: string;
twilioSubaccountSid: string;
twilioPhoneNumber: string;
@@ -166,6 +177,8 @@ export default async function SettingsPage({ searchParams }: { searchParams?: Re
const twilioDefaults: BusinessTwilioDefaults = {
twilioAccountMode: business.twilioAccountMode,
phoneSetupPath: business.phoneSetupPath,
+ forwardedCallAnswerMode: business.forwardedCallAnswerMode,
+ messagingSetupMode: business.messagingSetupMode,
twilioNumberSetupMode: business.twilioNumberSetupMode,
twilioSubaccountSid: business.twilioSubaccountSid || '',
twilioPhoneNumber: business.twilioPrimaryPhoneNumber || business.twilioPhoneNumber || '',
@@ -242,6 +255,8 @@ export default async function SettingsPage({ searchParams }: { searchParams?: Re
body: (
),
@@ -299,7 +352,11 @@ export default async function SettingsPage({ searchParams }: { searchParams?: Re
body: adminSession?.isAdmin ? (