Skip to content

Commit

Permalink
added contact page, nav bar, and preloader
Browse files Browse the repository at this point in the history
  • Loading branch information
Trident09 committed Jun 6, 2024
1 parent bb4e497 commit aeadaf2
Show file tree
Hide file tree
Showing 7 changed files with 338 additions and 17 deletions.
16 changes: 11 additions & 5 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Route, Routes } from "react-router-dom";
import Layout from "./Layout";
import About from "./pages/About";
import Contact from "./pages/Contact";
import Home from "./pages/Home";

function App() {
Expand All @@ -8,18 +10,22 @@ function App() {
<Route
path="/"
element={<Layout />}
>
>
<Route
index
element={<Home />}
/>
{/* <Route
path="/contact-us"
<Route
path="/contact"
element={<Contact />}
/> */}
/>
<Route
path="/about"
element={<About />}
/>
</Route>
</Routes>
);
}

export default App;
export default App;
2 changes: 1 addition & 1 deletion src/Layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export default function Layout() {
) : (
<div className="body">
<NavBar />
<main className="pt-24 min-h-[95vh]">
<main>
<Container>
<Outlet />
</Container>
Expand Down
114 changes: 109 additions & 5 deletions src/components/NavBar/NavBar.jsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,113 @@
import React from 'react'
import * as React from 'react';
import PropTypes from 'prop-types';
import AppBar from '@mui/material/AppBar';
import Box from '@mui/material/Box';
import CssBaseline from '@mui/material/CssBaseline';
import Divider from '@mui/material/Divider';
import Drawer from '@mui/material/Drawer';
import IconButton from '@mui/material/IconButton';
import List from '@mui/material/List';
import ListItem from '@mui/material/ListItem';
import ListItemButton from '@mui/material/ListItemButton';
import ListItemText from '@mui/material/ListItemText';
import MenuIcon from '@mui/icons-material/Menu';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import Button from '@mui/material/Button';
import { Link } from 'react-router-dom'; // Assuming you are using react-router-dom

const drawerWidth = 240;
const navItems = [
{ text: 'Home', href: '/' },
{ text: 'About', href: '/about' },
{ text: 'Contact', href: '/contact' },
];

function NavBar(props) {
const { window } = props;
const [mobileOpen, setMobileOpen] = React.useState(false);

const handleDrawerToggle = () => {
setMobileOpen((prevState) => !prevState);
};

const drawer = (
<Box onClick={handleDrawerToggle} sx={{ textAlign: 'center' }}>
<Typography variant="h6" sx={{ my: 2 }}>
QUES HAI
</Typography>
<Divider />
<List>
{navItems.map((item) => (
<ListItem key={item.text} disablePadding>
<ListItemButton sx={{ textAlign: 'center' }} component={Link} to={item.href}>
<ListItemText primary={item.text} />
</ListItemButton>
</ListItem>
))}
</List>
</Box>
);

const container = window !== undefined ? () => window().document.body : undefined;

const NavBar = () => {
return (
<div>NavBar</div>
)
<Box sx={{ display: 'flex' }}>
<CssBaseline />
<AppBar component="nav">
<Toolbar>
<IconButton
color="inherit"
aria-label="open drawer"
edge="start"
onClick={handleDrawerToggle}
sx={{ mr: 2, display: { sm: 'none' } }}
>
<MenuIcon />
</IconButton>
<Typography
variant="h6"
component="div"
sx={{ flexGrow: 1, display: { xs: 'none', sm: 'block' } }}
>
QUES HAI
</Typography>
<Box sx={{ display: { xs: 'none', sm: 'block' } }}>
{navItems.map((item) => (
<Button key={item.text} sx={{ color: '#fff' }} component={Link} to={item.href}>
{item.text}
</Button>
))}
</Box>
</Toolbar>
</AppBar>
<nav>
<Drawer
container={container}
variant="temporary"
open={mobileOpen}
onClose={handleDrawerToggle}
ModalProps={{
keepMounted: true, // Better open performance on mobile.
}}
sx={{
display: { xs: 'block', sm: 'none' },
'& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
}}
>
{drawer}
</Drawer>
</nav>
</Box>
);
}

export default NavBar
NavBar.propTypes = {
/**
* Injected by the documentation to work in an iframe.
* You won't need it on your project.
*/
window: PropTypes.func,
};

export default NavBar;
98 changes: 98 additions & 0 deletions src/components/PreLoader/PreLoader.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
.spinner {
position: absolute;
top: 50%;
left: 50%;
width: 9px;
height: 9px;
}

.spinner div {
position: absolute;
width: 50%;
height: 150%;
background: #000000;
transform: rotate(calc(var(--rotation) * 1deg))
translate(0, calc(var(--translation) * 1%));
animation: spinner-fzua35 1s calc(var(--delay) * 1s) infinite ease;
}

.spinner div:nth-child(1) {
--delay: 0.1;
--rotation: 36;
--translation: 150;
}

.spinner div:nth-child(2) {
--delay: 0.2;
--rotation: 72;
--translation: 150;
}

.spinner div:nth-child(3) {
--delay: 0.3;
--rotation: 108;
--translation: 150;
}

.spinner div:nth-child(4) {
--delay: 0.4;
--rotation: 144;
--translation: 150;
}

.spinner div:nth-child(5) {
--delay: 0.5;
--rotation: 180;
--translation: 150;
}

.spinner div:nth-child(6) {
--delay: 0.6;
--rotation: 216;
--translation: 150;
}

.spinner div:nth-child(7) {
--delay: 0.7;
--rotation: 252;
--translation: 150;
}

.spinner div:nth-child(8) {
--delay: 0.8;
--rotation: 288;
--translation: 150;
}

.spinner div:nth-child(9) {
--delay: 0.9;
--rotation: 324;
--translation: 150;
}

.spinner div:nth-child(10) {
--delay: 1;
--rotation: 360;
--translation: 150;
}

@keyframes spinner-fzua35 {
0%,
10%,
20%,
30%,
50%,
60%,
70%,
80%,
90%,
100% {
transform: rotate(calc(var(--rotation) * 1deg))
translate(0, calc(var(--translation) * 1%));
}

50% {
transform: rotate(calc(var(--rotation) * 1deg))
translate(0, calc(var(--translation) * 1.5%));
}
}
24 changes: 18 additions & 6 deletions src/components/PreLoader/PreLoader.jsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
import React from 'react'
import React from "react";
import "./PreLoader.css";

const PreLoader = () => {
return (
<div>PreLoader</div>
)
}
return (
<div class="spinner">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
);
};

