Files
lightrag/lightrag_webui/src/services/navigation.ts
2025-04-28 02:15:25 +08:00

86 lines
2.4 KiB
TypeScript

import { NavigateFunction } from 'react-router-dom';
import { useAuthStore, useBackendState } from '@/stores/state';
import { useGraphStore } from '@/stores/graph';
import { useSettingsStore } from '@/stores/settings';
class NavigationService {
private navigate: NavigateFunction | null = null;
setNavigate(navigate: NavigateFunction) {
this.navigate = navigate;
}
/**
* Reset all application state to ensure a clean environment.
* This function should be called when:
* 1. User logs out
* 2. Authentication token expires
* 3. Direct access to login page
*
* @param preserveHistory If true, chat history will be preserved. Default is false.
*/
resetAllApplicationState(preserveHistory = false) {
console.log('Resetting all application state...');
// Reset graph state
const graphStore = useGraphStore.getState();
const sigma = graphStore.sigmaInstance;
graphStore.reset();
graphStore.setGraphDataFetchAttempted(false);
graphStore.setLabelsFetchAttempted(false);
graphStore.setSigmaInstance(null);
graphStore.setIsFetching(false); // Reset isFetching state to prevent data loading issues
// Reset backend state
useBackendState.getState().clear();
// Reset retrieval history message only if preserveHistory is false
if (!preserveHistory) {
useSettingsStore.getState().setRetrievalHistory([]);
}
// Clear authentication state
sessionStorage.clear();
if (sigma) {
sigma.getGraph().clear();
sigma.kill();
useGraphStore.getState().setSigmaInstance(null);
}
}
/**
* Navigate to login page and reset application state
*/
navigateToLogin() {
if (!this.navigate) {
console.error('Navigation function not set');
return;
}
// Store current username before logout for comparison during next login
const currentUsername = useAuthStore.getState().username;
if (currentUsername) {
localStorage.setItem('LIGHTRAG-PREVIOUS-USER', currentUsername);
}
// Reset application state but preserve history
// History will be cleared on next login if the user changes
this.resetAllApplicationState(true);
useAuthStore.getState().logout();
this.navigate('/login');
}
navigateToHome() {
if (!this.navigate) {
console.error('Navigation function not set');
return;
}
this.navigate('/');
}
}
export const navigationService = new NavigationService();