Compare commits

...

2 Commits

Author SHA1 Message Date
victorAnumudu eaf959ab84 merged branch 2024-03-16 03:09:41 +01:00
victorAnumudu 7cbfae619b added dashboard layout 2024-03-16 02:53:40 +01:00
18 changed files with 255 additions and 7 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

+52
View File
@@ -0,0 +1,52 @@
import { Link, useLocation, useNavigate } from "react-router-dom";
import { Icons } from "../index";
export default function Aside() {
const {pathname} = useLocation()
const navigate = useNavigate()
return (
<div className="py-5 px-10 flex flex-col h-full">
<div className="flex justify-center items-center text-sm">
<p className="w-14 h-14 rounded-full bg-[#5C2684]/50 flex items-center justify-center">
AC
</p>
</div>
<div className="mt-10 h-full overflow-y-auto">
{asideLinks.map((link, index) => (
<Link
key={index}
to={link.link}
className={`w-full my-4 flex items-center gap-2 py-2 pl-5 rounded-lg text-base font-medium border-2 ${pathname == link.link ? 'border-[#5C2684] text-[#5C2684]' : 'border-transparent text-[#585858]'}`}
>
<Icons name={link.icon} fillColor={`${pathname == link.link ? '#5C2684' : '#585858'}`} />
{link.name}
</Link>
))}
</div>
<div className="w-full flex justify-center items-center">
<button className="py-3 px-6 bg-red-100 text-red-500 font-medium" onClick={()=>navigate('/login', {replace:true})}>
Log out
</button>
</div>
</div>
);
}
type AsideLinksType = {
name: string,
link: string,
icon: string,
nestedlink?:boolean
}[]
const asideLinks:AsideLinksType = [
{name: 'Home', link: '/dashboard/home', icon: 'home'},
{name: 'My Profile', link: '/dashboard/profile', icon: 'profile'},
{name: 'Verification', link: '/dashboard/verification', icon: 'verification'},
{name: 'Payments', link: '/dashboard/payments', icon: 'payments'},
{name: 'Legals', link: '/dashboard/legals', icon: 'legals'},
]
@@ -0,0 +1,10 @@
import DashboardLayout from "./DashboardLayout";
import { Outlet } from "react-router-dom";
export default function DashboardAuth() {
return (
<DashboardLayout>
<Outlet />
</DashboardLayout>
)
}
@@ -0,0 +1,94 @@
import { ReactNode, useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import Aside from './Aside'
export default function DashboardLayout({children}:{children: ReactNode}) {
const [showAside, setShowAside] = useState(false)
let [widthSize, setWidthSize] = useState('')
const AsideDisplay = () => {
setShowAside(prev => !prev)
}
useEffect(() => {
const screenResized = window.addEventListener('resize', ()=>{
setShowAside(false)
setWidthSize(window.innerWidth)
})
return () => {
window.removeEventListener('resize', screenResized)
}
}, [])
return (
<div className='w-full max-w-[2000px] mx-auto h-screen flex bg-[#F9F9F9] text-black'>
<aside className='w-[300px] bg-white hidden md:block border-r-2 border-[#E6E6E6]'>
<Aside />
</aside>
<aside className={`w-[300px] md:hidden bg-white border-r-2 border-[#E6E6E6] fixed top-0 bottom-0 z-50 transition-all duration-500 ${showAside ? 'left-0' : '-left-[200%]'}`}>
<Aside />
</aside>
<main className={`dash-bg-image relative w-full overflow-y-auto overflow-x-hidden`}>
<header className={`p-5 sticky z-10 top-0 w-full bg-[#F9F9F9] border-b-2 border-[#E6E6E6] bg-[url('../../../src/assets/images/dashboard/Ellipse1.png')] bg-no-repeat bg-[top_right]`}>
<div className='h-14 w-full flex justify-end items-center gap-5'>
{/* <div className=''>
<button className='px-4 py-2 rounded-lg shadow-lg bg-white/50'>DarkMode</button>
</div> */}
{/* MENU HAND BURGER */}
<div className='w-full'>Welcome Austin Catherine</div>
<div
className="relative md:hidden w-5 h-[20px] flex flex-col items-center justify-between"
onClick={AsideDisplay}
>
<div
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-500 ${
showAside ? "top-1/2 -translate-y-1/2 rotate-45" : "top-0"
}`}
></div>
<div
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-300 ${
showAside
? "top-1/2 -translate-y-1/2 rotate-[2000deg] opacity-0"
: "top-1/2 -translate-y-1/2"
}`}
></div>
<div
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-500 ${
showAside
? "top-1/2 -translate-y-1/2 -rotate-45"
: "bottom-0"
}`}
></div>
</div>
</div>
</header>
<div className='flex p-5 relative'>
<div className='w-full p-5'>
{children}
</div>
{/* <div className={`pl-5 w-[300px] min-w-[300px] hidden lg:block`}>
<div className='sticky top-16'>
<div className='w-full min-h-72 bg-white/50 shadow-lg rounded-lg p-5'>
<p className='text-base font-semibold tracking-wide pb-2' title='Answered question is marked green'>Answered Question</p>
<div className='grid grid-cols-8 gap-2'>
{Array.from({length: 50}, (_, i) => i + 1).map((item, index) => (
<span key={index} className={`w-6 h-6 text-sm rounded-full flex justify-center items-center shadow-lg cursor-pointer ${index%2 == 0 ? 'bg-emerald-600' : ''}`}>{item}</span>
))}
</div>
</div>
</div>
</div> */}
</div>
</main>
</div>
)
}
+3
View File
@@ -0,0 +1,3 @@
import DashboardAuth from "./DashboardAuth";
export { DashboardAuth };
+37
View File
@@ -0,0 +1,37 @@
type Props = {
name:string,
fillColor?:string
}
export default function Icons({name, fillColor}:Props) {
return (
<>
{name == 'home' ?
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.1667 14.9875V19.9875H17.5C18.8807 19.9875 20 18.8682 20 17.4875V9.88673C20.0002 9.4538 19.832 9.03778 19.5308 8.72673L12.4492 1.07087C11.1996 -0.281086 9.09074 -0.364094 7.73879 0.885437C7.67457 0.944812 7.6127 1.00665 7.55336 1.07087L0.48418 8.72423C0.173945 9.03657 -0.000117128 9.45899 5.9134e-08 9.89923V17.4875C5.9134e-08 18.8682 1.1193 19.9875 2.5 19.9875H5.83332V14.9875C5.84891 12.7152 7.68355 10.8596 9.89867 10.8061C12.1879 10.7509 14.1492 12.6381 14.1667 14.9875Z" fill={fillColor ? fillColor : '#5C2684'}/>
<path d="M10 12.4875C8.6193 12.4875 7.5 13.6068 7.5 14.9875V19.9875H12.5V14.9875C12.5 13.6068 11.3807 12.4875 10 12.4875Z" fill={fillColor ? fillColor : '#5C2684'}/>
</svg>
:name == 'profile'?
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 10C12.7614 10 15 7.76142 15 5C15 2.23858 12.7614 0 10 0C7.23858 0 5 2.23858 5 5C5 7.76142 7.23858 10 10 10Z" fill={fillColor ? fillColor : '#5C2684'}/>
<path d="M10 11.6667C5.85977 11.6713 2.50461 15.0265 2.5 19.1667C2.5 19.6269 2.87309 20 3.33332 20H16.6666C17.1269 20 17.5 19.6269 17.5 19.1667C17.4954 15.0265 14.1402 11.6713 10 11.6667Z" fill={fillColor ? fillColor : '#5C2684'}/>
</svg>
:name == 'verification'?
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.728 6.8281L18.1812 5.28145C17.814 4.91432 17.2203 4.91432 16.857 5.28145L7.50177 14.6356L3.15031 10.2807C2.78313 9.91359 2.1894 9.91359 1.82613 10.2807L0.275384 11.8313C-0.0917946 12.1984 -0.0917946 12.7921 0.275384 13.1592L6.83772 19.7246C7.2049 20.0918 7.79864 20.0918 8.16191 19.7246L19.7241 8.15603C20.0913 7.78499 20.0913 7.19133 19.728 6.8281ZM7.06037 10.9681C7.30256 11.2142 7.70098 11.2142 7.94316 10.9681L16.068 2.8365C16.3101 2.59044 16.3101 2.19597 16.068 1.95382L14.3024 0.184543C14.0602 -0.0615144 13.6618 -0.0615144 13.4196 0.184543L7.50177 6.10164L5.33776 3.93399C5.09558 3.68794 4.69715 3.68794 4.45497 3.93399L2.68548 5.70327C2.4433 5.94932 2.4433 6.3438 2.68548 6.58595L7.06037 10.9681Z" fill={fillColor ? fillColor : '#5C2684'}/>
</svg>
:name == 'payments'?
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 14.2857C0 15.2321 0.746528 16 1.66667 16H18.3333C19.2535 16 20 15.2321 20 14.2857V8H0V14.2857ZM6.66667 11.8571C6.66667 11.6214 6.85417 11.4286 7.08333 11.4286H11.8056C12.0347 11.4286 12.2222 11.6214 12.2222 11.8571V13.2857C12.2222 13.5214 12.0347 13.7143 11.8056 13.7143H7.08333C6.85417 13.7143 6.66667 13.5214 6.66667 13.2857V11.8571ZM2.22222 11.8571C2.22222 11.6214 2.40972 11.4286 2.63889 11.4286H5.13889C5.36806 11.4286 5.55556 11.6214 5.55556 11.8571V13.2857C5.55556 13.5214 5.36806 13.7143 5.13889 13.7143H2.63889C2.40972 13.7143 2.22222 13.5214 2.22222 13.2857V11.8571ZM20 1.71429V3.42857H0V1.71429C0 0.767857 0.746528 0 1.66667 0H18.3333C19.2535 0 20 0.767857 20 1.71429Z" fill={fillColor ? fillColor : '#5C2684'}/>
</svg>
:name == 'legals'?
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 10.5H7.99937C7.99937 9.99438 8.04125 10.2272 5.34156 4.82781C4.79 3.725 3.21062 3.72281 2.65812 4.82781C-0.0643752 10.2734 0.000625 10.0103 0.000625 10.5H0C0 11.8806 1.79094 13 4 13C6.20906 13 8 11.8806 8 10.5ZM4 5.5L6.25 10H1.75L4 5.5ZM19.9994 10.5C19.9994 9.99438 20.0413 10.2272 17.3416 4.82781C16.79 3.725 15.2106 3.72281 14.6581 4.82781C11.9356 10.2734 12.0006 10.0103 12.0006 10.5H12C12 11.8806 13.7909 13 16 13C18.2091 13 20 11.8806 20 10.5H19.9994ZM13.75 10L16 5.5L18.25 10H13.75ZM16.5 14H11V4.78906C11.7347 4.4675 12.2863 3.80531 12.4497 3H16.5C16.7763 3 17 2.77625 17 2.5V1.5C17 1.22375 16.7763 1 16.5 1H11.9888C11.5325 0.39625 10.8153 0 10 0C9.18469 0 8.4675 0.39625 8.01125 1H3.5C3.22375 1 3 1.22375 3 1.5V2.5C3 2.77625 3.22375 3 3.5 3H7.55031C7.71375 3.805 8.265 4.4675 9 4.78906V14H3.5C3.22375 14 3 14.2238 3 14.5V15.5C3 15.7762 3.22375 16 3.5 16H16.5C16.7763 16 17 15.7762 17 15.5V14.5C17 14.2238 16.7763 14 16.5 14Z" fill={fillColor ? fillColor : '#5C2684'}/>
</svg>
:
null
}
</>
)
}
+3
View File
@@ -0,0 +1,3 @@
import Icons from "./Icons";
export { Icons };
+7 -5
View File
@@ -1,5 +1,7 @@
export * from "./Header"
export * from "./Home"
export * from "./GetStarted"
export * from "./shared"
export * from "./Footer"
export * from "./Header";
export * from "./Home";
export * from "./GetStarted";
export * from "./shared";
export * from "./Footer";
export * from "./DashboardLayout";
export * from "./Icons";
+3
View File
@@ -16,4 +16,7 @@ body {
.containerMode {
@apply container mx-auto px-5 xxs:max-w-full sm:max-w-[98%] lg:max-w-[1100px];
}
.dash-bg-image{
background: url('../src/assets/images/dashboard/bg_ellipse1.png') right top no-repeat, url('../src/assets/images/dashboard/bg_ellipse2.png') -8% bottom no-repeat;;
}
}
+5
View File
@@ -0,0 +1,5 @@
export default function DashboardHome() {
return (
<div className=''>DashboardHome</div>
)
}
+5
View File
@@ -0,0 +1,5 @@
export default function DashboardLegals() {
return (
<div>DashboardLegals</div>
)
}
+5
View File
@@ -0,0 +1,5 @@
export default function Dashboardpayments() {
return (
<div>Dashboardpayments</div>
)
}
+5
View File
@@ -0,0 +1,5 @@
export default function DashboardProfile() {
return (
<div>DashboardProfile</div>
)
}
+5
View File
@@ -0,0 +1,5 @@
export default function DashboardVerification() {
return (
<div>DashboardVerification</div>
)
}
+6 -1
View File
@@ -1,5 +1,10 @@
import HomePage from "./HomePage";
import LoginPage from "./LoginPage";
import GetStartedPage from "./GetStartedPage";
import DashboardHome from "./DashboardHome";
import DashboardLegals from "./DashboardLegals";
import DashboardProfile from "./DashboardProfile";
import DashboardVerification from "./DashboardVerification";
import Dashboardpayments from "./DashboardPayments";
export {HomePage, LoginPage, GetStartedPage}
export {HomePage, LoginPage, GetStartedPage, DashboardHome, DashboardLegals, DashboardProfile, DashboardVerification, Dashboardpayments}
+10 -1
View File
@@ -1,6 +1,7 @@
import { Route, Routes } from "react-router-dom";
import { RouteHandler } from "./routes";
import { GetStartedPage, HomePage, LoginPage } from "../pages";
import { GetStartedPage, HomePage, LoginPage, DashboardHome, DashboardLegals, DashboardProfile, DashboardVerification, Dashboardpayments } from "../pages";
import { DashboardAuth } from "../components";
const Routers = () => {
return (
@@ -8,6 +9,14 @@ const Routers = () => {
<Route path={RouteHandler.homepage} element={<HomePage />} />
<Route path={RouteHandler.loginpage} element={<LoginPage />} />
<Route path={RouteHandler.getStarted} element={<GetStartedPage />} />
<Route element={<DashboardAuth />}>
<Route path={RouteHandler.dashboardHome} element={<DashboardHome />} />
<Route path={RouteHandler.dashboardProfile} element={<DashboardProfile />} />
<Route path={RouteHandler.dashboardVerification} element={<DashboardVerification />} />
<Route path={RouteHandler.dashboardPayments} element={<Dashboardpayments />} />
<Route path={RouteHandler.dashboardLegals} element={<DashboardLegals />} />
</Route>
<Route path='*'element={<>Error Page</>} />
</Routes>
);
};
+5
View File
@@ -2,4 +2,9 @@ export class RouteHandler {
static homepage = "/"
static loginpage = '/login'
static getStarted = "/get-started"
static dashboardHome = '/dashboard/home'
static dashboardProfile = '/dashboard/profile'
static dashboardVerification = '/dashboard/verification'
static dashboardPayments = '/dashboard/payments'
static dashboardLegals = '/dashboard/legals'
}