Skip to content

Commit 25168a8

Browse files
author
MargeBot
committed
Merge branch 'oles-disable-e2ee' into 'main'
Disable OLES addresses' E2EE before the migration is completed See merge request web/clients!25564
2 parents 9c775b4 + 37be387 commit 25168a8

6 files changed

Lines changed: 257 additions & 82 deletions

File tree

packages/activation/src/oles/components/MigrationAssistant/MigratingModal.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,31 @@ import { LazyLottie } from '../LazyLottie';
1010

1111
import './MigratingModal.scss';
1212

13-
const MigratingModal = () => {
13+
type ModalVariant = 'migrating' | 'completing';
14+
15+
const MigratingModal = ({ variant }: { variant: ModalVariant }) => {
1416
useBeforeUnload(true);
1517

18+
const variantConfigs: Record<
19+
ModalVariant,
20+
{ title: string; subtitle: string; getAnimationData: () => Promise<{ default: object }> }
21+
> = {
22+
migrating: {
23+
title: c('BOSS').t`Creating accounts. Going private`,
24+
subtitle: c('BOSS')
25+
.t`We’re creating your accounts and importing your data now. Every email, every event is yours alone. Visible to your team only. Not us, not anyone else.`,
26+
getAnimationData: () => import('../../animations/fileTransfer.json'),
27+
},
28+
completing: {
29+
title: c('BOSS').t`Going private`,
30+
subtitle: c('BOSS')
31+
.t`We’re switching on end-to-end encryption for everyone. Every email, every event is now yours alone. Visible to your team only. Not us, not anyone else.`,
32+
getAnimationData: () => import('../../animations/fileTransfer.json'),
33+
},
34+
};
35+
36+
const { title, subtitle, getAnimationData } = variantConfigs[variant];
37+
1638
return (
1739
<ModalTwo
1840
open
@@ -22,18 +44,12 @@ const MigratingModal = () => {
2244
>
2345
<ModalTwoContent>
2446
<div className="text-center pt-12 pb-6">
25-
<LazyLottie
26-
autoPlay
27-
getAnimationData={() => import('../../animations/fileTransfer.json')}
28-
loop={true}
29-
className="px-12"
30-
/>
47+
<LazyLottie autoPlay getAnimationData={getAnimationData} loop={true} className="px-12" />
3148
<h2 className="text-center text-lg text-semibold mt-6 mb-4">
32-
{c('BOSS').t`Creating accounts. Going private`}
49+
{title}
3350
<EllipsisLoader />
3451
</h2>
35-
<p className="m-0 color-weak">{c('BOSS')
36-
.t`We’re creating your accounts and importing your data now. Every email, every event is yours alone. Visible to your team only. Not us, not anyone else.`}</p>
52+
<p className="m-0 color-weak">{subtitle}</p>
3753
<p className="color-danger flex items-center justify-center gap-2">
3854
<IcInfoCircle />
3955
{c('BOSS').t`Please don’t close or refresh this window.`}

packages/activation/src/oles/components/MigrationAssistant/MigrationAssistant.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ const MigrationAssistant: FC<StepComponentProps> = ({ model, onNext }) => {
297297
/>
298298
)}
299299

300-
{migrating && <MigratingModal />}
300+
{migrating && <MigratingModal variant="migrating" />}
301301
</div>
302302
);
303303
};

packages/activation/src/oles/components/MigrationFlow.tsx

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ import { CircleLoader } from '@proton/atoms/CircleLoader/CircleLoader';
77
import { Href } from '@proton/atoms/Href/Href';
88
import EllipsisLoader from '@proton/components/components/loader/EllipsisLoader';
99
import useModalState from '@proton/components/components/modalTwo/useModalState';
10-
import { useSilentApi } from '@proton/components/hooks/useSilentApi';
1110
import usePrevious from '@proton/hooks/usePrevious';
1211
import { useDispatch } from '@proton/redux-shared-store/sharedProvider';
13-
import { getDomainRegistrar } from '@proton/shared/lib/api/domains';
1412
import { getEmailParts } from '@proton/shared/lib/helpers/email';
1513
import { getKnowledgeBaseUrl } from '@proton/shared/lib/helpers/url';
16-
import type { DomainRegistrar } from '@proton/shared/lib/interfaces';
1714

1815
import { ApiImporterOrganizationState } from '../../api/api.interface';
1916
import { EASY_SWITCH_FEATURES, OAUTH_PROVIDER } from '../../interface';
@@ -46,7 +43,6 @@ const SETUP_DEFAULTS: MigrationConfiguration = {
4643
};
4744

4845
const MigrationFlow = () => {
49-
const api = useSilentApi();
5046
const dispatch = useDispatch();
5147
const [customDomains] = useCustomDomains();
5248
const [importerOrganizations] = useImporterOrganizations();
@@ -105,18 +101,6 @@ const MigrationFlow = () => {
105101
update: onUpdate,
106102
};
107103

108-
useEffect(() => {
109-
void (async () => {
110-
if (!domain) {
111-
onUpdate({ domainRegistrarId: undefined });
112-
return;
113-
}
114-
115-
const { RegistrarID } = await api<DomainRegistrar>(getDomainRegistrar(domain.ID));
116-
onUpdate({ domainRegistrarId: RegistrarID ?? undefined });
117-
})();
118-
}, [domain]);
119-
120104
const prevModelState = usePrevious(model.state);
121105
useEffect(() => {
122106
if (

packages/activation/src/oles/components/MigrationSetup/MigrationSetup.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@ import React, { type FC, useEffect, useState } from 'react';
33
import { c } from 'ttag';
44

55
import { Button } from '@proton/atoms/Button/Button';
6+
import { useSilentApi } from '@proton/components/hooks/useSilentApi';
67
import { IcCheckmarkCircleFilled } from '@proton/icons/icons/IcCheckmarkCircleFilled';
78
import { IcChevronDownFilled } from '@proton/icons/icons/IcChevronDownFilled';
89
import { IcChevronUpFilled } from '@proton/icons/icons/IcChevronUpFilled';
910
import { IcExclamationCircle } from '@proton/icons/icons/IcExclamationCircle';
11+
import { getDomainRegistrar } from '@proton/shared/lib/api/domains';
1012
import { SECOND } from '@proton/shared/lib/constants';
11-
import { DKIM_STATE, DMARC_STATE, SPF_STATE, VERIFY_STATE } from '@proton/shared/lib/interfaces/Domain';
13+
import {
14+
DKIM_STATE,
15+
DMARC_STATE,
16+
type DomainRegistrar,
17+
SPF_STATE,
18+
VERIFY_STATE,
19+
} from '@proton/shared/lib/interfaces/Domain';
1220
import clsx from '@proton/utils/clsx';
1321
import noop from '@proton/utils/noop';
1422

@@ -172,6 +180,7 @@ const MigrationNavigationListStepButton = ({
172180
};
173181

174182
const MigrationSetup: FC<MigrationSetupProps> = ({ model, onSubmit }) => {
183+
const api = useSilentApi();
175184
const [providerUsers, , refreshProviderUsers] = useProviderUsers(model.domainName);
176185
const [state, setState] = useState<MigrationSetupState>({
177186
currentStep: model.importerOrganizationId ? 'migrate-accounts' : 'configure-migration',
@@ -220,6 +229,18 @@ const MigrationSetup: FC<MigrationSetupProps> = ({ model, onSubmit }) => {
220229
return () => clearTimeout(timer);
221230
}, [hasIncompleteUsers, hasInactiveUsers, refreshProviderUsers]);
222231

232+
useEffect(() => {
233+
void (async () => {
234+
if (!model.domain) {
235+
model.update({ domainRegistrarId: undefined });
236+
return;
237+
}
238+
239+
const { RegistrarID } = await api<DomainRegistrar>(getDomainRegistrar(model.domain.ID));
240+
model.update({ domainRegistrarId: RegistrarID ?? undefined });
241+
})();
242+
}, [model.domain]);
243+
223244
const stepConfigs: Record<StepId, StepConfig> = {
224245
'configure-migration': {
225246
text: c('BOSS').t`Configure migration`,

packages/activation/src/oles/components/MigrationSetup/StepFinal.tsx

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,30 @@ import { type FC, useState } from 'react';
22

33
import { c } from 'ttag';
44

5-
import { patchOrganizationImporter } from '@proton/activation/src/api/api';
6-
import { type ApiImporterOrganization, ApiImporterOrganizationState } from '@proton/activation/src/api/api.interface';
5+
import { ApiImporterOrganizationState } from '@proton/activation/src/api/api.interface';
76
import { Banner } from '@proton/atoms/Banner/Banner';
87
import { Button } from '@proton/atoms/Button/Button';
9-
import Checkbox from '@proton/components/components/input/Checkbox';
10-
import { useSilentApi } from '@proton/components/hooks/useSilentApi';
8+
import {
9+
BorderedContainer,
10+
BorderedContainerItem,
11+
} from '@proton/components/components/BorderedStackedGroup/BorderedContainer';
1112
import useLoading from '@proton/hooks/useLoading';
1213
import { IcExclamationCircleFilled } from '@proton/icons/icons/IcExclamationCircleFilled';
14+
import { useDispatch } from '@proton/redux-shared-store/sharedProvider';
1315
import { BRAND_NAME } from '@proton/shared/lib/constants';
1416
import { MX_STATE } from '@proton/shared/lib/interfaces';
1517

18+
import { completeMigration } from '../../thunk';
1619
import type { MigrationModel } from '../../types';
1720
import { useProviderUsers } from '../../useProviderUsers';
18-
import { LazyLottie } from '../LazyLottie';
21+
import MigratingModal from '../MigrationAssistant/MigratingModal';
1922
import DNSGroupRecords, { type DNSGroup } from './DNSGroupRecords';
2023
import type { StepComponentProps } from './MigrationSetup';
2124

2225
const StepFinal: FC<StepComponentProps> = ({ model: migrationConfiguration }) => {
2326
const model = migrationConfiguration as MigrationModel;
27+
const dispatch = useDispatch();
2428

25-
const api = useSilentApi();
2629
const [providerUsers] = useProviderUsers(model.domainName);
2730
const [loading, withLoading] = useLoading();
2831
const [confirmed, setConfirmed] = useState(false);
@@ -32,14 +35,14 @@ const StepFinal: FC<StepComponentProps> = ({ model: migrationConfiguration }) =>
3235
return;
3336
}
3437

35-
await api<ApiImporterOrganization>(
36-
patchOrganizationImporter(model.importerOrganizationId!, {
37-
State: ApiImporterOrganizationState.COMPLETED,
38+
const { State: state } = await dispatch(
39+
completeMigration({
40+
importerOrganizationId: model.importerOrganizationId,
41+
providerUsers: providerUsers ?? [],
3842
})
39-
)
40-
.then(({ State }) => State)
41-
.catch(() => model.state)
42-
.then((state) => model.update({ state }));
43+
).unwrap();
44+
45+
model.update({ state });
4346
};
4447

4548
const handleSaveAndExit = () => withLoading(handleFinalize());
@@ -94,7 +97,7 @@ const StepFinal: FC<StepComponentProps> = ({ model: migrationConfiguration }) =>
9497
size="medium"
9598
className="rounded-lg"
9699
>
97-
{c('Action').t`Save & exit`}
100+
{c('Action').t`Save & finish`}
98101
</Button>
99102
</div>
100103
</div>
@@ -119,26 +122,30 @@ const StepFinal: FC<StepComponentProps> = ({ model: migrationConfiguration }) =>
119122
{c('BOSS')
120123
.t`You're almost done, you need to configure your domain to receive your emails directly on ${BRAND_NAME}. Once confirmed, your team will stop receiving new emails on Gmail and the migration will be completed.`}
121124
</p>
122-
<LazyLottie
123-
style={{ padding: '0 10rem' }}
124-
autoPlay
125-
getAnimationData={() => import('../../animations/providerSwitch.json')}
126-
loop={true}
127-
/>
128125
<p className="color-weak">{c('BOSS')
129126
.t`Copy the below code and paste it in the DNS section of your domain host.`}</p>
130127
<DNSGroupRecords group={group} />
131-
<Checkbox
132-
id="confirm-mx-records"
133-
className="items-center text-normal"
134-
checked={confirmed}
135-
onChange={(e) => setConfirmed(e.target.checked)}
136-
>
137-
<div className="px-2">
138-
<p className="m-0">{c('Label').t`Confirm MX records added`}</p>
139-
<span className="color-weak text-sm">{c('Info').t`Required to proceed to the next step`}</span>
140-
</div>
141-
</Checkbox>
128+
<BorderedContainer className="mb-4 mt-2">
129+
<BorderedContainerItem
130+
className="flex flex-row flex-nowrap items-center gap-2 justify-space-between"
131+
paddingClassName="py-2 px-5"
132+
>
133+
<div>
134+
<p className="m-0 text-semibold">{c('Label').t`Confirm MX records added`}</p>
135+
<span className="color-weak text-sm">{c('Info').t`Required to complete the migration`}</span>
136+
</div>
137+
138+
<Button
139+
disabled={confirmed}
140+
color="norm"
141+
className="text-semibold rounded-lg"
142+
size="medium"
143+
onClick={() => setConfirmed(true)}
144+
>{c('BOSS').t`Confirm`}</Button>
145+
</BorderedContainerItem>
146+
</BorderedContainer>
147+
148+
{loading && <MigratingModal variant="completing" />}
142149
</div>
143150
);
144151
};

0 commit comments

Comments
 (0)