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 Container from '@mui/material/Container';
|
||||||
import Link from '@mui/material/Link';
|
import Link from '@mui/material/Link';
|
||||||
import Typography from '@mui/material/Typography';
|
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() {
|
function Copyright() {
|
||||||
return (
|
return (
|
||||||
@@ -17,6 +20,19 @@ function Copyright() {
|
|||||||
|
|
||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
return (
|
return (
|
||||||
|
<AppBar
|
||||||
|
position="fixed"
|
||||||
|
color="default"
|
||||||
|
sx={{
|
||||||
|
top: 'auto',
|
||||||
|
bottom: 0,
|
||||||
|
backdropFilter: 'blur(8px)',
|
||||||
|
boxShadow: 'none',
|
||||||
|
borderTop: '1px solid',
|
||||||
|
borderColor: 'divider',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Toolbar>
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Container
|
<Container
|
||||||
sx={{
|
sx={{
|
||||||
@@ -31,5 +47,7 @@ export default function Footer() {
|
|||||||
<Copyright />
|
<Copyright />
|
||||||
</Container>
|
</Container>
|
||||||
</React.Fragment>
|
</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>
|
||||||
|
);
|
||||||
|
}
|
||||||
12
src/Home.tsx
12
src/Home.tsx
@@ -1,20 +1,12 @@
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import AppTheme from './shared-theme/AppTheme';
|
|
||||||
import CssBaseline from '@mui/material/CssBaseline';
|
|
||||||
import { Box, Typography } from '@mui/material';
|
import { Box, Typography } from '@mui/material';
|
||||||
import Footer from './Footer';
|
|
||||||
|
|
||||||
export default function Home(props: { disableCustomTheme?: boolean }) {
|
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<AppTheme {...props}>
|
<Box sx={{ p: 4 }}>
|
||||||
<CssBaseline enableColorScheme />
|
|
||||||
<Box>
|
|
||||||
<Typography variant="h1" gutterBottom>
|
<Typography variant="h1" gutterBottom>
|
||||||
Welcome to Khata
|
Welcome to Khata
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
<Footer />
|
|
||||||
</AppTheme>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
25
src/main.jsx
25
src/main.jsx
@@ -1,11 +1,23 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { createRoot } from 'react-dom/client';
|
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 Home from './Home';
|
||||||
import Admin from '../react-openapi/Admin';
|
import Admin from '../react-openapi/Admin';
|
||||||
import { Buffer } from 'buffer';
|
import { Buffer } from 'buffer';
|
||||||
import process from 'process';
|
import process from 'process';
|
||||||
import { AuthProvider } from "../react-auth";
|
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)
|
// Polyfill Node.js globals for browser environment (needed by SwaggerParser)
|
||||||
window.Buffer = Buffer;
|
window.Buffer = Buffer;
|
||||||
@@ -18,11 +30,22 @@ const AUTH_BASE = import.meta.env.VITE_AUTH_BASE_URL;
|
|||||||
root.render(
|
root.render(
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<AuthProvider authBaseUrl={AUTH_BASE}>
|
<AuthProvider authBaseUrl={AUTH_BASE}>
|
||||||
|
<AppTheme>
|
||||||
|
<CssBaseline enableColorScheme />
|
||||||
|
<Header />
|
||||||
|
|
||||||
|
<Box sx={{ pb: 8 }}>
|
||||||
|
<Toolbar />
|
||||||
|
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Home />} />
|
<Route path="/" element={<Home />} />
|
||||||
<Route path="/home" element={<Home />} />
|
<Route path="/home" element={<Home />} />
|
||||||
<Route path="/admin/*" element={<Admin basePath="/admin" />} />
|
<Route path="/admin/*" element={<Admin basePath="/admin" />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</AppTheme>
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user