Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
270 changes: 270 additions & 0 deletions src/layouts/AdminLayout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
import React, { useState } from 'react'

import { Outlet } from 'react-router-dom'

import { SidebarNav } from '@/shared/composites/SidebarNav'

import { Topbar } from '@/shared/composites/Topbar'

import { AvatarMenu } from '@/shared/composites/AvatarMenu/AvatarMenu'

import { ToastProvider } from '@/shared/integrations/Toast'

import {
CheckIcon,
ExclamationTriangleIcon,
PresentationChartLineIcon,
QueueListIcon,
UsersIcon,
} from '@heroicons/react/24/outline'

const AdminLayout = () => {
const [collapsed, setCollapsed] = useState(false)
const [activeItem, setActiveItem] = useState('Queue')

return (
// <div
// className="
// min-h-screen
// bg-bg-primary
// text-text-primary
// "
// >
// <ToastProvider />

// {/* Sidebar */}
// <aside
// className={`fixed top-0 left-0 z-30 h-screen transition-all duration-300 ${collapsed ? 'w-18' : 'w-64'
// } `}
// >
// <SidebarNav
// collapsed={collapsed}
// onToggle={() => {
// setCollapsed(!collapsed)
// }}
// items={[
// {
// label: 'Queue',

// icon: <QueueListIcon className="size-4" />,

// badge: 3,

// badgeVariant: 'danger',

// isActive: activeItem === 'Queue',

// onClick: () => {
// setActiveItem('Queue')

// console.log('Queue clicked')
// },
// },

// {
// label: 'Resolved',

// icon: <CheckIcon className="size-4" />,

// badge: 12,

// badgeVariant: 'info',

// isActive: activeItem === 'Resolved',

// onClick: () => {
// setActiveItem('Resolved')

// console.log('Resolved clicked')
// },
// },

// {
// label: 'Escalated',

// icon: <ExclamationTriangleIcon className="size-4" />,

// badge: 1,

// badgeVariant: 'danger',

// isActive: activeItem === 'Escalated',

// onClick: () => {
// setActiveItem('Escalated')

// console.log('Escalated clicked')
// },
// },

// {
// label: 'Users',

// icon: <UsersIcon className="size-4" />,

// isActive: activeItem === 'Users',

// onClick: () => {
// setActiveItem('Users')

// console.log('Users clicked')
// },
// },

// {
// label: 'Analytics',

// icon: <PresentationChartLineIcon className="size-4" />,

// isActive: activeItem === 'Analytics',

// onClick: () => {
// setActiveItem('Analytics')

// console.log('Analytics clicked')
// },
// },
// ]}
// />
// </aside>
// <main
// className={`flex min-h-screen items-center justify-center transition-all duration-300 ${collapsed ? 'w-[72px]' : 'w-64'
// } `}
// >
// </main>
// <div
// className={`
// transition-all
// duration-300
// ${collapsed
// ? 'ml-[72px]'
// : 'ml-64'
// }
// `}
// >

// <main className="p-6">
// <Outlet />
// </main>
// </div>
// </div>
<div className="bg-bg-primary text-text-primary min-h-screen">
<ToastProvider />

<aside
className={`fixed top-0 left-0 z-30 h-screen transition-all duration-300 ${
collapsed ? 'w-[72px]' : 'w-64'
} `}
>
<SidebarNav
collapsed={collapsed}
onToggle={() => {
setCollapsed(!collapsed)
}}
items={[
{
label: 'Queue',

icon: <QueueListIcon className="size-4" />,

badge: 3,

badgeVariant: 'danger',

isActive: activeItem === 'Queue',

onClick: () => {
setActiveItem('Queue')

console.log('Queue clicked')
},
},

{
label: 'Resolved',

icon: <CheckIcon className="size-4" />,

badge: 12,

badgeVariant: 'info',

isActive: activeItem === 'Resolved',

onClick: () => {
setActiveItem('Resolved')

console.log('Resolved clicked')
},
},

{
label: 'Escalated',

icon: <ExclamationTriangleIcon className="size-4" />,

badge: 1,

badgeVariant: 'danger',

isActive: activeItem === 'Escalated',

onClick: () => {
setActiveItem('Escalated')

console.log('Escalated clicked')
},
},

{
label: 'Users',

icon: <UsersIcon className="size-4" />,

isActive: activeItem === 'Users',

onClick: () => {
setActiveItem('Users')

console.log('Users clicked')
},
},

{
label: 'Analytics',

icon: <PresentationChartLineIcon className="size-4" />,

isActive: activeItem === 'Analytics',

onClick: () => {
setActiveItem('Analytics')

console.log('Analytics clicked')
},
},
]}
/>
</aside>

<div className={`transition-all duration-300 ${collapsed ? 'ml-[72px]' : 'ml-64'} `}>
<Topbar
title="Moderation Queue"
actionsSlot={<AvatarMenu name="Admin Mod" />}
searchSlot={
<input
className="w-full bg-transparent text-sm outline-none"
placeholder="Search reports..."
/>
}
/>

<main className="p-6">
<Outlet />
</main>
</div>
</div>
)
}

