Skip to content

Commit 6a52e45

Browse files
authored
add user guard to default admin layout (#497)
* add user guard to default admin layout * Update AnalyticsDashboardPage.tsx
1 parent b6f6796 commit 6a52e45

File tree

12 files changed

+36
-44
lines changed

12 files changed

+36
-44
lines changed

template/app/main.wasp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,6 @@ page NotFoundPage {
301301
route AdminMessagesRoute { path: "/admin/messages", to: AdminMessagesPage }
302302
page AdminMessagesPage {
303303
authRequired: true,
304-
component: import AdminMessages from "@src/messages/MessagesPage"
304+
component: import AdminMessages from "@src/admin/dashboards/messages/MessagesPage"
305305
}
306306
//#endregion

template/app/src/admin/dashboards/analytics/AnalyticsDashboardPage.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { type AuthUser } from 'wasp/auth';
22
import { getDailyStats, useQuery } from 'wasp/client/operations';
33
import { cn } from '../../../lib/utils';
44
import DefaultLayout from '../../layout/DefaultLayout';
5-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
65
import RevenueAndProfitChart from './RevenueAndProfitChart';
76
import SourcesTable from './SourcesTable';
87
import TotalPageViewsCard from './TotalPageViewsCard';
@@ -11,10 +10,23 @@ import TotalRevenueCard from './TotalRevenueCard';
1110
import TotalSignupsCard from './TotalSignupsCard';
1211

1312
const Dashboard = ({ user }: { user: AuthUser }) => {
14-
useRedirectHomeUnlessUserIsAdmin({ user });
15-
1613
const { data: stats, isLoading, error } = useQuery(getDailyStats);
1714

15+
if (error) {
16+
return (
17+
<DefaultLayout user={user}>
18+
<div className='flex h-full items-center justify-center'>
19+
<div className='rounded-lg bg-card p-8 shadow-lg'>
20+
<p className='text-2xl font-bold text-red-500'>Error</p>
21+
<p className='mt-2 text-sm text-muted-foreground'>
22+
{error.message || 'Something went wrong while fetching stats.'}
23+
</p>
24+
</div>
25+
</div>
26+
</DefaultLayout>
27+
);
28+
}
29+
1830
return (
1931
<DefaultLayout user={user}>
2032
<div className='relative'>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// TODO: Add messages page
2+
import type { AuthUser } from "wasp/auth"
3+
import DefaultLayout from "../../layout/DefaultLayout"
4+
5+
function AdminMessages({user} : {user: AuthUser}) {
6+
return (
7+
<DefaultLayout user={user}>
8+
<div>This page is under construction 🚧</div>
9+
</DefaultLayout>
10+
)
11+
}
12+
13+
export default AdminMessages

template/app/src/admin/dashboards/users/UsersDashboardPage.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@ import { type AuthUser } from 'wasp/auth';
22
import UsersTable from './UsersTable';
33
import Breadcrumb from '../../layout/Breadcrumb';
44
import DefaultLayout from '../../layout/DefaultLayout';
5-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
65

76
const Users = ({ user }: { user: AuthUser }) => {
8-
useRedirectHomeUnlessUserIsAdmin({user})
9-
107
return (
118
<DefaultLayout user={user}>
129
<Breadcrumb pageName='Users' />

template/app/src/admin/elements/calendar/CalendarPage.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { type AuthUser } from 'wasp/auth';
22
import Breadcrumb from '../../layout/Breadcrumb';
33
import DefaultLayout from '../../layout/DefaultLayout';
4-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
54

65
const Calendar = ({ user }: { user: AuthUser }) => {
7-
useRedirectHomeUnlessUserIsAdmin({ user });
8-
96
return (
107
<DefaultLayout user={user}>
118
<Breadcrumb pageName='Calendar' />

template/app/src/admin/elements/settings/SettingsPage.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ import { Label } from '../../../components/ui/label';
99
import { Textarea } from '../../../components/ui/textarea';
1010
import Breadcrumb from '../../layout/Breadcrumb';
1111
import DefaultLayout from '../../layout/DefaultLayout';
12-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
1312

1413
const SettingsPage = ({ user }: { user: AuthUser }) => {
15-
useRedirectHomeUnlessUserIsAdmin({ user });
16-
1714
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
1815
// TODO add toast provider / wrapper
1916
event.preventDefault();

template/app/src/admin/elements/ui-elements/ButtonsPage.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ import { type AuthUser } from 'wasp/auth';
33
import { Button } from '../../../components/ui/button';
44
import Breadcrumb from '../../layout/Breadcrumb';
55
import DefaultLayout from '../../layout/DefaultLayout';
6-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
76

87
const Buttons = ({ user }: { user: AuthUser }) => {
9-
useRedirectHomeUnlessUserIsAdmin({ user });
10-
118
return (
129
<DefaultLayout user={user}>
1310
<Breadcrumb pageName='Buttons' />

template/app/src/admin/layout/DefaultLayout.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { FC, ReactNode, useState } from 'react';
21
import { type AuthUser } from 'wasp/auth';
2+
import { FC, ReactNode, useState } from 'react';
3+
import { Navigate } from 'react-router-dom';
34
import Header from './Header';
45
import Sidebar from './Sidebar';
56

@@ -11,6 +12,10 @@ interface Props {
1112
const DefaultLayout: FC<Props> = ({ children, user }) => {
1213
const [sidebarOpen, setSidebarOpen] = useState(false);
1314

15+
if (!user.isAdmin) {
16+
return <Navigate to='/' replace />;
17+
}
18+
1419
return (
1520
<div className='bg-background text-foreground'>
1621
<div className='flex h-screen overflow-hidden'>

template/app/src/admin/layout/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type AuthUser } from 'wasp/auth';
22
import DarkModeSwitcher from '../../client/components/DarkModeSwitcher';
33
import { cn } from '../../lib/utils';
4-
import MessageButton from '../../messages/MessageButton';
4+
import MessageButton from '../dashboards/messages/MessageButton';
55
import { UserDropdown } from '../../user/UserDropdown';
66

77
const Header = (props: {

0 commit comments

Comments
 (0)