feat(email-group): communications UX, per-record DNS status (#23002)

- Rename Communications label to singular, remove docs-home banner
- Provision unsubscribe Cloudflare records at domain creation and
surface per-record status badges; skip Cloudflare when not configured
- Move sending-domain status into the section header and only show the
records table when a record is unverified
- Reply to the original recipients when replying to your own message
- Fix DNS records table column/badge alignment; emit synthetic records
in the log driver for local testing

<img width="1496" height="849" alt="Screenshot 2026-07-17 at 7 47 24 PM"
src="https://github.com/user-attachments/assets/a5a59adb-2df4-4154-98b2-acf87a8008da"
/>
This commit is contained in:
neo773
2026-07-18 02:11:25 +05:30
committed by GitHub
parent 80ff1716e5
commit 5bedd5b8cc
23 changed files with 364 additions and 86 deletions
@@ -45,7 +45,7 @@ export const SettingsAccountsNewEmailGroupChannel = () => {
href: getSettingsPath(SettingsPath.General),
},
{
children: t`Communications`,
children: t`Communication`,
href: getSettingsPath(SettingsPath.WorkspaceCommunications),
},
{ children: t`New Email Channel` },
@@ -63,9 +63,9 @@ export const SettingsDnsRecordsTable = ({
'100px',
'minmax(0, 1fr)',
'minmax(0, 1.5fr)',
...(hasPriorityColumn ? ['max-content'] : []),
...(hasTtlColumn ? ['max-content'] : []),
...(hasStatusColumn ? ['max-content'] : []),
...(hasPriorityColumn ? ['80px'] : []),
...(hasTtlColumn ? ['80px'] : []),
...(hasStatusColumn ? ['112px'] : []),
].join(' ');
return (
@@ -79,7 +79,7 @@ export const SettingsDnsRecordsTable = ({
)}
{hasTtlColumn && <TableHeader align="center">{t`TTL`}</TableHeader>}
{hasStatusColumn && (
<TableHeader align="center">{t`Status`}</TableHeader>
<TableHeader align="right">{t`Status`}</TableHeader>
)}
</TableRow>
@@ -138,7 +138,7 @@ export const SettingsDnsRecordsTable = ({
)}
{hasTtlColumn && <TableCell align="center">{record.ttl}</TableCell>}
{hasStatusColumn && (
<TableCell align="center">
<TableCell align="right">
{isDefined(record.status) && isDefined(record.statusColor) && (
<Status
color={record.statusColor}
@@ -7,6 +7,13 @@ export const VERIFY_EMAILING_DOMAIN = gql`
domain
status
verifiedAt
verificationRecords {
type
key
value
priority
status
}
createdAt
updatedAt
}
@@ -12,6 +12,7 @@ export const GET_ALL_EMAILING_DOMAINS = gql`
key
value
priority
status
}
createdAt
updatedAt
@@ -174,7 +174,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => {
isHidden: !permissionMap[PermissionFlagType.AI_SETTINGS],
},
{
label: t`Communications`,
label: t`Communication`,
path: SettingsPath.WorkspaceCommunications,
Icon: IconMessageCircle,
isHidden: