From bafcb9a8676f1acc339fab6d9390fb3040f2deeb Mon Sep 17 00:00:00 2001 From: Stavros Date: Tue, 8 Apr 2025 14:51:56 +0300 Subject: [PATCH] feat: add rate limit warning to frontend --- frontend/src/lib/i18n/locales/en-US.json | 1 + frontend/src/lib/i18n/locales/en.json | 1 + frontend/src/pages/login-page.tsx | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/i18n/locales/en-US.json b/frontend/src/lib/i18n/locales/en-US.json index 1c5ec40..8a96a7c 100644 --- a/frontend/src/lib/i18n/locales/en-US.json +++ b/frontend/src/lib/i18n/locales/en-US.json @@ -6,6 +6,7 @@ "loginSubmit": "Login", "loginFailTitle": "Failed to log in", "loginFailSubtitle": "Please check your username and password", + "loginFailRateLimit": "You failed to login too many times, please try again later", "loginSuccessTitle": "Logged in", "loginSuccessSubtitle": "Welcome back!", "loginOauthFailTitle": "Internal error", diff --git a/frontend/src/lib/i18n/locales/en.json b/frontend/src/lib/i18n/locales/en.json index 1c5ec40..8a96a7c 100644 --- a/frontend/src/lib/i18n/locales/en.json +++ b/frontend/src/lib/i18n/locales/en.json @@ -6,6 +6,7 @@ "loginSubmit": "Login", "loginFailTitle": "Failed to log in", "loginFailSubtitle": "Please check your username and password", + "loginFailRateLimit": "You failed to login too many times, please try again later", "loginSuccessTitle": "Logged in", "loginSuccessSubtitle": "Welcome back!", "loginOauthFailTitle": "Internal error", diff --git a/frontend/src/pages/login-page.tsx b/frontend/src/pages/login-page.tsx index 35f6609..eaa6d88 100644 --- a/frontend/src/pages/login-page.tsx +++ b/frontend/src/pages/login-page.tsx @@ -1,7 +1,7 @@ import { Paper, Title, Text, Divider } from "@mantine/core"; import { notifications } from "@mantine/notifications"; import { useMutation } from "@tanstack/react-query"; -import axios from "axios"; +import axios, { type AxiosError } from "axios"; import { useUserContext } from "../context/user-context"; import { Navigate } from "react-router"; import { Layout } from "../components/layouts/layout"; @@ -33,7 +33,17 @@ export const LoginPage = () => { mutationFn: (login: LoginFormValues) => { return axios.post("/api/login", login); }, - onError: () => { + onError: (data: AxiosError) => { + if (data.response) { + if (data.response.status === 429) { + notifications.show({ + title: t("loginFailTitle"), + message: t("loginFailRateLimit"), + color: "red", + }); + return; + } + } notifications.show({ title: t("loginFailTitle"), message: t("loginFailSubtitle"),