Files
twenty_crm/packages/twenty-front/src/pages/onboarding/SyncEmails.tsx
Charles Bochet 15eb96337f Various fixes (#11567)
In this PR:
- Remove SignUpLoading blank screen by an empty dark overlay =>
VerifyEffect
- Add ModalContent from pages themselves instead of using it the Layout.
This allow for empty dark overlay without showing an empty modal with
padding
2025-04-14 17:24:16 +02:00

154 lines
5.3 KiB
TypeScript

import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { useState } from 'react';
import { useRecoilValue } from 'recoil';
import { Key } from 'ts-key-enum';
import { SubTitle } from '@/auth/components/SubTitle';
import { Title } from '@/auth/components/Title';
import { OnboardingSyncEmailsSettingsCard } from '@/onboarding/components/OnboardingSyncEmailsSettingsCard';
import { useSetNextOnboardingStatus } from '@/onboarding/hooks/useSetNextOnboardingStatus';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { isGoogleCalendarEnabledState } from '@/client-config/states/isGoogleCalendarEnabledState';
import { isGoogleMessagingEnabledState } from '@/client-config/states/isGoogleMessagingEnabledState';
import { isMicrosoftCalendarEnabledState } from '@/client-config/states/isMicrosoftCalendarEnabledState';
import { isMicrosoftMessagingEnabledState } from '@/client-config/states/isMicrosoftMessagingEnabledState';
import { useTriggerApisOAuth } from '@/settings/accounts/hooks/useTriggerApiOAuth';
import { AppPath } from '@/types/AppPath';
import { Modal } from '@/ui/layout/modal/components/Modal';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { IconGoogle, IconMicrosoft } from 'twenty-ui/display';
import { MainButton } from 'twenty-ui/input';
import { ClickToActionLink } from 'twenty-ui/navigation';
import {
CalendarChannelVisibility,
MessageChannelVisibility,
useSkipSyncEmailOnboardingStepMutation,
} from '~/generated/graphql';
const StyledSyncEmailsContainer = styled.div`
display: flex;
flex-direction: row;
width: 100%;
margin: ${({ theme }) => theme.spacing(8)} 0;
gap: ${({ theme }) => theme.spacing(2)};
`;
const StyledActionLinkContainer = styled.div`
display: flex;
flex-direction: row;
margin: ${({ theme }) => theme.spacing(3)} 0 0;
padding-top: ${({ theme }) => theme.spacing(2)};
`;
const StyledProviderContainer = styled.div`
display: flex;
flex-direction: column;
gap: ${({ theme }) => theme.spacing(3)};
`;
export const SyncEmails = () => {
const theme = useTheme();
const { triggerApisOAuth } = useTriggerApisOAuth();
const setNextOnboardingStatus = useSetNextOnboardingStatus();
const [visibility, setVisibility] = useState<MessageChannelVisibility>(
MessageChannelVisibility.SHARE_EVERYTHING,
);
const [skipSyncEmailOnboardingStatusMutation] =
useSkipSyncEmailOnboardingStepMutation();
const handleButtonClick = async (provider: ConnectedAccountProvider) => {
const calendarChannelVisibility =
visibility === MessageChannelVisibility.SHARE_EVERYTHING
? CalendarChannelVisibility.SHARE_EVERYTHING
: CalendarChannelVisibility.METADATA;
await triggerApisOAuth(provider, {
redirectLocation: AppPath.Index,
messageVisibility: visibility,
calendarVisibility: calendarChannelVisibility,
});
};
const continueWithoutSync = async () => {
await skipSyncEmailOnboardingStatusMutation();
setNextOnboardingStatus();
};
const isGoogleMessagingEnabled = useRecoilValue(
isGoogleMessagingEnabledState,
);
const isMicrosoftMessagingEnabled = useRecoilValue(
isMicrosoftMessagingEnabledState,
);
const isGoogleCalendarEnabled = useRecoilValue(isGoogleCalendarEnabledState);
const isMicrosoftCalendarEnabled = useRecoilValue(
isMicrosoftCalendarEnabledState,
);
const isGoogleProviderEnabled =
isGoogleMessagingEnabled || isGoogleCalendarEnabled;
const isMicrosoftProviderEnabled =
isMicrosoftMessagingEnabled || isMicrosoftCalendarEnabled;
useScopedHotkeys(
[Key.Enter],
async () => {
await continueWithoutSync();
},
PageHotkeyScope.SyncEmail,
[continueWithoutSync],
);
return (
<Modal.Content isVerticalCentered isHorizontalCentered>
<Title noMarginTop>Emails and Calendar</Title>
<SubTitle>
Sync your Emails and Calendar with Twenty. Choose your privacy settings.
</SubTitle>
<StyledSyncEmailsContainer>
<OnboardingSyncEmailsSettingsCard
value={visibility}
onChange={setVisibility}
/>
</StyledSyncEmailsContainer>
<StyledProviderContainer>
{isGoogleProviderEnabled && (
<MainButton
title="Sync with Google"
onClick={() => handleButtonClick(ConnectedAccountProvider.GOOGLE)}
width={200}
Icon={() => <IconGoogle size={theme.icon.size.sm} />}
/>
)}
{isMicrosoftProviderEnabled && (
<MainButton
title="Sync with Outlook"
onClick={() =>
handleButtonClick(ConnectedAccountProvider.MICROSOFT)
}
width={200}
Icon={() => <IconMicrosoft size={theme.icon.size.sm} />}
/>
)}
{!isMicrosoftProviderEnabled && !isGoogleProviderEnabled && (
<MainButton
title="Continue"
onClick={continueWithoutSync}
width={144}
/>
)}
</StyledProviderContainer>
<StyledActionLinkContainer>
<ClickToActionLink onClick={continueWithoutSync}>
Continue without sync
</ClickToActionLink>
</StyledActionLinkContainer>
</Modal.Content>
);
};