export default PreLoader
export default PreLoader;
9 changes: 9 additions & 0 deletions src/pages/About.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import React from 'react'

const About = () => {
return (
<div>About</div>
)
}

export default About
92 changes: 92 additions & 0 deletions src/pages/Contact.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import React, { useState } from 'react';
import { Button, Typography, Input, InputLabel, FormControl, FormHelperText } from '@mui/material';

const Contact = () => {
const [form, setForm] = useState({
name: '',
email: '',
message: '',
});

const [errors, setErrors] = useState({});

const handleChange = (e) => {
const { name, value } = e.target;
setForm({
...form,
[name]: value,
});
};

const validate = () => {
let tempErrors = {};
tempErrors.name = form.name.length >= 3 ? "" : "Name should be at least 3 characters long";
tempErrors.email = /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.email) ? "" : "Email must be a valid email address";
tempErrors.message = form.message.length >= 10 ? "" : "Message should be at least 10 characters long";

setErrors(tempErrors);
return Object.values(tempErrors).every(x => x === "");
};

const handleSubmit = (e) => {
e.preventDefault();
if (validate()) {
console.log(form);
}
};

return (
<div className="flex justify-center items-center h-screen p-4">
<form onSubmit={handleSubmit} className="bg-white p-6 rounded shadow-md w-full max-w-lg">
<Typography variant="h2" className="text-2xl font-bold mb-6 text-center">Contact Us</Typography>

<div className="mb-4">
<FormControl fullWidth>
<InputLabel>Name</InputLabel>
<Input
name="name"
value={form.name}
onChange={handleChange}
error={!!errors.name}
/>
<FormHelperText error>{errors.name}</FormHelperText>
</FormControl>
</div>

<div className="mb-4">
<FormControl fullWidth>
<InputLabel>Email</InputLabel>
<Input
name="email"
value={form.email}
onChange={handleChange}
error={!!errors.email}
/>
<FormHelperText error>{errors.email}</FormHelperText>
</FormControl>
</div>

<div className="mb-4">
<FormControl fullWidth>
<InputLabel>Message</InputLabel>
<Input
name="message"
value={form.message}
onChange={handleChange}
error={!!errors.message}
multiline
rows={4}
/>
<FormHelperText error>{errors.message}</FormHelperText>
</FormControl>
</div>

<Button type="submit" variant="contained" color="primary" fullWidth>
Send Message
</Button>
</form>
</div>
);
};

export default Contact;

0 comments on commit aeadaf2

Please sign in to comment.