diff --git a/frontend/src/contexts/AuthContext.tsx b/frontend/src/contexts/AuthContext.tsx index 2907283..dfdd5c8 100644 --- a/frontend/src/contexts/AuthContext.tsx +++ b/frontend/src/contexts/AuthContext.tsx @@ -1,5 +1,6 @@ import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; import { authAPI } from '../services/api'; +import { useToast } from './ToastContext'; import type { User, LoginRequest, RegisterRequest } from '../types'; interface AuthContextType { @@ -19,6 +20,7 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => const [user, setUser] = useState(null); const [token, setToken] = useState(localStorage.getItem('token')); const [presenceWs, setPresenceWs] = useState(null); + const { addToast } = useToast(); useEffect(() => { if (token && window.location.pathname !== '/login' && window.location.pathname !== '/register') { @@ -29,6 +31,23 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => } }, [token]); + // Listen for session expired events + useEffect(() => { + const handleSessionExpired = () => { + addToast('Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.', 'warning', 5000); + setToken(null); + setUser(null); + closePresenceConnection(); + // Redirect to login after a short delay to show the toast + setTimeout(() => { + window.location.href = '/login'; + }, 1000); + }; + + window.addEventListener('sessionExpired', handleSessionExpired); + return () => window.removeEventListener('sessionExpired', handleSessionExpired); + }, [addToast]); + const loadUser = async () => { try { const userData = await authAPI.getCurrentUser(); @@ -48,8 +67,12 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => localStorage.removeItem('token'); setToken(null); setUser(null); - // Close presence WebSocket if open closePresenceConnection(); + // Show toast and redirect to login + addToast('Sitzung konnte nicht wiederhergestellt werden. Bitte melden Sie sich erneut an.', 'error', 5000); + setTimeout(() => { + window.location.href = '/login'; + }, 1000); } }; diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts index 3f7d951..163b3f3 100644 --- a/frontend/src/services/api.ts +++ b/frontend/src/services/api.ts @@ -33,8 +33,8 @@ api.interceptors.response.use( localStorage.removeItem('token'); localStorage.removeItem('lastVisitedPath'); sessionStorage.removeItem('routeRestored'); - // Don't redirect, just clear auth state - // The app will handle the redirect appropriately + // Dispatch event to notify AuthContext + window.dispatchEvent(new CustomEvent('sessionExpired')); } return Promise.reject(error); }