From 36ffe7e88ed28dd9a44cddddf54c7d43a78028b0 Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Fri, 27 Feb 2026 14:42:51 +0100 Subject: [PATCH] fix login --- frontend/src/components/auth/LoginCallback.tsx | 6 +++++- frontend/src/contexts/AuthContext.tsx | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/auth/LoginCallback.tsx b/frontend/src/components/auth/LoginCallback.tsx index c1173b9..0b58efa 100644 --- a/frontend/src/components/auth/LoginCallback.tsx +++ b/frontend/src/components/auth/LoginCallback.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; import { Box, CircularProgress, Typography, Alert, Button } from '@mui/material'; @@ -8,8 +8,12 @@ const LoginCallback: React.FC = () => { const [searchParams] = useSearchParams(); const { login } = useAuth(); const [error, setError] = useState(''); + const hasCalledLogin = useRef(false); useEffect(() => { + if (hasCalledLogin.current) return; + hasCalledLogin.current = true; + const handleCallback = async () => { const code = searchParams.get('code'); const errorParam = searchParams.get('error'); diff --git a/frontend/src/contexts/AuthContext.tsx b/frontend/src/contexts/AuthContext.tsx index d8cf20e..62acc61 100644 --- a/frontend/src/contexts/AuthContext.tsx +++ b/frontend/src/contexts/AuthContext.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; +import React, { createContext, useCallback, useContext, useState, useEffect, ReactNode } from 'react'; import { AuthContextType, AuthState, User } from '../types/auth.types'; import { authService } from '../services/auth'; import { getToken, setToken, removeToken, getUser, setUser, removeUser } from '../utils/storage'; @@ -61,7 +61,7 @@ export const AuthProvider: React.FC = ({ children }) => { initializeAuth(); }, []); - const login = async (code: string): Promise => { + const login = useCallback(async (code: string): Promise => { try { setState((prev) => ({ ...prev, isLoading: true })); @@ -94,9 +94,9 @@ export const AuthProvider: React.FC = ({ children }) => { notification.showError('Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut.'); throw error; } - }; + }, [notification]); - const logout = (): void => { + const logout = useCallback((): void => { // Call backend logout (fire and forget) authService.logout().catch((error) => { console.error('Backend logout failed:', error); @@ -119,9 +119,9 @@ export const AuthProvider: React.FC = ({ children }) => { setTimeout(() => { window.location.href = '/login'; }, 1000); - }; + }, [notification]); - const refreshAuth = async (): Promise => { + const refreshAuth = useCallback(async (): Promise => { try { const user = await authService.getCurrentUser(); setUser(user); @@ -130,7 +130,7 @@ export const AuthProvider: React.FC = ({ children }) => { console.error('Failed to refresh user data:', error); logout(); } - }; + }, [logout]); const value: AuthContextType = { ...state,