Skip to content

Commit 3e612ca

Browse files
committed
refactor(experience): update error page to accept error message from url search params
1 parent bf7cf5b commit 3e612ca

File tree

17 files changed

+118
-7
lines changed

17 files changed

+118
-7
lines changed

packages/experience/src/pages/ErrorPage/index.tsx

+25-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Theme } from '@logto/schemas';
22
import type { TFuncKey } from 'i18next';
3-
import { useContext } from 'react';
3+
import { useContext, useMemo } from 'react';
44

55
import StaticPageLayout from '@/Layout/StaticPageLayout';
66
import PageContext from '@/Providers/PageContextProvider/PageContext';
@@ -19,22 +19,40 @@ type Props = {
1919
readonly rawMessage?: string;
2020
};
2121

22+
const determineErrorKeysBySearchParams = ():
23+
| { titleKey: TFuncKey; messageKey: TFuncKey }
24+
| undefined => {
25+
const searchParams = new URLSearchParams(window.location.search);
26+
27+
if (searchParams.get('code')?.startsWith('one_time_token.')) {
28+
return { titleKey: 'error.invalid_link', messageKey: 'error.invalid_link_description' };
29+
}
30+
31+
return undefined;
32+
};
33+
34+
/**
35+
* Error page that accepts data from other pages or directly from the URL params.
36+
*/
2237
const ErrorPage = ({ title = 'description.not_found', message, rawMessage }: Props) => {
2338
const { theme } = useContext(PageContext);
24-
const errorMessage = Boolean(rawMessage ?? message);
39+
const { titleKey = title, messageKey = message } = determineErrorKeysBySearchParams() ?? {};
40+
41+
const errorMessage = useMemo(
42+
() => rawMessage ?? <DynamicT forKey={messageKey} />,
43+
[rawMessage, messageKey]
44+
);
2545

2646
return (
2747
<StaticPageLayout>
28-
<PageMeta titleKey={title} />
48+
<PageMeta titleKey={titleKey} />
2949
{history.length > 1 && <NavBar />}
3050
<div className={styles.container}>
3151
{theme === Theme.Light ? <EmptyState /> : <EmptyStateDark />}
3252
<div className={styles.title}>
33-
<DynamicT forKey={title} />
53+
<DynamicT forKey={titleKey} />
3454
</div>
35-
{errorMessage && (
36-
<div className={styles.message}>{rawMessage ?? <DynamicT forKey={message} />}</div>
37-
)}
55+
{errorMessage && <div className={styles.message}>{errorMessage}</div>}
3856
<SupportInfo />
3957
</div>
4058
</StaticPageLayout>

packages/phrases-experience/src/locales/ar/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: 'انتهت مهلة الطلب. يرجى المحاولة مرة أخرى لاحقًا.',
2020
password_rejected,
2121
sso_not_enabled: 'تسجيل الدخول الموحد غير ممكّن لحساب البريد الإلكتروني هذا.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/de/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: 'Zeitüberschreitung. Bitte melde dich erneut an.',
2020
password_rejected,
2121
sso_not_enabled: 'Single Sign-On ist für dieses E-Mail-Konto nicht aktiviert.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/en/error/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ const error = {
1919
timeout: 'Request timeout. Please try again later.',
2020
password_rejected,
2121
sso_not_enabled: 'Single Sign-On is not enabled for this email account.',
22+
invalid_link: 'Invalid link',
23+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
24+
something_went_wrong: 'Something went wrong.',
2225
};
2326

2427
export default Object.freeze(error);

packages/phrases-experience/src/locales/es/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ const error = {
2121
password_rejected,
2222
sso_not_enabled:
2323
'El inicio de sesión único no está habilitado para esta cuenta de correo electrónico.',
24+
/** UNTRANSLATED */
25+
invalid_link: 'Invalid link',
26+
/** UNTRANSLATED */
27+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
28+
/** UNTRANSLATED */
29+
something_went_wrong: 'Something went wrong.',
2430
};
2531

2632
export default Object.freeze(error);

packages/phrases-experience/src/locales/fr/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ const error = {
2121
timeout: "Délai d'attente de la requête dépassé. Veuillez réessayer plus tard.",
2222
password_rejected,
2323
sso_not_enabled: "La authentification unique n'est pas activée pour ce compte de messagerie.",
24+
/** UNTRANSLATED */
25+
invalid_link: 'Invalid link',
26+
/** UNTRANSLATED */
27+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
28+
/** UNTRANSLATED */
29+
something_went_wrong: 'Something went wrong.',
2430
};
2531

2632
export default Object.freeze(error);

packages/phrases-experience/src/locales/it/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: 'Timeout della richiesta. Si prega di riprovare più tardi.',
2020
password_rejected,
2121
sso_not_enabled: 'Single sign-on non abilitato per questo account email.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/ja/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ const error = {
2020
timeout: 'リクエストタイムアウト。後でもう一度お試しください。',
2121
password_rejected,
2222
sso_not_enabled: 'このメールアカウントではシングルサインオンが有効になっていません。',
23+
/** UNTRANSLATED */
24+
invalid_link: 'Invalid link',
25+
/** UNTRANSLATED */
26+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
27+
/** UNTRANSLATED */
28+
something_went_wrong: 'Something went wrong.',
2329
};
2430

