This commit is contained in:
2025-10-03 15:43:22 +05:00
commit 531e2d2e7e
54 changed files with 2943 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
import { Navigate } from "react-router";
import { useMe } from "../hooks/useAuth";
interface ProtectedRouteProps {
children: React.ReactNode;
}
/**
* Компонент для защиты роутов - перенаправляет неавторизованных пользователей на страницу логина
*/
function ProtectedRoute({ children }: ProtectedRouteProps) {
const { data: user, isLoading } = useMe();
// Показываем загрузку пока проверяем авторизацию
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-xl">Проверка авторизации...</div>
</div>
);
}
// Если пользователь не авторизован - перенаправляем на логин
if (!user) {
return <Navigate to="/login" replace />;
}
// Если авторизован - показываем защищённый контент
return <>{children}</>;
}
export default ProtectedRoute;
+34
View File
@@ -0,0 +1,34 @@
import { Navigate } from "react-router";
import { useMe } from "../hooks/useAuth";
interface PublicRouteProps {
children: React.ReactNode;
}
/**
* Компонент для публичных роутов (логин/регистрация)
* Если пользователь уже авторизован - перенаправляет на главную
*/
function PublicRoute({ children }: PublicRouteProps) {
const { data: user, isLoading } = useMe();
// Показываем загрузку пока проверяем авторизацию
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-xl">Загрузка...</div>
</div>
);
}
// Если пользователь уже авторизован - перенаправляем на главную
if (user) {
return <Navigate to="/" replace />;
}
// Если не авторизован - показываем публичный контент (логин/регистрация)
return <>{children}</>;
}
export default PublicRoute;