export default AdminLayout
28 changes: 8 additions & 20 deletions src/layouts/MainLayout/BaseLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,17 @@
import AvatarMenu from '@/shared/composites/AvatarMenu/AvatarMenu'
import { ToastProvider } from '@/shared/integrations/Toast'
import { Tooltip } from '@/shared/primitives/Tooltip'
// import ThemeToggleSwitch from '@/ThemeToggleSwitch'
import React, { Suspense } from 'react'

import { Outlet } from 'react-router-dom'

import { ToastProvider } from '@/shared/integrations/Toast'

const BaseLayout: React.FC = () => {
return (
<div className="bg-bg-primary flex min-h-screen flex-col">
{/* Main Content */}
<div className="bg-bg-primary text-text-primary min-h-screen">
<ToastProvider />
<main className="">
<div className="text-text-primary">
<Suspense fallback={null}>
<Outlet />
<div className="absolute top-4 right-10 flex gap-2">
<Tooltip
children={<AvatarMenu name="Admin Mod" />}
content="Settings"
position="left"
/>
</div>
</Suspense>
</div>
</main>

<Suspense fallback={null}>
<Outlet />
</Suspense>
</div>
)
}
Expand Down
21 changes: 6 additions & 15 deletions src/routes/MainRouters.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import OAuthCallback from '@views/Auth/OAuthCallBack'
import BaseLayout from '@layouts/MainLayout/BaseLayout'
import NotFound from '@views/NotFound/NotFound'
// import OAuthCallback from '@views/Auth/OAuthCallBack'
// import BaseLayout from '@layouts/MainLayout/BaseLayout'
// import NotFound from '@views/NotFound/NotFound'
// import HomePage from "@/views/Home/Home";
// import InscriptionDetails from "@/views/InscriptionDetailPage.tsx/InscriptionDetails";
// import Upload from "@/views/Upload/Upload";
Expand All @@ -12,24 +12,15 @@ import NotFound from '@views/NotFound/NotFound'
// import Setting from "@views/Setting/Setting";
// import { Navigate } from 'react-router-dom'
import LoginPage from '@/views/LoginPage'
import AdminLayout from '@/layouts/AdminLayout'

const MainRoutes = {
export const MainRoutes = {
path: '/',
element: <BaseLayout />,
element: <AdminLayout />,
children: [
{
index: true,
element: <LoginPage />,
},
{
path: 'oauth/callback',
element: <OAuthCallback />,
},
{
path: '*',
element: <NotFound />,
},
],
}

export default MainRoutes
2 changes: 1 addition & 1 deletion src/routes/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createBrowserRouter } from 'react-router-dom'
import MainRoutes from './MainRouters'
import { MainRoutes } from './MainRouters'

const router = createBrowserRouter([MainRoutes])

Expand Down
2 changes: 1 addition & 1 deletion src/shared/composites/SidebarNav/SidebarNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export function SidebarNav({
})}
>
{/* Header */}
<div className="border-border-secondary flex items-center justify-between border-b px-4 py-4">
<div className="border-border-secondary flex h-16 items-center justify-between border-b px-4 py-4">
{!collapsed && (
<div className="flex flex-col">
<h2 className="text-text-primary text-lg font-semibold">ModerationOS</h2>
Expand Down
Loading
Loading