2531
export default Object.freeze(error);

packages/phrases-experience/src/locales/ko/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: '요청 시간이 초과되었어요. 잠시 후에 다시 시도해 주세요.',
2020
password_rejected,
2121
sso_not_enabled: '이 이메일 계정에 대해 단일 로그인이 활성화되지 않았어요.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/pl-pl/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ const error = {
2020
timeout: 'Czas żądania upłynął. Proszę spróbuj ponownie później.',
2121
password_rejected,
2222
sso_not_enabled: 'Pojedyncze logowanie nie jest włączony dla tego konta e-mail.',
23+
/** UNTRANSLATED */
24+
invalid_link: 'Invalid link',
25+
/** UNTRANSLATED */
26+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
27+
/** UNTRANSLATED */
28+
something_went_wrong: 'Something went wrong.',
2329
};
2430

2531
export default Object.freeze(error);

packages/phrases-experience/src/locales/pt-br/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: 'Tempo limite excedido. Por favor, tente novamente mais tarde.',
2020
password_rejected,
2121
sso_not_enabled: 'O Single Sign-On não está habilitado para esta conta de e-mail.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/pt-pt/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ const error = {
2020
timeout: 'Tempo limite de sessão. Volte e faça login novamente.',
2121
password_rejected,
2222
sso_not_enabled: 'O Single Sign-On não está habilitado para esta conta de e-mail.',
23+
/** UNTRANSLATED */
24+
invalid_link: 'Invalid link',
25+
/** UNTRANSLATED */
26+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
27+
/** UNTRANSLATED */
28+
something_went_wrong: 'Something went wrong.',
2329
};
2430

2531
export default Object.freeze(error);

packages/phrases-experience/src/locales/ru/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ const error = {
2020
timeout: 'Время ожидания истекло. Пожалуйста, повторите попытку позднее.',
2121
password_rejected,
2222
sso_not_enabled: 'Односторонняя авторизация не включена для этого аккаунта электронной почты.',
23+
/** UNTRANSLATED */
24+
invalid_link: 'Invalid link',
25+
/** UNTRANSLATED */
26+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
27+
/** UNTRANSLATED */
28+
something_went_wrong: 'Something went wrong.',
2329
};
2430

2531
export default Object.freeze(error);

packages/phrases-experience/src/locales/tr-tr/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: 'Oturum zaman aşımına uğradı. Lütfen geri dönüp tekrar giriş yapınız.',
2020
password_rejected,
2121
sso_not_enabled: 'Bu e-posta hesabı için tek oturum açma etkin değil.',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/zh-cn/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: '请求超时,请稍后重试。',
2020
password_rejected,
2121
sso_not_enabled: '此邮箱账户未启用单点登录。',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/zh-hk/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: '請求超時,請稍後重試。',
2020
password_rejected,
2121
sso_not_enabled: '此電子郵件帳戶未啟用單一登錄。',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

packages/phrases-experience/src/locales/zh-tw/error/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const error = {
1919
timeout: '請求超時,請稍後重試。',
2020
password_rejected,
2121
sso_not_enabled: '此郵箱帳戶未啟用單一登錄。',
22+
/** UNTRANSLATED */
23+
invalid_link: 'Invalid link',
24+
/** UNTRANSLATED */
25+
invalid_link_description: 'Your magic link may have expired or is no longer valid.',
26+
/** UNTRANSLATED */
27+
something_went_wrong: 'Something went wrong.',
2228
};
2329

2430
export default Object.freeze(error);

0 commit comments

Comments
 (0)