header and footer
This commit is contained in:
13
src/AppTheme.tsx
Normal file
13
src/AppTheme.tsx
Normal file
@@ -0,0 +1,13 @@
|
||||
import * as React from "react";
|
||||
import { ThemeProvider, createTheme } from "@mui/material/styles";
|
||||
|
||||
const theme = createTheme({
|
||||
palette: {
|
||||
// mode: "light", // or "dark"
|
||||
mode: "dark", // or "dark"
|
||||
},
|
||||
});
|
||||
|
||||
export default function AppTheme({ children }: { children: React.ReactNode }) {
|
||||
return <ThemeProvider theme={theme}>{children}</ThemeProvider>;
|
||||
}
|
||||
@@ -2,6 +2,9 @@ import * as React from 'react';
|
||||
import Container from '@mui/material/Container';
|
||||
import Link from '@mui/material/Link';
|
||||
import Typography from '@mui/material/Typography';
|
||||
import {AppBar, Box, Button, IconButton, Toolbar, Tooltip} from "@mui/material";
|
||||
import MenuIcon from "@mui/icons-material/Menu";
|
||||
import LogoutIcon from "@mui/icons-material/Logout";
|
||||
|
||||
function Copyright() {
|
||||
return (
|
||||
@@ -17,19 +20,34 @@ function Copyright() {
|
||||
|
||||
export default function Footer() {
|
||||
return (
|
||||
<React.Fragment>
|
||||
<Container
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
gap: { xs: 2, sm: 4 },
|
||||
py: { xs: 2, sm: 4 },
|
||||
textAlign: { sm: 'center', md: 'left' },
|
||||
}}
|
||||
>
|
||||
<Copyright />
|
||||
</Container>
|
||||
</React.Fragment>
|
||||
<AppBar
|
||||
position="fixed"
|
||||
color="default"
|
||||
sx={{
|
||||
top: 'auto',
|
||||
bottom: 0,
|
||||
backdropFilter: 'blur(8px)',
|
||||
boxShadow: 'none',
|
||||
borderTop: '1px solid',
|
||||
borderColor: 'divider',
|
||||
}}
|
||||
>
|
||||
<Toolbar>
|
||||
<React.Fragment>
|
||||
<Container
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
gap: { xs: 2, sm: 4 },
|
||||
py: { xs: 2, sm: 4 },
|
||||
textAlign: { sm: 'center', md: 'left' },
|
||||
}}
|
||||
>
|
||||
<Copyright />
|
||||
</Container>
|
||||
</React.Fragment>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
);
|
||||
}
|
||||
|
||||
82
src/Header.tsx
Normal file
82
src/Header.tsx
Normal file
@@ -0,0 +1,82 @@
|
||||
import * as React from "react";
|
||||
import {
|
||||
AppBar,
|
||||
Toolbar,
|
||||
Typography,
|
||||
IconButton,
|
||||
Tooltip,
|
||||
Button,
|
||||
Box,
|
||||
} from "@mui/material";
|
||||
import MenuIcon from "@mui/icons-material/Menu";
|
||||
import LogoutIcon from "@mui/icons-material/Logout";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
interface HeaderProps {
|
||||
headerTitle: string;
|
||||
isMobile: boolean;
|
||||
onDrawerToggle: () => void;
|
||||
onLogout: () => void;
|
||||
username?: string;
|
||||
}
|
||||
|
||||
export default function Header({
|
||||
headerTitle,
|
||||
isMobile,
|
||||
onDrawerToggle,
|
||||
onLogout,
|
||||
username,
|
||||
}: HeaderProps) {
|
||||
const navigate = useNavigate();
|
||||
|
||||
return (
|
||||
<AppBar
|
||||
position="fixed"
|
||||
color="default"
|
||||
sx={{
|
||||
zIndex: (theme) => theme.zIndex.drawer + 1,
|
||||
backdropFilter: "blur(8px)",
|
||||
boxShadow: "none",
|
||||
borderBottom: "1px solid",
|
||||
borderColor: "divider",
|
||||
}}
|
||||
>
|
||||
<Toolbar>
|
||||
{isMobile && (
|
||||
<IconButton
|
||||
color="inherit"
|
||||
edge="start"
|
||||
onClick={onDrawerToggle}
|
||||
sx={{ mr: 2 }}
|
||||
>
|
||||
<MenuIcon />
|
||||
</IconButton>
|
||||
)}
|
||||
|
||||
<Typography
|
||||
variant="h6"
|
||||
noWrap
|
||||
sx={{ flexGrow: 1, fontWeight: "bold" }}
|
||||
>
|
||||
{headerTitle}
|
||||
</Typography>
|
||||
|
||||
<Box sx={{ display: { xs: "none", sm: "flex" }, alignItems: "center", mr: 2 }}>
|
||||
<Button
|
||||
color="inherit"
|
||||
onClick={() => navigate("/admin/profile")}
|
||||
sx={{ textTransform: "none", fontWeight: 500 }}
|
||||
>
|
||||
{username}
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
<Tooltip title="Logout">
|
||||
<IconButton color="inherit" onClick={onLogout}>
|
||||
<LogoutIcon />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
);
|
||||
}
|
||||
20
src/Home.tsx
20
src/Home.tsx
@@ -1,20 +1,12 @@
|
||||
import * as React from "react";
|
||||
import AppTheme from './shared-theme/AppTheme';
|
||||
import CssBaseline from '@mui/material/CssBaseline';
|
||||
import { Box, Typography } from '@mui/material';
|
||||
import Footer from './Footer';
|
||||
|
||||
export default function Home(props: { disableCustomTheme?: boolean }) {
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<AppTheme {...props}>
|
||||
<CssBaseline enableColorScheme />
|
||||
<Box>
|
||||
<Typography variant="h1" gutterBottom>
|
||||
Welcome to Khata
|
||||
</Typography>
|
||||
</Box>
|
||||
<Footer />
|
||||
</AppTheme>
|
||||
<Box sx={{ p: 4 }}>
|
||||
<Typography variant="h1" gutterBottom>
|
||||
Welcome to Khata
|
||||
</Typography>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
35
src/main.jsx
35
src/main.jsx
@@ -1,11 +1,23 @@
|
||||
import * as React from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import { BrowserRouter, Routes, Route } from "react-router-dom";
|
||||
import {
|
||||
BrowserRouter,
|
||||
Routes,
|
||||
Route
|
||||
} from "react-router-dom";
|
||||
import {
|
||||
Box,
|
||||
CssBaseline,
|
||||
Toolbar
|
||||
} from "@mui/material";
|
||||
import Home from './Home';
|
||||
import Admin from '../react-openapi/Admin';
|
||||
import { Buffer } from 'buffer';
|
||||
import process from 'process';
|
||||
import { AuthProvider } from "../react-auth";
|
||||
import Header from './Header';
|
||||
import Footer from './Footer';
|
||||
import AppTheme from './AppTheme';
|
||||
|
||||
// Polyfill Node.js globals for browser environment (needed by SwaggerParser)
|
||||
window.Buffer = Buffer;
|
||||
@@ -18,11 +30,22 @@ const AUTH_BASE = import.meta.env.VITE_AUTH_BASE_URL;
|
||||
root.render(
|
||||
<BrowserRouter>
|
||||
<AuthProvider authBaseUrl={AUTH_BASE}>
|
||||
<Routes>
|
||||
<Route path="/" element={<Home />} />
|
||||
<Route path="/home" element={<Home />} />
|
||||
<Route path="/admin/*" element={<Admin basePath="/admin" />} />
|
||||
</Routes>
|
||||
<AppTheme>
|
||||
<CssBaseline enableColorScheme />
|
||||
<Header />
|
||||
|
||||
<Box sx={{ pb: 8 }}>
|
||||
<Toolbar />
|
||||
|
||||
<Routes>
|
||||
<Route path="/" element={<Home />} />
|
||||
<Route path="/home" element={<Home />} />
|
||||
<Route path="/admin/*" element={<Admin basePath="/admin" />} />
|
||||
</Routes>
|
||||
</Box>
|
||||
|
||||
<Footer />
|
||||
</AppTheme>
|
||||
</AuthProvider>
|
||||
</BrowserRouter>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user