From 8a2a004fb53e1db7f68b4836b7d54468d9ef94c7 Mon Sep 17 00:00:00 2001 From: Antoine Moreaux Date: Fri, 18 Apr 2025 10:18:36 +0200 Subject: [PATCH] feat(settings): add domain validation effect and delete functionality (#11643) Introduced a new effect component to validate custom domain DNS records on mount, centralizing logic. Added a button to reset the custom domain field, improving user control and form handling. Refactored related code for maintainability and enhanced UI structure. Fix https://github.com/twentyhq/core-team-issues/issues/853 --- .../CheckCustomDomainValidRecordsEffect.tsx | 15 ++++++ .../workspace/SettingsCustomDomain.tsx | 47 +++++++++++++------ .../hooks/useCheckCustomDomainValidRecords.ts | 13 ++--- 3 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 packages/twenty-front/src/pages/settings/workspace/CheckCustomDomainValidRecordsEffect.tsx diff --git a/packages/twenty-front/src/pages/settings/workspace/CheckCustomDomainValidRecordsEffect.tsx b/packages/twenty-front/src/pages/settings/workspace/CheckCustomDomainValidRecordsEffect.tsx new file mode 100644 index 000000000..3e9195ef5 --- /dev/null +++ b/packages/twenty-front/src/pages/settings/workspace/CheckCustomDomainValidRecordsEffect.tsx @@ -0,0 +1,15 @@ +/* @license Enterprise */ +import { useCheckCustomDomainValidRecords } from '~/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords'; +import { useEffect } from 'react'; + +export const CheckCustomDomainValidRecordsEffect = () => { + const { checkCustomDomainRecords } = useCheckCustomDomainValidRecords(); + + useEffect(() => { + checkCustomDomainRecords(); + // Check custom domain only needs to run once at mount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return <>; +}; diff --git a/packages/twenty-front/src/pages/settings/workspace/SettingsCustomDomain.tsx b/packages/twenty-front/src/pages/settings/workspace/SettingsCustomDomain.tsx index 9b5ce1a56..3098e1231 100644 --- a/packages/twenty-front/src/pages/settings/workspace/SettingsCustomDomain.tsx +++ b/packages/twenty-front/src/pages/settings/workspace/SettingsCustomDomain.tsx @@ -9,15 +9,22 @@ import { customDomainRecordsState } from '~/pages/settings/workspace/states/cust import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { useCheckCustomDomainValidRecords } from '~/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords'; -import { Button } from 'twenty-ui/input'; -import { H2Title, IconReload } from 'twenty-ui/display'; +import { Button, ButtonGroup } from 'twenty-ui/input'; +import { H2Title, IconReload, IconTrash } from 'twenty-ui/display'; import { Section } from 'twenty-ui/layout'; +import { CheckCustomDomainValidRecordsEffect } from '~/pages/settings/workspace/CheckCustomDomainValidRecordsEffect'; const StyledDomainFormWrapper = styled.div` display: flex; gap: ${({ theme }) => theme.spacing(2)}; `; +const StyledButtonGroup = styled(ButtonGroup)` + & > :not(:first-of-type) > button { + border-left: none; + } +`; + const StyledButton = styled(Button)` align-self: flex-start; `; @@ -37,24 +44,26 @@ export const SettingsCustomDomain = () => { const { checkCustomDomainRecords } = useCheckCustomDomainValidRecords(); - if (!customDomainRecords && !isLoading) { - checkCustomDomainRecords(); - } - const currentWorkspace = useRecoilValue(currentWorkspaceState); const { t } = useLingui(); - const { control } = useFormContext<{ + const { control, setValue, trigger } = useFormContext<{ customDomain: string; }>(); + const deleteCustomDomain = () => { + setValue('customDomain', ''); + trigger(); + }; + return (
+ { /> )} /> - + + + + {currentWorkspace?.customDomain && ( diff --git a/packages/twenty-front/src/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords.ts b/packages/twenty-front/src/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords.ts index 901e28f6c..51f43a4c1 100644 --- a/packages/twenty-front/src/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords.ts +++ b/packages/twenty-front/src/pages/settings/workspace/hooks/useCheckCustomDomainValidRecords.ts @@ -16,12 +16,13 @@ export const useCheckCustomDomainValidRecords = () => { })); checkCustomDomainValidRecords({ onCompleted: (data) => { - if (isDefined(data.checkCustomDomainValidRecords)) { - setCustomDomainRecords({ - isLoading: false, - customDomainRecords: data.checkCustomDomainValidRecords, - }); - } + setCustomDomainRecords((currentState) => ({ + ...currentState, + isLoading: false, + ...(isDefined(data.checkCustomDomainValidRecords) + ? { customDomainRecords: data.checkCustomDomainValidRecords } + : {}), + })); }, }); };