Files
twenty/packages/twenty-front/src/modules/command-menu-item/engine-command/global/components/ComposeEmailCommand.tsx
T

79 lines
2.8 KiB
TypeScript

import { useFirstConnectedAccount } from '@/activities/emails/hooks/useFirstConnectedAccount';
import { useResolveDefaultEmailRecipient } from '@/activities/emails/hooks/useResolveDefaultEmailRecipient';
import { getPrimaryEmailFromRecord } from '@/activities/emails/utils/getPrimaryEmailFromRecord';
import { MAX_EMAIL_RECIPIENTS } from '@/activities/emails/constants/EmailRecipientLimits';
import { HeadlessEngineCommandWrapperEffect } from '@/command-menu-item/engine-command/components/HeadlessEngineCommandWrapperEffect';
import { useHeadlessCommandContextApi } from '@/command-menu-item/engine-command/hooks/useHeadlessCommandContextApi';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { useOpenComposeEmailInSidePanel } from '@/side-panel/hooks/useOpenComposeEmailInSidePanel';
import { CoreObjectNameSingular, SettingsPath } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { useNavigateSettings } from '~/hooks/useNavigateSettings';
export const ComposeEmailCommand = () => {
const { connectedAccountId, loading: accountLoading } =
useFirstConnectedAccount();
const { openComposeEmailInSidePanel } = useOpenComposeEmailInSidePanel();
const navigateSettings = useNavigateSettings();
const {
objectMetadataItem,
selectedRecords,
graphqlFilter,
targetedRecordsRule,
} = useHeadlessCommandContextApi();
const objectNameSingular = objectMetadataItem?.nameSingular ?? null;
const isPerson = objectNameSingular === CoreObjectNameSingular.Person;
const isBulkPerson =
isPerson &&
(selectedRecords.length > 1 || targetedRecordsRule.mode === 'exclusion');
const { records: bulkPersonRecords, loading: bulkLoading } =
useFindManyRecords({
objectNameSingular: CoreObjectNameSingular.Person,
filter: graphqlFilter ?? undefined,
recordGqlFields: { id: true, emails: { primaryEmail: true } },
limit: MAX_EMAIL_RECIPIENTS,
skip: !isBulkPerson,
});
const singleSelectedRecordId = !isBulkPerson
? (selectedRecords[0]?.id ?? null)
: null;
const { defaultTo: singleDefaultTo, loading: recipientLoading } =
useResolveDefaultEmailRecipient({
objectNameSingular,
recordId: singleSelectedRecordId,
});
const defaultTo = isBulkPerson
? bulkPersonRecords
.map(getPrimaryEmailFromRecord)
.filter(isDefined)
.join(', ')
: singleDefaultTo;
const handleExecute = () => {
if (!isDefined(connectedAccountId)) {
navigateSettings(SettingsPath.NewAccount);
return;
}
openComposeEmailInSidePanel({
connectedAccountId,
defaultTo,
});
};
const ready =
!accountLoading && (isBulkPerson ? !bulkLoading : !recipientLoading);
return (
<HeadlessEngineCommandWrapperEffect execute={handleExecute} ready={ready} />
);
};