Skip to content

Commit 73070f1

Browse files
authored
feat(account-center): add success page (#8028)
1 parent b1b7ebc commit 73070f1

File tree

28 files changed

+349
-54
lines changed

28 files changed

+349
-54
lines changed

packages/account-center/src/App.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import LogtoSignature from '@experience/shared/components/LogtoSignature';
22
import { LogtoProvider, useLogto, UserScope } from '@logto/react';
3-
import { accountCenterApplicationId } from '@logto/schemas';
3+
import { accountCenterApplicationId, SignInIdentifier } from '@logto/schemas';
44
import { useContext, useEffect } from 'react';
55
import { BrowserRouter, Route, Routes } from 'react-router-dom';
66

@@ -14,7 +14,7 @@ import LogtoErrorBoundary from './Providers/AppBoundary/LogtoErrorBoundary';
1414
import PageContextProvider from './Providers/PageContextProvider';
1515
import PageContext from './Providers/PageContextProvider/PageContext';
1616
import BrandingHeader from './components/BrandingHeader';
17-
import { emailRoute, phoneRoute, updateSuccessRoute } from './constants/routes';
17+
import { emailRoute, emailSuccessRoute, phoneRoute, phoneSuccessRoute } from './constants/routes';
1818
import initI18n from './i18n/init';
1919
import Email from './pages/Email';
2020
import Home from './pages/Home';
@@ -59,7 +59,14 @@ const Main = () => {
5959

6060
return (
6161
<Routes>
62-
<Route path={updateSuccessRoute} element={<UpdateSuccess />} />
62+
<Route
63+
path={emailSuccessRoute}
64+
element={<UpdateSuccess identifierType={SignInIdentifier.Email} />}
65+
/>
66+
<Route
67+
path={phoneSuccessRoute}
68+
element={<UpdateSuccess identifierType={SignInIdentifier.Phone} />}
69+
/>
6370
<Route path={emailRoute} element={<Email />} />
6471
<Route path={phoneRoute} element={<Phone />} />
6572
<Route index element={<Home />} />
Lines changed: 31 additions & 0 deletions
Loading

packages/account-center/src/components/ErrorPage/index.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type Props = {
1616
readonly titleKey?: TFuncKey;
1717
readonly messageKey?: TFuncKey;
1818
readonly rawMessage?: string;
19+
readonly illustration?: string;
1920
readonly action?: {
2021
titleKey: TFuncKey;
2122
onClick: () => void;
@@ -78,17 +79,19 @@ const ErrorPage = ({
7879
titleKey = 'description.not_found',
7980
messageKey,
8081
rawMessage,
82+
illustration,
8183
action,
8284
}: Props) => {
8385
const { theme } = useContext(PageContext);
8486
const message = rawMessage ?? (messageKey ? <DynamicT forKey={messageKey} /> : undefined);
85-
const illustration = theme === Theme.Light ? EmptyState : EmptyStateDark;
87+
const resolvedIllustration =
88+
illustration ?? (theme === Theme.Light ? EmptyState : EmptyStateDark);
8689

8790
return (
8891
<div className={styles.errorPage}>
8992
<PageMeta titleKey={titleKey} />
9093
<div className={styles.illustration}>
91-
<img src={illustration} alt="" role="presentation" />
94+
<img src={resolvedIllustration} alt="" role="presentation" />
9295
</div>
9396
<div className={styles.title}>
9497
<DynamicT forKey={titleKey} />
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export const emailRoute = '/email';
22
export const phoneRoute = '/phone';
3-
export const updateSuccessRoute = '/update-success';
3+
export const emailSuccessRoute = '/email/success';
4+
export const phoneSuccessRoute = '/phone/success';

packages/account-center/src/pages/CodeFlow/IdentifierBindingPage.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import LoadingContext from '@ac/Providers/LoadingContextProvider/LoadingContext'
99
import PageContext from '@ac/Providers/PageContextProvider/PageContext';
1010
import ErrorPage from '@ac/components/ErrorPage';
1111
import VerificationMethodList from '@ac/components/VerificationMethodList';
12-
import { updateSuccessRoute } from '@ac/constants/routes';
1312
import useApi from '@ac/hooks/use-api';
1413
import useErrorHandler from '@ac/hooks/use-error-handler';
1514

@@ -58,7 +57,7 @@ type IdentifierBindingPageProps<VerifyPayload, BindPayload> = {
5857
code: string
5958
) => VerifyPayload;
6059
readonly buildBindPayload: (identifier: string, verificationRecordId: string) => BindPayload;
61-
readonly successRedirect?: string;
60+
readonly successRedirect: string;
6261
readonly initialValue?: string;
6362
};
6463

@@ -73,7 +72,7 @@ const IdentifierBindingPage = <VerifyPayload, BindPayload>({
7372
bindIdentifier,
7473
buildVerifyPayload,
7574
buildBindPayload,
76-
successRedirect = updateSuccessRoute,
75+
successRedirect,
7776
initialValue = '',
7877
}: IdentifierBindingPageProps<VerifyPayload, BindPayload>) => {
7978
const { t } = useTranslation();

packages/account-center/src/pages/Email/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { SignInIdentifier } from '@logto/schemas';
22

33
import { updatePrimaryEmail } from '@ac/apis/account';
44
import { sendEmailVerificationCode, verifyEmailVerificationCode } from '@ac/apis/verification';
5+
import { emailSuccessRoute } from '@ac/constants/routes';
56

67
import IdentifierBindingPage from '../CodeFlow/IdentifierBindingPage';
78

@@ -34,6 +35,7 @@ const Email = () => (
3435
email: identifier,
3536
newIdentifierVerificationRecordId,
3637
})}
38+
successRedirect={emailSuccessRoute}
3739
/>
3840
);
3941

packages/account-center/src/pages/Phone/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { SignInIdentifier } from '@logto/schemas';
22

33
import { updatePrimaryPhone } from '@ac/apis/account';
44
import { sendPhoneVerificationCode, verifyPhoneVerificationCode } from '@ac/apis/verification';
5+
import { phoneSuccessRoute } from '@ac/constants/routes';
56

67
import IdentifierBindingPage from '../CodeFlow/IdentifierBindingPage';
78

@@ -34,6 +35,7 @@ const Phone = () => (
3435
phone: identifier,
3536
newIdentifierVerificationRecordId,
3637
})}
38+
successRedirect={phoneSuccessRoute}
3739
/>
3840
);
3941

packages/account-center/src/pages/UpdateSuccess/index.module.scss

Lines changed: 0 additions & 27 deletions
This file was deleted.

packages/account-center/src/pages/UpdateSuccess/index.tsx

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,50 @@
1-
import { useContext } from 'react';
1+
import { SignInIdentifier } from '@logto/schemas';
2+
import type { TFuncKey } from 'i18next';
3+
import { useMemo } from 'react';
24

3-
import PageContext from '@ac/Providers/PageContextProvider/PageContext';
5+
import successIllustration from '@ac/assets/icons/success.svg';
46
import ErrorPage from '@ac/components/ErrorPage';
57

6-
import styles from './index.module.scss';
8+
type TranslationMap = Partial<
9+
Record<SignInIdentifier, { readonly titleKey: TFuncKey; readonly messageKey: TFuncKey }>
10+
> & {
11+
readonly default: { readonly titleKey: TFuncKey; readonly messageKey: TFuncKey };
12+
};
13+
14+
const translationMap: TranslationMap = {
15+
[SignInIdentifier.Email]: {
16+
titleKey: 'account_center.update_success.email.title',
17+
messageKey: 'account_center.update_success.email.description',
18+
},
19+
[SignInIdentifier.Phone]: {
20+
titleKey: 'account_center.update_success.phone.title',
21+
messageKey: 'account_center.update_success.phone.description',
22+
},
23+
default: {
24+
titleKey: 'account_center.update_success.default.title',
25+
messageKey: 'account_center.update_success.default.description',
26+
},
27+
};
28+
29+
type Props = {
30+
readonly identifierType?: SignInIdentifier;
31+
};
732

8-
const UpdateSuccess = () => {
9-
const { accountCenterSettings } = useContext(PageContext);
33+
const UpdateSuccess = ({ identifierType }: Props) => {
34+
const translationKeys = useMemo(() => {
35+
if (!identifierType) {
36+
return translationMap.default;
37+
}
1038

11-
if (!accountCenterSettings?.enabled) {
12-
return (
13-
<ErrorPage titleKey="error.something_went_wrong" messageKey="error.feature_not_enabled" />
14-
);
15-
}
39+
return translationMap[identifierType] ?? translationMap.default;
40+
}, [identifierType]);
1641

1742
return (
18-
<div className={styles.container}>
19-
{/* <PageMeta titleKey="Update success" /> */}
20-
{/* TODO: update with correct phrase after design ready */}
21-
<div className={styles.title}>Update success</div>
22-
<div className={styles.message}>Your changes have been saved successfully.</div>
23-
</div>
43+
<ErrorPage
44+
illustration={successIllustration}
45+
titleKey={translationKeys.titleKey}
46+
messageKey={translationKeys.messageKey}
47+
/>
2448
);
2549
};
2650

packages/account-center/src/utils/account-center-route.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { emailRoute, phoneRoute, updateSuccessRoute } from '@ac/constants/routes';
1+
import { emailRoute, emailSuccessRoute, phoneRoute, phoneSuccessRoute } from '@ac/constants/routes';
22

33
export const accountCenterBasePath = '/account-center';
44
const storageKey = 'account-center-route-cache';
55

66
const knownRoutePrefixes: readonly string[] = [
77
emailRoute,
8-
updateSuccessRoute,
8+
emailSuccessRoute,
99
phoneRoute,
10+
phoneSuccessRoute,
1011
'/username',
1112
'/password',
1213
];

0 commit comments

Comments
 (0)