Skip to content

Commit 7715ffc

Browse files
feature fix [home]: now redirects based on profile role (manager), toasts added for status updates
1 parent 33befc0 commit 7715ffc

6 files changed

Lines changed: 121 additions & 63 deletions

File tree

client/package-lock.json

Lines changed: 21 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
"jwt-decode": "^4.0.0",
3030
"lucide-react": "^0.516.0",
3131
"next": "^15.5.9",
32+
"next-themes": "^0.4.6",
3233
"react": "19.1.0",
3334
"react-dom": "19.1.0",
35+
"sonner": "^2.0.7",
3436
"tailwind-merge": "^3.3.1",
3537
"tailwindcss-animate": "^1.0.7"
3638
},
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import {
2+
CircleCheck,
3+
Info,
4+
LoaderCircle,
5+
OctagonX,
6+
TriangleAlert,
7+
} from "lucide-react";
8+
import { useTheme } from "next-themes";
9+
import { Toaster as Sonner } from "sonner";
10+
11+
type ToasterProps = React.ComponentProps<typeof Sonner>;
12+
13+
const Toaster = ({ ...props }: ToasterProps) => {
14+
const { theme = "system" } = useTheme();
15+
16+
return (
17+
<Sonner
18+
theme={theme as ToasterProps["theme"]}
19+
className="toaster group"
20+
icons={{
21+
success: <CircleCheck className="h-4 w-4" />,
22+
info: <Info className="h-4 w-4" />,
23+
warning: <TriangleAlert className="h-4 w-4" />,
24+
error: <OctagonX className="h-4 w-4" />,
25+
loading: <LoaderCircle className="h-4 w-4 animate-spin" />,
26+
}}
27+
toastOptions={{
28+
classNames: {
29+
toast:
30+
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
31+
description: "group-[.toast]:text-muted-foreground",
32+
actionButton:
33+
"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
34+
cancelButton:
35+
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
36+
},
37+
}}
38+
{...props}
39+
/>
40+
);
41+
};
42+
43+
export { Toaster };

client/src/pages/_app.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
44
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
55
import type { AppProps } from "next/app";
66

7+
import { Toaster } from "@/components/ui/sonner";
78
import { AuthProvider } from "@/context/AuthContext";
89

910
const queryClient = new QueryClient();
@@ -14,6 +15,7 @@ export default function App({ Component, pageProps }: AppProps) {
1415
<QueryClientProvider client={queryClient}>
1516
<ReactQueryDevtools initialIsOpen={false} />
1617
<Component {...pageProps} />
18+
<Toaster position="top-center" />
1719
</QueryClientProvider>
1820
</AuthProvider>
1921
);

client/src/pages/home.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,37 @@
11
import { useRouter } from "next/router";
2+
import { toast } from "sonner";
23

34
import { Button } from "@/components/ui/button";
45
import EventCard from "@/components/ui/event-card";
6+
import { useAuth } from "@/context/AuthContext";
57
import { useEvents } from "@/hooks/events";
68
import { useMe } from "@/hooks/me";
7-
import { clearTokens } from "@/lib/auth";
89

910
import SearchDock from "../components/ui/search-dock";
1011
import DockLayout from "./layouts/docklayout";
1112

1213
export default function Home() {
13-
const { data: events, isLoading } = useEvents();
14-
const { data: me } = useMe();
14+
const { data: events, isLoading: eventsLoading } = useEvents();
15+
const { logout } = useAuth();
1516
const router = useRouter();
17+
const { data: me, isLoading: meLoading } = useMe();
1618

17-
const logout = () => {
18-
clearTokens();
19+
if (me?.profile.role === "manager") {
20+
router.replace("/manager/dashboard");
21+
return null;
22+
}
23+
24+
if (meLoading) {
25+
return (
26+
<div className="flex min-h-screen items-center justify-center">
27+
Loading…
28+
</div>
29+
);
30+
}
31+
32+
const handleLogout = () => {
33+
logout();
34+
toast("Logged out successfully");
1935
router.push("/login");
2036
};
2137

@@ -28,10 +44,10 @@ export default function Home() {
2844
<p>
2945
Hello {me.first_name} ({me.username} {me.profile.role})
3046
</p>
31-
<Button onClick={logout}>Logout</Button>
47+
<Button onClick={handleLogout}>Logout</Button>
3248
</div>
3349
)}
34-
{!isLoading &&
50+
{!eventsLoading &&
3551
events?.map((event) => (
3652
<EventCard key={event.id} event={event}></EventCard>
3753
))}

0 commit comments

Comments
 (0)