Frontend added layout for each page

pull/3/head
TZGyn 2 years ago
parent ff86710d92
commit b88ad4e207
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -1,5 +1,4 @@
import { ModeToggle } from '@/components/mode-toggle' import { ModeToggle } from '@/components/mode-toggle'
import { ThemeProvider } from '@/components/theme-provider'
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -29,11 +28,12 @@ import {
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu' } from '@/components/ui/dropdown-menu'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Toaster } from '@/components/ui/toaster' import { Toaster } from '@/components/ui/toaster'
import { useToast } from '@/components/ui/use-toast' import { useToast } from '@/components/ui/use-toast'
import { Copy, Loader2, MoreHorizontal, Settings } from 'lucide-react' import { Copy, Loader2, MoreHorizontal, Settings, User } from 'lucide-react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
@ -71,28 +71,22 @@ export default function App() {
}, []) }, [])
return ( return (
<ThemeProvider <>
defaultTheme='dark'
storageKey='vite-ui-theme'>
<Navbar getShorteners={getShorteners} />
<div className='flex justify-center px-2 pt-8'> <div className='flex justify-center px-2 pt-8'>
<div className='w-full max-w-6xl'> <div className='w-full max-w-6xl'>
<ShortenerTable <ShortenerTable
shorteners={shorteners} shorteners={shorteners}
isLoading={isLoading} isLoading={isLoading}
getShorteners={getShorteners}
/> />
</div> </div>
</div> </div>
<Toaster /> <Toaster />
</ThemeProvider> </>
) )
} }
export const Navbar = ({ export const Navbar = () => {
getShorteners,
}: {
getShorteners?: () => Promise<void>
}) => {
const navigate = useNavigate() const navigate = useNavigate()
return ( return (
<div className='flex justify-center border-b border-b-border px-2'> <div className='flex justify-center border-b border-b-border px-2'>
@ -103,10 +97,13 @@ export const Navbar = ({
Shortener Shortener
</div> </div>
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
{getShorteners && (
<CreateShortener getShorteners={getShorteners} />
)}
<ModeToggle /> <ModeToggle />
<Avatar>
<AvatarImage src='://github.com/shadcn.png' />
<AvatarFallback>
<User />
</AvatarFallback>
</Avatar>
</div> </div>
</div> </div>
</div> </div>
@ -188,9 +185,11 @@ const CreateShortener = ({
const ShortenerTable = ({ const ShortenerTable = ({
shorteners, shorteners,
isLoading, isLoading,
getShorteners,
}: { }: {
shorteners: Shortener[] shorteners: Shortener[]
isLoading: boolean isLoading: boolean
getShorteners: () => Promise<void>
}) => { }) => {
const { toast } = useToast() const { toast } = useToast()
const copyLinkToClipboard = async (code: string) => { const copyLinkToClipboard = async (code: string) => {
@ -204,9 +203,14 @@ const ShortenerTable = ({
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle className='flex gap-2'> <CardTitle className='flex items-center justify-between gap-2'>
<div>Shorteners</div> <div className='flex gap-4'>
{isLoading && <Loader2 className='animate-spin'></Loader2>} <div>Shorteners</div>
{isLoading && (
<Loader2 className='animate-spin'></Loader2>
)}
</div>
<CreateShortener getShorteners={getShorteners} />
</CardTitle> </CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>

@ -4,12 +4,15 @@ import App from './App.tsx'
import './index.css' import './index.css'
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom' import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import Dashboard from './pages/dashboard.tsx' import Dashboard from './pages/dashboard.tsx'
import { Layout } from './pages/Layout.tsx'
ReactDOM.createRoot(document.getElementById('root')!).render( ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode> <React.StrictMode>
<BrowserRouter> <BrowserRouter>
<Routes> <Routes>
<Route path='/'> <Route
path='/'
element={<Layout />}>
<Route <Route
index index
element={<App />}></Route> element={<App />}></Route>

@ -0,0 +1,14 @@
import { ThemeProvider } from '@/components/theme-provider'
import { Navbar } from '@/App.tsx'
import { Outlet } from 'react-router-dom'
export function Layout() {
return (
<ThemeProvider
defaultTheme='dark'
storageKey='vite-ui-theme'>
<Navbar />
<Outlet />
</ThemeProvider>
)
}

@ -1,10 +1,7 @@
import { Navbar } from '@/App'
import { ThemeProvider } from '@/components/theme-provider'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { import {
Table, Table,
TableBody, TableBody,
TableCaption,
TableCell, TableCell,
TableHead, TableHead,
TableHeader, TableHeader,
@ -131,10 +128,7 @@ export default function Dashboard() {
} }
return ( return (
<ThemeProvider <>
defaultTheme='dark'
storageKey='vite-ui-theme'>
<Navbar />
<div className='flex justify-center px-2 pt-8'> <div className='flex justify-center px-2 pt-8'>
<div className='max-w-6xl flex-1 space-y-4'> <div className='max-w-6xl flex-1 space-y-4'>
<div className='flex flex-wrap items-center gap-4 text-lg font-bold'> <div className='flex flex-wrap items-center gap-4 text-lg font-bold'>
@ -241,7 +235,7 @@ export default function Dashboard() {
</div> </div>
</div> </div>
<Toaster /> <Toaster />
</ThemeProvider> </>
) )
} }

Loading…
Cancel
Save