diff --git a/client/src/Pages/Auth/Login/Login.jsx b/client/src/Pages/Auth/Login/Login.jsx index 9db56ae49..52663a479 100644 --- a/client/src/Pages/Auth/Login/Login.jsx +++ b/client/src/Pages/Auth/Login/Login.jsx @@ -1,6 +1,6 @@ import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import { Box, Stack, Typography } from "@mui/material"; +import { Box, Stack, Typography, Alert, Button } from "@mui/material"; import { useTheme } from "@emotion/react"; import { credentials } from "../../../Validation/validation"; import { login } from "../../../Features/Auth/authSlice"; @@ -16,6 +16,7 @@ import PasswordStep from "./Components/PasswordStep"; import ThemeSwitch from "../../../Components/ThemeSwitch"; import ForgotPasswordLabel from "./Components/ForgotPasswordLabel"; import LanguageSelector from "../../../Components/LanguageSelector"; +import { useTranslation } from "react-i18next"; const DEMO = import.meta.env.VITE_APP_DEMO; @@ -27,6 +28,7 @@ const Login = () => { const dispatch = useDispatch(); const navigate = useNavigate(); const theme = useTheme(); + const { t } = useTranslation(); const authState = useSelector((state) => state.auth); const { authToken } = authState; @@ -42,22 +44,81 @@ const Login = () => { }); const [errors, setErrors] = useState({}); const [step, setStep] = useState(0); + const [backendReachable, setBackendReachable] = useState(true); + const [isCheckingConnection, setIsCheckingConnection] = useState(false); useEffect(() => { if (authToken) { navigate("/uptime"); return; } - networkService - .doesSuperAdminExist() - .then((response) => { - if (response.data.data === false) { - navigate("/register"); + + // Check backend connectivity first + const handleRetry = async () => { + setIsCheckingConnection(true); + try { + const isReachable = await networkService.checkBackendReachability(); + setBackendReachable(isReachable); + + // If backend is now reachable, proceed with admin check + if (isReachable) { + networkService + .doesSuperAdminExist() + .then((response) => { + if (response.data.data === false) { + navigate("/register"); + } + }) + .catch((error) => { + logger.error(error); + }); + createToast({ + body: t("backendReconnected"), + }); + } else { + createToast({ + body: t("backendStillUnreachable"), + }); } - }) - .catch((error) => { - logger.error(error); - }); + } catch (error) { + logger.error("Error checking backend connectivity:", error); + setBackendReachable(false); + createToast({ + body: t("backendConnectionError"), + }); + } finally { + setIsCheckingConnection(false); + } + }; + + const checkConnectivity = async () => { + setIsCheckingConnection(true); + try { + const isReachable = await networkService.checkBackendReachability(); + setBackendReachable(isReachable); + + // Only proceed with admin check if backend is reachable + if (isReachable) { + networkService + .doesSuperAdminExist() + .then((response) => { + if (response.data.data === false) { + navigate("/register"); + } + }) + .catch((error) => { + logger.error(error); + }); + } + } catch (error) { + logger.error("Error checking backend connectivity:", error); + setBackendReachable(false); + } finally { + setIsCheckingConnection(false); + } + }; + + checkConnectivity(); }, [authToken, navigate]); const handleChange = (event) => { @@ -82,6 +143,14 @@ const Login = () => { const handleSubmit = async (event) => { event.preventDefault(); + // Check backend connectivity before proceeding + if (!backendReachable) { + createToast({ + body: t("backendUnreachableError"), + }); + return; + } + if (step === 0) { const { error } = credentials.validate( { email: form.email }, @@ -208,7 +277,24 @@ const Login = () => { }, }} > - {step === 0 ? ( + {!backendReachable ? ( + + + {t("backendUnreachable")} + + + {t("backendUnreachableMessage")} + + + + ) : step === 0 ? ( { /> ) )} - + {backendReachable && ( + + )} ); diff --git a/client/src/locales/gb.json b/client/src/locales/gb.json index 343386bec..3bfb07fcf 100644 --- a/client/src/locales/gb.json +++ b/client/src/locales/gb.json @@ -99,6 +99,14 @@ "settingsFailedToAddDemoMonitors": "Failed to add demo monitors", "settingsMonitorsDeleted": "Successfully deleted all monitors", "settingsFailedToDeleteMonitors": "Failed to delete all monitors", + "backendUnreachable": "Server Connection Error", + "backendUnreachableMessage": "We're unable to connect to the server. Please check your internet connection or contact your administrator if the problem persists.", + "backendUnreachableError": "Cannot connect to the server. Please try again later.", + "retryConnection": "Retry Connection", + "retryingConnection": "Connecting...", + "backendReconnected": "Successfully reconnected to the server.", + "backendStillUnreachable": "Server is still unreachable. Please try again later.", + "backendConnectionError": "Error connecting to the server. Please check your network connection.", "starPromptTitle": "Star Checkmate", "starPromptDescription": "See the latest releases and help grow the community on GitHub", "https": "HTTPS", diff --git a/client/src/locales/ru.json b/client/src/locales/ru.json index 5d0f649de..4845830ef 100644 --- a/client/src/locales/ru.json +++ b/client/src/locales/ru.json @@ -99,6 +99,14 @@ "settingsFailedToAddDemoMonitors": "Не удалось добавить демонстрационные мониторы", "settingsMonitorsDeleted": "Успешно удалены все мониторы", "settingsFailedToDeleteMonitors": "Не удалось удалить все мониторы", + "backendUnreachable": "Ошибка подключения к серверу", + "backendUnreachableMessage": "Мы не можем подключиться к серверу. Пожалуйста, проверьте ваше интернет-соединение или обратитесь к администратору, если проблема не устраняется.", + "backendUnreachableError": "Невозможно подключиться к серверу. Пожалуйста, повторите попытку позже.", + "retryConnection": "Повторить подключение", + "retryingConnection": "Подключение...", + "backendReconnected": "Успешно восстановлено подключение к серверу.", + "backendStillUnreachable": "Сервер по-прежнему недоступен. Пожалуйста, повторите попытку позже.", + "backendConnectionError": "Ошибка подключения к серверу. Пожалуйста, проверьте ваше сетевое подключение.", "starPromptTitle": "Star Checkmate", "starPromptDescription": "Ознакомьтесь с последними релизами и помогите развить сообщество на GitHub", "https": "HTTPS", diff --git a/client/src/locales/tr.json b/client/src/locales/tr.json index 1b759a29d..11d79fabc 100644 --- a/client/src/locales/tr.json +++ b/client/src/locales/tr.json @@ -99,6 +99,14 @@ "settingsFailedToAddDemoMonitors": "Demo monitörler eklenemedi", "settingsMonitorsDeleted": "Tüm monitörler başarıyla silindi", "settingsFailedToDeleteMonitors": "Monitörler silinemedi", + "backendUnreachable": "Sunucu Bağlantı Hatası", + "backendUnreachableMessage": "Sunucuya bağlanamıyoruz. Lütfen internet bağlantınızı kontrol edin veya sorun devam ederse yöneticinize başvurun.", + "backendUnreachableError": "Sunucuya bağlanılamıyor. Lütfen daha sonra tekrar deneyin.", + "retryConnection": "Bağlantıyı Yeniden Dene", + "retryingConnection": "Bağlanıyor...", + "backendReconnected": "Sunucuya başarıyla yeniden bağlandı.", + "backendStillUnreachable": "Sunucu hala erişilemez durumda. Lütfen daha sonra tekrar deneyin.", + "backendConnectionError": "Sunucuya bağlanırken hata oluştu. Lütfen ağ bağlantınızı kontrol edin.", "starPromptTitle": "Checkmate yıldızla değerlendirin", "starPromptDescription": "En son sürümleri görün ve GitHub'daki topluluğun büyümesine yardımcı olun", "https": "HTTPS",