[web] auth/error: log login error events and extract into separate component
This commit is contained in:
parent
71b4fa2e26
commit
40ff702ed2
|
|
@ -0,0 +1,78 @@
|
|||
import clsx from 'clsx';
|
||||
import { RiEmotionSadLine } from 'react-icons/ri';
|
||||
|
||||
import { useAuthSignInUp } from '~/hooks/user/useAuthFns';
|
||||
|
||||
import { useIntl } from '~/components/intl';
|
||||
import Button from '~/components/ui/Button';
|
||||
import Heading from '~/components/ui/Heading';
|
||||
import Text from '~/components/ui/Text';
|
||||
import { themeTextDangerColor } from '~/components/ui/theme';
|
||||
|
||||
type Props = Readonly<{
|
||||
code?: string;
|
||||
description?: string;
|
||||
}>;
|
||||
|
||||
export default function AuthLoginError({ code, description }: Props) {
|
||||
const errorContent = useErrorMessages();
|
||||
const intl = useIntl();
|
||||
const { signInUpHref } = useAuthSignInUp();
|
||||
|
||||
const { message: errorMessage, name: errorName } =
|
||||
errorContent[code ?? ''] || {};
|
||||
|
||||
return (
|
||||
<div className="flex max-w-sm flex-col items-center md:justify-center">
|
||||
<RiEmotionSadLine
|
||||
aria-hidden={true}
|
||||
className={clsx(themeTextDangerColor, 'size-12 shrink-0')}
|
||||
/>
|
||||
<Heading className="mb-1 mt-6 text-center" level="heading4">
|
||||
{errorName ||
|
||||
intl.formatMessage({
|
||||
defaultMessage: 'An error has occurred',
|
||||
description: 'Error message title',
|
||||
id: 'jCB415',
|
||||
})}
|
||||
</Heading>
|
||||
<Text
|
||||
className={clsx('block text-center', 'text-sm sm:text-base')}
|
||||
color="secondary"
|
||||
size="inherit">
|
||||
{errorMessage || description}
|
||||
</Text>
|
||||
<Button
|
||||
className="mt-4"
|
||||
href={signInUpHref()}
|
||||
label={intl.formatMessage({
|
||||
defaultMessage: 'Go back to sign in',
|
||||
description: 'Back to sign in page',
|
||||
id: '3qk61r',
|
||||
})}
|
||||
prefetch={null}
|
||||
variant="primary"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function useErrorMessages(): Record<string, { message: string; name: string }> {
|
||||
const intl = useIntl();
|
||||
|
||||
return {
|
||||
otp_expired: {
|
||||
message: intl.formatMessage({
|
||||
defaultMessage:
|
||||
'Login for this sign-in has expired. Please try to sign in again.',
|
||||
description: 'Error message for expired login',
|
||||
id: 'dlrooM',
|
||||
}),
|
||||
name: intl.formatMessage({
|
||||
defaultMessage: 'Login link expired',
|
||||
description: 'Error name for expired login',
|
||||
id: 'Ak+Tl1',
|
||||
}),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
@ -3,24 +3,20 @@
|
|||
import { useUser } from '@supabase/auth-helpers-react';
|
||||
import clsx from 'clsx';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { RiEmotionSadLine } from 'react-icons/ri';
|
||||
|
||||
import { useAuthSignInUp } from '~/hooks/user/useAuthFns';
|
||||
import useAuthFullPageRedirectAfterLogin from '~/hooks/user/useAuthFullPageRedirectAfterLogIn';
|
||||
|
||||
import LogoComboMark from '~/components/global/logos/LogoComboMark';
|
||||
import { useIntl } from '~/components/intl';
|
||||
import Button from '~/components/ui/Button';
|
||||
import Container from '~/components/ui/Container';
|
||||
import Heading from '~/components/ui/Heading';
|
||||
import Text from '~/components/ui/Text';
|
||||
import {
|
||||
themeRadialWhiteGlowBackground,
|
||||
themeTextDangerColor,
|
||||
} from '~/components/ui/theme';
|
||||
import { themeRadialWhiteGlowBackground } from '~/components/ui/theme';
|
||||
|
||||
import logEvent from '~/logging/logEvent';
|
||||
|
||||
import AuthLoginError from './AuthLoginError';
|
||||
|
||||
type Props = Readonly<{
|
||||
next: string | null;
|
||||
}>;
|
||||
|
|
@ -28,7 +24,6 @@ type Props = Readonly<{
|
|||
export default function AuthLoginRedirectPage({ next }: Props) {
|
||||
const intl = useIntl();
|
||||
const user = useUser();
|
||||
const { signInUpHref } = useAuthSignInUp();
|
||||
|
||||
useAuthFullPageRedirectAfterLogin(next);
|
||||
|
||||
|
|
@ -36,7 +31,6 @@ export default function AuthLoginRedirectPage({ next }: Props) {
|
|||
code?: string;
|
||||
description?: string;
|
||||
} | null>(null);
|
||||
const errorContent = useErrorMessage();
|
||||
|
||||
useEffect(() => {
|
||||
const hash = window.location.hash.substring(1);
|
||||
|
|
@ -44,23 +38,26 @@ export default function AuthLoginRedirectPage({ next }: Props) {
|
|||
|
||||
const error = params.get('error');
|
||||
|
||||
if (!error || user) {
|
||||
logEvent('auth.login_success', {
|
||||
if (error) {
|
||||
setErrorData({
|
||||
code: params.get('error_code') || undefined,
|
||||
description: params.get('error_description') || undefined,
|
||||
});
|
||||
logEvent('auth.login.fail', {
|
||||
code: params.get('error_code') || undefined,
|
||||
description: params.get('error_description') || undefined,
|
||||
error: params.get('error'),
|
||||
namespace: 'auth',
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
setErrorData({
|
||||
code: params.get('error_code') || undefined,
|
||||
description: params.get('error_description') || undefined,
|
||||
logEvent('auth.login.success', {
|
||||
namespace: 'auth',
|
||||
});
|
||||
}, [user]);
|
||||
|
||||
const { message: errorMessage, name: errorName } =
|
||||
errorContent[errorData?.code ?? ''] || {};
|
||||
|
||||
return (
|
||||
<div
|
||||
className={clsx(
|
||||
|
|
@ -76,37 +73,7 @@ export default function AuthLoginRedirectPage({ next }: Props) {
|
|||
)}
|
||||
width="xl">
|
||||
{errorData && !user ? (
|
||||
<div className="flex max-w-sm flex-col items-center md:justify-center">
|
||||
<RiEmotionSadLine
|
||||
aria-hidden={true}
|
||||
className={clsx(themeTextDangerColor, 'size-12 shrink-0')}
|
||||
/>
|
||||
<Heading className="mb-1 mt-6 text-center" level="heading4">
|
||||
{errorName ||
|
||||
intl.formatMessage({
|
||||
defaultMessage: 'An error has occurred',
|
||||
description: 'Error message title',
|
||||
id: 'jCB415',
|
||||
})}
|
||||
</Heading>
|
||||
<Text
|
||||
className={clsx('block text-center', 'text-sm sm:text-base')}
|
||||
color="secondary"
|
||||
size="inherit">
|
||||
{errorMessage || errorData.description}
|
||||
</Text>
|
||||
<Button
|
||||
className="mt-4"
|
||||
href={signInUpHref()}
|
||||
label={intl.formatMessage({
|
||||
defaultMessage: 'Go back to sign in',
|
||||
description: 'Back to sign in page',
|
||||
id: '3qk61r',
|
||||
})}
|
||||
prefetch={null}
|
||||
variant="primary"
|
||||
/>
|
||||
</div>
|
||||
<AuthLoginError {...errorData} />
|
||||
) : (
|
||||
<>
|
||||
<LogoComboMark className="shrink-0" height={20} />
|
||||
|
|
@ -136,23 +103,3 @@ export default function AuthLoginRedirectPage({ next }: Props) {
|
|||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function useErrorMessage(): Record<string, { message: string; name: string }> {
|
||||
const intl = useIntl();
|
||||
|
||||
return {
|
||||
otp_expired: {
|
||||
message: intl.formatMessage({
|
||||
defaultMessage:
|
||||
'OTP code for this sign-in has expired. Please try to sign in again.',
|
||||
description: 'Error message for expired OTP',
|
||||
id: '27QHDj',
|
||||
}),
|
||||
name: intl.formatMessage({
|
||||
defaultMessage: 'OTP expired',
|
||||
description: 'Error name for expired OTP',
|
||||
id: '/JwmN3',
|
||||
}),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -213,12 +213,6 @@
|
|||
"value": "The material on this site is a literal gold mine. Before using GreatFrontEnd, I was failing phone screening rounds left and right. I never even came close to making it to the onsite round. After going through the material on GFE, I was able to land several onsites and passed my very first one! I was able to secure a job only after ~2.5 months of studying GFE at Amazon! The material on GFE is especially easy to understand and I have personally been asked questions from GFE NUMEROUS times. Additionally, GFE's Discord channel and community are so very helpful when it comes to sharing their previous interview experiences. It is very active and everyone is very open to helping!"
|
||||
}
|
||||
],
|
||||
"+JhlMu": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Congratulations on completing the question! Sign into your account or sign up for free to save your progress!"
|
||||
}
|
||||
],
|
||||
"+NbHNn": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -5699,6 +5693,12 @@
|
|||
"value": "Start the project to access submission and deployment steps"
|
||||
}
|
||||
],
|
||||
"Ak+Tl1": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Login link expired"
|
||||
}
|
||||
],
|
||||
"AkAu0m": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -10497,6 +10497,12 @@
|
|||
"value": "% off"
|
||||
}
|
||||
],
|
||||
"Lsk0wX": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Join GreatFrontEnd in 1 click"
|
||||
}
|
||||
],
|
||||
"Ludb5F": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -10829,12 +10835,6 @@
|
|||
"value": " business days."
|
||||
}
|
||||
],
|
||||
"MaorIw": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign in to save progress"
|
||||
}
|
||||
],
|
||||
"MdIpF6": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -11743,6 +11743,20 @@
|
|||
"value": "Filter by Difficulty of the original project brief"
|
||||
}
|
||||
],
|
||||
"P9zzt7": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Don't fall behind "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "count"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " other users"
|
||||
}
|
||||
],
|
||||
"PAq50+": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -12880,12 +12894,6 @@
|
|||
"value": "Series"
|
||||
}
|
||||
],
|
||||
"RDQ253": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign in to save progress"
|
||||
}
|
||||
],
|
||||
"RFAHTi": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16198,12 +16206,6 @@
|
|||
"value": "Proven preparation plans"
|
||||
}
|
||||
],
|
||||
"YXs0ZC": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Cancel"
|
||||
}
|
||||
],
|
||||
"YYJEeq": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16498,6 +16500,12 @@
|
|||
"value": "Written by ex-FAANG senior devs"
|
||||
}
|
||||
],
|
||||
"ZEPn1r": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "or"
|
||||
}
|
||||
],
|
||||
"ZFDU0d": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16574,12 +16582,6 @@
|
|||
"value": "Promotions"
|
||||
}
|
||||
],
|
||||
"ZV4dGC": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign into your account or sign up for free to save your progress!"
|
||||
}
|
||||
],
|
||||
"ZWMfa0": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -17484,6 +17486,12 @@
|
|||
"value": "Level"
|
||||
}
|
||||
],
|
||||
"bOVGLU": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Please sign in or create an account to continue"
|
||||
}
|
||||
],
|
||||
"bQ3XUx": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -18438,6 +18446,12 @@
|
|||
"value": " other banners"
|
||||
}
|
||||
],
|
||||
"dlrooM": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Login for this sign-in has expired. Please try to sign in again."
|
||||
}
|
||||
],
|
||||
"do4njS": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -20858,6 +20872,12 @@
|
|||
"value": "No community contributions"
|
||||
}
|
||||
],
|
||||
"iwMZfR": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign up with Github"
|
||||
}
|
||||
],
|
||||
"iyzDmo": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -20934,6 +20954,12 @@
|
|||
"value": "Start by simply filling in your contact information so that we know who to reach out to."
|
||||
}
|
||||
],
|
||||
"jCB415": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "An error has occurred"
|
||||
}
|
||||
],
|
||||
"jCBp3Z": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -22857,6 +22883,12 @@
|
|||
"value": "The address is used in the agreement"
|
||||
}
|
||||
],
|
||||
"n1m6Nx": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "The place for front end engineers. Upskill, ace interviews, get inspired."
|
||||
}
|
||||
],
|
||||
"n25pZ5": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -25503,6 +25535,12 @@
|
|||
"value": "You upvoted this"
|
||||
}
|
||||
],
|
||||
"sr38Pg": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign up with email"
|
||||
}
|
||||
],
|
||||
"ssyz8C": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -27931,6 +27969,12 @@
|
|||
"value": "JavaScript Coding Interview Questions"
|
||||
}
|
||||
],
|
||||
"z9Ymn4": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Sign up with"
|
||||
}
|
||||
],
|
||||
"z9d6Ys": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
|
|||
|
|
@ -213,12 +213,6 @@
|
|||
"value": "这个网站上的材料简直就是一座金矿。在使用 GreatFrontEnd 之前,我一直在电话面试中屡屡失败。我甚至从未接近过现场面试。在学习了 GFE 上的材料后,我能够获得几次现场面试,并通过了我的第一次现场面试!在亚马逊学习 GFE 大约 2.5 个月后,我才找到了一份工作!GFE 上的材料特别容易理解,我个人被问到 GFE 的问题无数次。此外,GFE 的 Discord 频道和社区在分享他们之前的面试经验方面非常有帮助。它非常活跃,每个人都非常乐于助人!"
|
||||
}
|
||||
],
|
||||
"+JhlMu": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "恭喜您完成了这个题目!登录您的帐户或免费注册以保存您的进度!"
|
||||
}
|
||||
],
|
||||
"+NbHNn": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -5707,6 +5701,12 @@
|
|||
"value": "启动项目以访问提交和部署步骤"
|
||||
}
|
||||
],
|
||||
"Ak+Tl1": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "登录链接已过期"
|
||||
}
|
||||
],
|
||||
"AkAu0m": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -10533,6 +10533,12 @@
|
|||
"value": " 折"
|
||||
}
|
||||
],
|
||||
"Lsk0wX": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "一键加入 GreatFrontEnd"
|
||||
}
|
||||
],
|
||||
"Ludb5F": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -10865,12 +10871,6 @@
|
|||
"value": " 个工作日内回复确认和付款。"
|
||||
}
|
||||
],
|
||||
"MaorIw": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "登录以保存进度"
|
||||
}
|
||||
],
|
||||
"MdIpF6": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -11769,6 +11769,20 @@
|
|||
"value": "按原始项目简报的难度筛选"
|
||||
}
|
||||
],
|
||||
"P9zzt7": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "不要落后于其他 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "count"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 位用户"
|
||||
}
|
||||
],
|
||||
"PAq50+": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -12914,12 +12928,6 @@
|
|||
"value": "系列"
|
||||
}
|
||||
],
|
||||
"RDQ253": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "登录以保存您的进度"
|
||||
}
|
||||
],
|
||||
"RFAHTi": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16222,12 +16230,6 @@
|
|||
"value": "经过验证的准备计划"
|
||||
}
|
||||
],
|
||||
"YXs0ZC": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "取消"
|
||||
}
|
||||
],
|
||||
"YYJEeq": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16526,6 +16528,12 @@
|
|||
"value": "由前 FAANG 高级开发人员撰写"
|
||||
}
|
||||
],
|
||||
"ZEPn1r": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "或"
|
||||
}
|
||||
],
|
||||
"ZFDU0d": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -16602,12 +16610,6 @@
|
|||
"value": "促销"
|
||||
}
|
||||
],
|
||||
"ZV4dGC": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "登录您的帐户或免费注册以保存您的进度!"
|
||||
}
|
||||
],
|
||||
"ZWMfa0": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -17516,6 +17518,12 @@
|
|||
"value": "级别"
|
||||
}
|
||||
],
|
||||
"bOVGLU": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "请登录或创建一个帐户以继续"
|
||||
}
|
||||
],
|
||||
"bQ3XUx": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -18474,6 +18482,12 @@
|
|||
"value": " 个横幅的轮换"
|
||||
}
|
||||
],
|
||||
"dlrooM": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "此次登录已过期。请重试。"
|
||||
}
|
||||
],
|
||||
"do4njS": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -20892,6 +20906,12 @@
|
|||
"value": "没有社区贡献"
|
||||
}
|
||||
],
|
||||
"iwMZfR": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "使用 Github 注册"
|
||||
}
|
||||
],
|
||||
"iyzDmo": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -20968,6 +20988,12 @@
|
|||
"value": "请先填写您的联系信息,以便我们联系您。"
|
||||
}
|
||||
],
|
||||
"jCB415": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "发生错误"
|
||||
}
|
||||
],
|
||||
"jCBp3Z": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -22885,6 +22911,12 @@
|
|||
"value": "地址用于协议中"
|
||||
}
|
||||
],
|
||||
"n1m6Nx": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "前端工程师的聚集地。提升技能,通过面试,获得灵感。"
|
||||
}
|
||||
],
|
||||
"n25pZ5": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -25539,6 +25571,12 @@
|
|||
"value": "你赞成此项"
|
||||
}
|
||||
],
|
||||
"sr38Pg": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "使用邮箱注册"
|
||||
}
|
||||
],
|
||||
"ssyz8C": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -27961,6 +27999,12 @@
|
|||
"value": "JavaScript 代码面试问题"
|
||||
}
|
||||
],
|
||||
"z9Ymn4": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "使用以下方式注册"
|
||||
}
|
||||
],
|
||||
"z9d6Ys": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
|
|||
|
|
@ -83,10 +83,6 @@
|
|||
"defaultMessage": "The material on this site is a literal gold mine. Before using GreatFrontEnd, I was failing phone screening rounds left and right. I never even came close to making it to the onsite round. After going through the material on GFE, I was able to land several onsites and passed my very first one! I was able to secure a job only after ~2.5 months of studying GFE at Amazon! The material on GFE is especially easy to understand and I have personally been asked questions from GFE NUMEROUS times. Additionally, GFE's Discord channel and community are so very helpful when it comes to sharing their previous interview experiences. It is very active and everyone is very open to helping!",
|
||||
"description": "User testimonial for GreatFrontEnd Interviews"
|
||||
},
|
||||
"+JhlMu": {
|
||||
"defaultMessage": "Congratulations on completing the question! Sign into your account or sign up for free to save your progress!",
|
||||
"description": "Message shown when user completes a question"
|
||||
},
|
||||
"+NbHNn": {
|
||||
"defaultMessage": "Practice JavaScript coding interview questions by implementing utility functions like throttle or polyfills. Code in-browser with solutions from ex-interviewers.",
|
||||
"description": "SEO description for JavaScript coding question format page"
|
||||
|
|
@ -2691,6 +2687,10 @@
|
|||
"defaultMessage": "Start the project to access submission and deployment steps",
|
||||
"description": "Title for project overlay on projects details page"
|
||||
},
|
||||
"Ak+Tl1": {
|
||||
"defaultMessage": "Login link expired",
|
||||
"description": "Error name for expired login"
|
||||
},
|
||||
"AkAu0m": {
|
||||
"defaultMessage": "High",
|
||||
"description": "High importance question"
|
||||
|
|
@ -5119,6 +5119,10 @@
|
|||
"defaultMessage": "Code successfully applied! {percentOff}% off",
|
||||
"description": "Message when promo code is successfully applied"
|
||||
},
|
||||
"Lsk0wX": {
|
||||
"defaultMessage": "Join GreatFrontEnd in 1 click",
|
||||
"description": "Auth card title"
|
||||
},
|
||||
"Ludb5F": {
|
||||
"defaultMessage": "Our platform was built to support community-driven development. From project discussion to code reviews and approach sharing, you will never feel alone in your learning.",
|
||||
"description": "Description of 'Learn together' feature in Projects marketing page"
|
||||
|
|
@ -5267,10 +5271,6 @@
|
|||
"defaultMessage": "We will review your advertising request and get back to you with the confirmation and payment in {approvalDays} business days.",
|
||||
"description": "Advertise request success message"
|
||||
},
|
||||
"MaorIw": {
|
||||
"defaultMessage": "Sign in to save progress",
|
||||
"description": "Instructions for saving platform progress"
|
||||
},
|
||||
"MdIpF6": {
|
||||
"defaultMessage": "Browse project solutions from our community.",
|
||||
"description": "Projects solutions description"
|
||||
|
|
@ -5743,6 +5743,10 @@
|
|||
"defaultMessage": "Filter by Difficulty of the original project brief",
|
||||
"description": "Tooltip for Difficulty filter for submissions list"
|
||||
},
|
||||
"P9zzt7": {
|
||||
"defaultMessage": "Don't fall behind {count} other users",
|
||||
"description": "Auth dialog testimonials subtitle"
|
||||
},
|
||||
"PAq50+": {
|
||||
"defaultMessage": "Choose up to 2 reasons why you are here so that we can improve your experience",
|
||||
"description": "Subtitle for Projects onboarding page"
|
||||
|
|
@ -6235,10 +6239,6 @@
|
|||
"defaultMessage": "Series",
|
||||
"description": "Label for series blog"
|
||||
},
|
||||
"RDQ253": {
|
||||
"defaultMessage": "Sign in to save progress",
|
||||
"description": "Message shown when user completes a question without signing in"
|
||||
},
|
||||
"RFAHTi": {
|
||||
"defaultMessage": "Choose a plan based on what you need.",
|
||||
"description": "Resume review pricing plans description"
|
||||
|
|
@ -7891,10 +7891,6 @@
|
|||
"defaultMessage": "Proven preparation plans",
|
||||
"description": "Title for proven preparation plans feature"
|
||||
},
|
||||
"YXs0ZC": {
|
||||
"defaultMessage": "Cancel",
|
||||
"description": "Cancel and close the sign in modal"
|
||||
},
|
||||
"YYJEeq": {
|
||||
"defaultMessage": "None",
|
||||
"description": "No available slots"
|
||||
|
|
@ -8019,6 +8015,10 @@
|
|||
"defaultMessage": "Written by ex-FAANG senior devs",
|
||||
"description": "Title of 'Written by ex-FAANG senior devs' sub-feature in Projects marketing page"
|
||||
},
|
||||
"ZEPn1r": {
|
||||
"defaultMessage": "or",
|
||||
"description": "Label for or"
|
||||
},
|
||||
"ZFDU0d": {
|
||||
"defaultMessage": "Woohoo!",
|
||||
"description": "Toast title for project session started"
|
||||
|
|
@ -8055,10 +8055,6 @@
|
|||
"defaultMessage": "Promotions",
|
||||
"description": "Title of Promotions page"
|
||||
},
|
||||
"ZV4dGC": {
|
||||
"defaultMessage": "Sign into your account or sign up for free to save your progress!",
|
||||
"description": "Instructions for saving platform progress"
|
||||
},
|
||||
"ZWMfa0": {
|
||||
"defaultMessage": "Pricing plans",
|
||||
"description": "Section label on Pricing section of Homepage or Pricing page"
|
||||
|
|
@ -8547,6 +8543,10 @@
|
|||
"defaultMessage": "Level",
|
||||
"description": "Blog level label"
|
||||
},
|
||||
"bOVGLU": {
|
||||
"defaultMessage": "Please sign in or create an account to continue",
|
||||
"description": "Subtitle of auth sign up dialog"
|
||||
},
|
||||
"bQ3XUx": {
|
||||
"defaultMessage": "No Tests",
|
||||
"description": "Label indicating that no test cases are available for this question"
|
||||
|
|
@ -9055,6 +9055,10 @@
|
|||
"defaultMessage": "Accounting for rotations with {bannerCount} other banners",
|
||||
"description": "Item 1 for global banner placement impressions info"
|
||||
},
|
||||
"dlrooM": {
|
||||
"defaultMessage": "Login for this sign-in has expired. Please try to sign in again.",
|
||||
"description": "Error message for expired login"
|
||||
},
|
||||
"do4njS": {
|
||||
"defaultMessage": "System Design content will be released on a rolling basis. Prices will be increased after System Design content is complete. Subscribe to lifetime today and secure the better deal!",
|
||||
"description": "Question coming soon subtitle"
|
||||
|
|
@ -10147,6 +10151,10 @@
|
|||
"defaultMessage": "No community contributions",
|
||||
"description": "Title for empty state when there are no contributions"
|
||||
},
|
||||
"iwMZfR": {
|
||||
"defaultMessage": "Sign up with Github",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"iyzDmo": {
|
||||
"defaultMessage": "Submission summary",
|
||||
"description": "Form label"
|
||||
|
|
@ -10195,6 +10203,10 @@
|
|||
"defaultMessage": "Start by simply filling in your contact information so that we know who to reach out to.",
|
||||
"description": "Subtitle for advertising inquiry"
|
||||
},
|
||||
"jCB415": {
|
||||
"defaultMessage": "An error has occurred",
|
||||
"description": "Error message title"
|
||||
},
|
||||
"jCBp3Z": {
|
||||
"defaultMessage": "Recommended prep strategy",
|
||||
"description": "Recommended interview preparation strategy"
|
||||
|
|
@ -11035,6 +11047,10 @@
|
|||
"defaultMessage": "The address is used in the agreement",
|
||||
"description": "Address section description"
|
||||
},
|
||||
"n1m6Nx": {
|
||||
"defaultMessage": "The place for front end engineers. Upskill, ace interviews, get inspired.",
|
||||
"description": "Auth card description"
|
||||
},
|
||||
"n25pZ5": {
|
||||
"defaultMessage": "Name",
|
||||
"description": "Label for name field"
|
||||
|
|
@ -12223,6 +12239,10 @@
|
|||
"defaultMessage": "You upvoted this",
|
||||
"description": "Tooltip for upvoted submission button"
|
||||
},
|
||||
"sr38Pg": {
|
||||
"defaultMessage": "Sign up with email",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"ssyz8C": {
|
||||
"defaultMessage": "Testimonials",
|
||||
"description": "Title of testimonials page"
|
||||
|
|
@ -13499,6 +13519,10 @@
|
|||
"defaultMessage": "JavaScript Coding Interview Questions",
|
||||
"description": "Social title for JavaScript coding question format page"
|
||||
},
|
||||
"z9Ymn4": {
|
||||
"defaultMessage": "Sign up with",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"z9d6Ys": {
|
||||
"defaultMessage": "Specific locations this ad will be shown",
|
||||
"description": "Label for specific locations this ad will be shown"
|
||||
|
|
|
|||
|
|
@ -83,10 +83,6 @@
|
|||
"defaultMessage": "这个网站上的材料简直就是一座金矿。在使用 GreatFrontEnd 之前,我一直在电话面试中屡屡失败。我甚至从未接近过现场面试。在学习了 GFE 上的材料后,我能够获得几次现场面试,并通过了我的第一次现场面试!在亚马逊学习 GFE 大约 2.5 个月后,我才找到了一份工作!GFE 上的材料特别容易理解,我个人被问到 GFE 的问题无数次。此外,GFE 的 Discord 频道和社区在分享他们之前的面试经验方面非常有帮助。它非常活跃,每个人都非常乐于助人!",
|
||||
"description": "User testimonial for GreatFrontEnd Interviews"
|
||||
},
|
||||
"+JhlMu": {
|
||||
"defaultMessage": "恭喜您完成了这个题目!登录您的帐户或免费注册以保存您的进度!",
|
||||
"description": "Message shown when user completes a question"
|
||||
},
|
||||
"+NbHNn": {
|
||||
"defaultMessage": "通过实现诸如节流或填充之类的实用函数来练习 JavaScript 代码面试问题。在浏览器中进行编码,并获得来自前面试官的解决方案。",
|
||||
"description": "SEO description for JavaScript coding question format page"
|
||||
|
|
@ -2691,6 +2687,10 @@
|
|||
"defaultMessage": "启动项目以访问提交和部署步骤",
|
||||
"description": "Title for project overlay on projects details page"
|
||||
},
|
||||
"Ak+Tl1": {
|
||||
"defaultMessage": "登录链接已过期",
|
||||
"description": "Error name for expired login"
|
||||
},
|
||||
"AkAu0m": {
|
||||
"defaultMessage": "高",
|
||||
"description": "High importance question"
|
||||
|
|
@ -5119,6 +5119,10 @@
|
|||
"defaultMessage": "代码已成功应用! {percentOff} 折",
|
||||
"description": "Message when promo code is successfully applied"
|
||||
},
|
||||
"Lsk0wX": {
|
||||
"defaultMessage": "一键加入 GreatFrontEnd",
|
||||
"description": "Auth card title"
|
||||
},
|
||||
"Ludb5F": {
|
||||
"defaultMessage": "我们的平台旨在支持社区驱动的开发。从项目讨论到代码审查和方法分享,您将永远不会在学习中感到孤单。",
|
||||
"description": "Description of 'Learn together' feature in Projects marketing page"
|
||||
|
|
@ -5267,10 +5271,6 @@
|
|||
"defaultMessage": "我们会审核您的广告请求,并在 {approvalDays} 个工作日内回复确认和付款。",
|
||||
"description": "Advertise request success message"
|
||||
},
|
||||
"MaorIw": {
|
||||
"defaultMessage": "登录以保存进度",
|
||||
"description": "Instructions for saving platform progress"
|
||||
},
|
||||
"MdIpF6": {
|
||||
"defaultMessage": "浏览我们社区的项目解决方案。",
|
||||
"description": "Projects solutions description"
|
||||
|
|
@ -5743,6 +5743,10 @@
|
|||
"defaultMessage": "按原始项目简报的难度筛选",
|
||||
"description": "Tooltip for Difficulty filter for submissions list"
|
||||
},
|
||||
"P9zzt7": {
|
||||
"defaultMessage": "不要落后于其他 {count} 位用户",
|
||||
"description": "Auth dialog testimonials subtitle"
|
||||
},
|
||||
"PAq50+": {
|
||||
"defaultMessage": "选择最多 2 个您来此的原因,以便我们改进您的体验",
|
||||
"description": "Subtitle for Projects onboarding page"
|
||||
|
|
@ -6235,10 +6239,6 @@
|
|||
"defaultMessage": "系列",
|
||||
"description": "Label for series blog"
|
||||
},
|
||||
"RDQ253": {
|
||||
"defaultMessage": "登录以保存您的进度",
|
||||
"description": "Message shown when user completes a question without signing in"
|
||||
},
|
||||
"RFAHTi": {
|
||||
"defaultMessage": "根据您的需要选择一个计划。",
|
||||
"description": "Resume review pricing plans description"
|
||||
|
|
@ -7891,10 +7891,6 @@
|
|||
"defaultMessage": "经过验证的准备计划",
|
||||
"description": "Title for proven preparation plans feature"
|
||||
},
|
||||
"YXs0ZC": {
|
||||
"defaultMessage": "取消",
|
||||
"description": "Cancel and close the sign in modal"
|
||||
},
|
||||
"YYJEeq": {
|
||||
"defaultMessage": "无",
|
||||
"description": "No available slots"
|
||||
|
|
@ -8019,6 +8015,10 @@
|
|||
"defaultMessage": "由前 FAANG 高级开发人员撰写",
|
||||
"description": "Title of 'Written by ex-FAANG senior devs' sub-feature in Projects marketing page"
|
||||
},
|
||||
"ZEPn1r": {
|
||||
"defaultMessage": "或",
|
||||
"description": "Label for or"
|
||||
},
|
||||
"ZFDU0d": {
|
||||
"defaultMessage": "耶!",
|
||||
"description": "Toast title for project session started"
|
||||
|
|
@ -8055,10 +8055,6 @@
|
|||
"defaultMessage": "促销",
|
||||
"description": "Title of Promotions page"
|
||||
},
|
||||
"ZV4dGC": {
|
||||
"defaultMessage": "登录您的帐户或免费注册以保存您的进度!",
|
||||
"description": "Instructions for saving platform progress"
|
||||
},
|
||||
"ZWMfa0": {
|
||||
"defaultMessage": "定价计划",
|
||||
"description": "Section label on Pricing section of Homepage or Pricing page"
|
||||
|
|
@ -8547,6 +8543,10 @@
|
|||
"defaultMessage": "级别",
|
||||
"description": "Blog level label"
|
||||
},
|
||||
"bOVGLU": {
|
||||
"defaultMessage": "请登录或创建一个帐户以继续",
|
||||
"description": "Subtitle of auth sign up dialog"
|
||||
},
|
||||
"bQ3XUx": {
|
||||
"defaultMessage": "暂无测试",
|
||||
"description": "Label indicating that no test cases are available for this question"
|
||||
|
|
@ -9055,6 +9055,10 @@
|
|||
"defaultMessage": "考虑与其他 {bannerCount} 个横幅的轮换",
|
||||
"description": "Item 1 for global banner placement impressions info"
|
||||
},
|
||||
"dlrooM": {
|
||||
"defaultMessage": "此次登录已过期。请重试。",
|
||||
"description": "Error message for expired login"
|
||||
},
|
||||
"do4njS": {
|
||||
"defaultMessage": "系统设计内容将陆续发布。系统设计内容完成后,价格将上涨。立即订阅终身会员,锁定更优惠的价格!",
|
||||
"description": "Question coming soon subtitle"
|
||||
|
|
@ -10147,6 +10151,10 @@
|
|||
"defaultMessage": "没有社区贡献",
|
||||
"description": "Title for empty state when there are no contributions"
|
||||
},
|
||||
"iwMZfR": {
|
||||
"defaultMessage": "使用 Github 注册",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"iyzDmo": {
|
||||
"defaultMessage": "提交摘要",
|
||||
"description": "Form label"
|
||||
|
|
@ -10195,6 +10203,10 @@
|
|||
"defaultMessage": "请先填写您的联系信息,以便我们联系您。",
|
||||
"description": "Subtitle for advertising inquiry"
|
||||
},
|
||||
"jCB415": {
|
||||
"defaultMessage": "发生错误",
|
||||
"description": "Error message title"
|
||||
},
|
||||
"jCBp3Z": {
|
||||
"defaultMessage": "推荐的准备策略",
|
||||
"description": "Recommended interview preparation strategy"
|
||||
|
|
@ -11035,6 +11047,10 @@
|
|||
"defaultMessage": "地址用于协议中",
|
||||
"description": "Address section description"
|
||||
},
|
||||
"n1m6Nx": {
|
||||
"defaultMessage": "前端工程师的聚集地。提升技能,通过面试,获得灵感。",
|
||||
"description": "Auth card description"
|
||||
},
|
||||
"n25pZ5": {
|
||||
"defaultMessage": "姓名",
|
||||
"description": "Label for name field"
|
||||
|
|
@ -12223,6 +12239,10 @@
|
|||
"defaultMessage": "你赞成此项",
|
||||
"description": "Tooltip for upvoted submission button"
|
||||
},
|
||||
"sr38Pg": {
|
||||
"defaultMessage": "使用邮箱注册",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"ssyz8C": {
|
||||
"defaultMessage": "用户评价",
|
||||
"description": "Title of testimonials page"
|
||||
|
|
@ -13499,6 +13519,10 @@
|
|||
"defaultMessage": "JavaScript 代码面试问题",
|
||||
"description": "Social title for JavaScript coding question format page"
|
||||
},
|
||||
"z9Ymn4": {
|
||||
"defaultMessage": "使用以下方式注册",
|
||||
"description": "Auth card button label"
|
||||
},
|
||||
"z9d6Ys": {
|
||||
"defaultMessage": "此广告将显示的特定位置",
|
||||
"description": "Label for specific locations this ad will be shown"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
type LoggingAction =
|
||||
| 'auth.login_success'
|
||||
| 'auth.login.fail'
|
||||
| 'auth.login.success'
|
||||
| 'auth.password.change'
|
||||
| 'auth.password.reset.fail'
|
||||
| 'auth.password.reset.success'
|
||||
|
|
|
|||
Loading…
Reference in New Issue