fix: redirect unauthorized users

This commit is contained in:
Nathan Lamy 2025-07-30 17:05:07 +02:00
parent ea585bd748
commit c7d7fd53cb
5 changed files with 55 additions and 21 deletions

View file

@ -79,6 +79,17 @@ export default function Home() {
isLoading, isLoading,
}); });
// Error handling (after all hooks)
if (error)
return (
<Error
title="Impossible de charger les colles"
message={error?.toString()}
code={500}
description="Une erreur s'est produite lors du chargement de la liste des colles."
/>
);
// TODO: FAVORITES // TODO: FAVORITES
const useToggleStar = (auth: any) => {}; const useToggleStar = (auth: any) => {};
// TODO: FILTERS // TODO: FILTERS
@ -127,17 +138,6 @@ export default function Home() {
// setTimeout(restoreScrollPosition, 500); // setTimeout(restoreScrollPosition, 500);
// }, [location]); // }, [location]);
// Error handling (after all hooks)
if (error)
return (
<Error
title="Impossible de charger les colles"
message={error?.toString()}
code={500}
description="Une erreur s'est produite lors du chargement de la liste des colles."
/>
);
return ( return (
<div className="space-y-6 pb-20 md:pb-0"> <div className="space-y-6 pb-20 md:pb-0">
{/* Week Navigation */} {/* Week Navigation */}

20
app/components/loader.tsx Normal file
View file

@ -0,0 +1,20 @@
export default function Loader() {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="flex flex-col items-center space-y-4">
<div className="flex space-x-2">
<div className="w-3 h-3 bg-primary rounded-full animate-bounce"></div>
<div
className="w-3 h-3 bg-primary rounded-full animate-bounce"
style={{ animationDelay: "0.1s" }}
></div>
<div
className="w-3 h-3 bg-primary rounded-full animate-bounce"
style={{ animationDelay: "0.2s" }}
></div>
</div>
<h2 className="text-primary text-sm">Chargement...</h2>
</div>
</div>
);
}

View file

@ -103,6 +103,8 @@ const defaultUser = {
export type User = typeof defaultUser; export type User = typeof defaultUser;
export const AUTH_ERROR = "Unauthorized access"
export const useUser = () => { export const useUser = () => {
const { data, ...props } = useQuery({ const { data, ...props } = useQuery({
queryKey: ["user"], queryKey: ["user"],

View file

@ -37,7 +37,7 @@ import AttachmentItem from "~/components/details/attachment";
// import { ScrollToTopOnMount } from "~/components/noscroll"; // import { ScrollToTopOnMount } from "~/components/noscroll";
import Error from "~/components/error"; import Error from "~/components/error";
import { Badge } from "~/components/ui/badge"; import { Badge } from "~/components/ui/badge";
import { useColle, useUser } from "~/lib/api"; import { AUTH_ERROR, useColle, useUser } from "~/lib/api";
import { toast } from "sonner"; import { toast } from "sonner";
import { formatDate, formatGrade, formatTime, goBack } from "~/lib/utils"; import { formatDate, formatGrade, formatTime, goBack } from "~/lib/utils";
@ -60,10 +60,14 @@ export default function ColleDetailPage() {
const [isReloading, setIsReloading] = useState(false); const [isReloading, setIsReloading] = useState(false);
// TODO: Handle user loading state if (isUserLoading) {
return <ColleDetailsSkeleton />
}
if (userError?.message === AUTH_ERROR) {
return <Navigate to="/login" replace />;
}
if (userError) { if (userError) {
console.error(userError); return <Error message={userError.message} />;
return <Navigate to="/login" />;
} }
// TODO: Favorite toggle function // TODO: Favorite toggle function
@ -84,7 +88,6 @@ export default function ColleDetailPage() {
description="Une erreur s'est produite lors du chargement de la colle." description="Une erreur s'est produite lors du chargement de la colle."
/> />
); );
if (isLoading || !colle) return <ColleDetailsSkeleton />; if (isLoading || !colle) return <ColleDetailsSkeleton />;
const handleToggleFavorite = () => {}; const handleToggleFavorite = () => {};

View file

@ -1,21 +1,30 @@
import { Navigate } from "react-router";
import Error from "~/components/error";
import HomePage from "~/components/home"; import HomePage from "~/components/home";
import Loader from "~/components/loader";
import UserDropdown from "~/components/user-dropdown"; import UserDropdown from "~/components/user-dropdown";
import { MainLayout } from "~/layout"; import { MainLayout } from "~/layout";
import { useUser } from "~/lib/api"; import { AUTH_ERROR, useUser } from "~/lib/api";
import { forceReload } from "~/lib/utils"; import { forceReload } from "~/lib/utils";
export default function Home() { export default function Home() {
const { user, isLoading, error } = useUser(); const { user, isLoading, error } = useUser();
if (error) {
console.error(error); if (isLoading) {
// TODO: handle error (redirect to login or show error message) return <Loader />;
} }
if (error?.message === AUTH_ERROR) {
return <Navigate to="/login" replace />;
}
if (error) {
return <Error message={error.message} />;
}
return ( return (
<MainLayout page={<HomePage />}> <MainLayout page={<HomePage />}>
<h1 className="text-2xl font-bold" onClick={forceReload}> <h1 className="text-2xl font-bold" onClick={forceReload}>
Khollis&eacute; - {user.className} Khollis&eacute; - {user.className}
</h1> </h1>
{/* TODO: isLoading to display skeleton */}
<UserDropdown user={user} /> <UserDropdown user={user} />
</MainLayout> </MainLayout>
); );