93 lines
2.8 KiB
TypeScript
93 lines
2.8 KiB
TypeScript
/*
|
|
* @Author: ZhaoYing
|
|
* @Date: 2026-02-02 16:24:54
|
|
* @Last Modified by: ZhaoYing
|
|
* @Last Modified time: 2026-02-02 16:24:54
|
|
*/
|
|
/**
|
|
* useRouteGuard Hook
|
|
*
|
|
* Provides route authentication and permission checking:
|
|
* - Validates user authentication status
|
|
* - Checks route permissions against menu structure
|
|
* - Redirects unauthorized users
|
|
* - Monitors route changes
|
|
*
|
|
* @hook
|
|
*/
|
|
|
|
import { useEffect } from 'react';
|
|
import { useNavigate, useLocation } from 'react-router-dom';
|
|
import { useMenu, type MenuItem } from '@/store/menu'
|
|
|
|
/** Check authentication status */
|
|
export const checkAuthStatus = (): boolean => {
|
|
/** In production, check localStorage or cookie for auth info */
|
|
return true; /** Temporarily return true for testing */
|
|
};
|
|
|
|
/** Recursively check if route exists in menu data */
|
|
export const checkRoutePermission = (menus: MenuItem[], currentPath: string): boolean => {
|
|
/** Home and knowledge base pages have default permission */
|
|
if (currentPath === '/' || currentPath.includes('knowledge-detail') || currentPath.includes('knowledge-base')) {
|
|
return true;
|
|
}
|
|
|
|
for (const menu of menus) {
|
|
/** Check if current menu path matches */
|
|
if (menu.path && currentPath.includes(menu.path)) {
|
|
return true;
|
|
}
|
|
/** Recursively check submenus */
|
|
if (menu.subs && menu.subs.length > 0) {
|
|
if (checkRoutePermission(menu.subs, currentPath)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Route guard hook for handling route permission checks.
|
|
*
|
|
* @param source - Menu source type ('space' or 'manage')
|
|
*/
|
|
export const useRouteGuard = (source: 'space' | 'manage') => {
|
|
const navigate = useNavigate();
|
|
const location = useLocation();
|
|
const { allMenus } = useMenu();
|
|
const menus = allMenus[source];
|
|
|
|
/** Re-execute all checks on route changes */
|
|
useEffect(() => {
|
|
/** Simulate authentication check */
|
|
const isAuthenticated = checkAuthStatus();
|
|
|
|
if (!isAuthenticated && location.pathname !== '/') {
|
|
/** Redirect unauthenticated users to home/login page */
|
|
navigate('/', { replace: true });
|
|
return;
|
|
}
|
|
|
|
/** After authentication, check route permissions */
|
|
if (isAuthenticated && location.pathname !== '/' && location.pathname !== '/not-found') {
|
|
const hasPermission = checkRoutePermission(menus, location.pathname);
|
|
if (!hasPermission) {
|
|
/** No permission, redirect to no-permission page */
|
|
// navigate('/no-permission', { replace: true });
|
|
}
|
|
}
|
|
}, [navigate, location.pathname, location.search, location.hash, menus]);
|
|
|
|
/** Return current path and permission status */
|
|
return {
|
|
currentPath: location.pathname,
|
|
search: location.search,
|
|
hash: location.hash,
|
|
isChecking: false, /** Can be extended to add loading state */
|
|
};
|
|
};
|
|
|
|
export default useRouteGuard; |