Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 979330478c | |||
| bf87780204 |
@@ -1,31 +1,86 @@
|
|||||||
|
import {useState} from 'react'
|
||||||
import { Link, useLocation, useNavigate } from "react-router-dom";
|
import { Link, useLocation, useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
import { Icons } from "../index";
|
import { Icons } from "../index";
|
||||||
|
|
||||||
export default function Aside() {
|
type Props = {
|
||||||
|
asideDisplay?: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Aside({asideDisplay}:Props) {
|
||||||
|
|
||||||
const {pathname} = useLocation()
|
const {pathname} = useLocation()
|
||||||
|
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
|
|
||||||
|
const [openNestedLink, setOpenNestedLink] = useState<{name:string|null}>({name: ''})
|
||||||
|
|
||||||
|
const handleOpenNestedLink = (e:any) => {
|
||||||
|
if(!e || !e.target){
|
||||||
|
return setOpenNestedLink({name: ''})
|
||||||
|
}
|
||||||
|
if(openNestedLink.name && openNestedLink.name == e.target.name){
|
||||||
|
setOpenNestedLink({name: ''})
|
||||||
|
}else{
|
||||||
|
setOpenNestedLink({name: e.target.name})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="py-5 px-10 flex flex-col h-full">
|
<div className="py-5 px-10 flex flex-col h-full bg-inherit">
|
||||||
<div className="flex justify-center items-center text-sm">
|
<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">
|
<p className="w-14 h-14 rounded-full bg-[#5C2684]/50 flex items-center justify-center">
|
||||||
AC
|
AC
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-10 h-full overflow-y-auto">
|
<div className="mt-10 h-full overflow-y-auto bg-inherit">
|
||||||
{asideLinks.map((link, index) => (
|
{asideLinks.map((link, index) => {
|
||||||
<Link
|
if(link.nestedLink?.length){
|
||||||
key={index}
|
let allNestedLinks = link.nestedLink.map(item => item.link)
|
||||||
to={link.link}
|
return (
|
||||||
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]'}`}
|
<div key={index} className='w-full relative bg-inherit overflow-hidden'>
|
||||||
>
|
<button
|
||||||
<Icons name={link.icon} fillColor={`${pathname == link.link ? '#5C2684' : '#585858'}`} />
|
name={link.name}
|
||||||
{link.name}
|
onClick={(e)=>handleOpenNestedLink(e)}
|
||||||
</Link>
|
className={`py-2 pl-2 text-left relative w-full overflow-hidden rounded-lg border-2 flex justify-between items-center z-10 bg-inherit ${allNestedLinks.includes(pathname) ? 'border-[#5C2684] text-[#5C2684]' : 'border-transparent text-[#585858]'}`}
|
||||||
))}
|
>
|
||||||
|
{link.name}
|
||||||
|
<div className={`mr-2 ${openNestedLink.name == link.name ? '-rotate-90' : 'rotate-90'} transition-all duration-300`}>
|
||||||
|
<Icons
|
||||||
|
name='greater-than'
|
||||||
|
fillColor={`${openNestedLink.name == link.name ? '#5C2684' : '#585858'}`}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div className={`transition-all duration-300 w-full z-1 ${openNestedLink.name == link.name ? 'relative top-0' : 'absolute -top-[500px]'}`}>
|
||||||
|
{link.nestedLink.map((nextLink, index) => (
|
||||||
|
<Link
|
||||||
|
onClick={()=>{asideDisplay && asideDisplay()}}
|
||||||
|
key={index}
|
||||||
|
to={nextLink.link ? nextLink.link : '#'}
|
||||||
|
className={`w-full my-1 flex items-center gap-2 py-2 pl-5 text-base font-medium border-l-2 ${pathname == nextLink.link ? 'border-[#5C2684] text-[#5C2684]' : 'border-transparent text-[#585858]'}`}
|
||||||
|
>
|
||||||
|
<Icons name={nextLink.icon} fillColor={`${pathname == nextLink.link ? '#5C2684' : '#585858'}`} />
|
||||||
|
{nextLink.name}
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}else{
|
||||||
|
return(
|
||||||
|
<Link
|
||||||
|
onClick={()=>{asideDisplay && asideDisplay()}}
|
||||||
|
key={index}
|
||||||
|
to={link.link ? 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>
|
||||||
<div className="w-full flex justify-center items-center">
|
<div className="w-full flex justify-center items-center">
|
||||||
<button className="py-3 px-6 bg-red-100 text-red-500 font-medium rounded-md" onClick={()=>navigate('/login', {replace:true})}>
|
<button className="py-3 px-6 bg-red-100 text-red-500 font-medium rounded-md" onClick={()=>navigate('/login', {replace:true})}>
|
||||||
@@ -39,14 +94,23 @@ export default function Aside() {
|
|||||||
|
|
||||||
type AsideLinksType = {
|
type AsideLinksType = {
|
||||||
name: string,
|
name: string,
|
||||||
link: string,
|
link?: string,
|
||||||
icon: string,
|
icon: string,
|
||||||
nestedlink?:boolean
|
nestedLink:{
|
||||||
|
name: string,
|
||||||
|
link: string,
|
||||||
|
icon: string,
|
||||||
|
}[]
|
||||||
}[]
|
}[]
|
||||||
const asideLinks:AsideLinksType = [
|
const asideLinks:AsideLinksType = [
|
||||||
{name: 'Home', link: '/dashboard/home', icon: 'home'},
|
{name: 'Home', link: '/dashboard/home', icon: 'home', nestedLink:[]},
|
||||||
{name: 'My Profile', link: '/dashboard/profile', icon: 'profile'},
|
{name: 'My Profile', link: '/dashboard/profile', icon: 'profile', nestedLink:[]},
|
||||||
{name: 'Verification', link: '/dashboard/verification', icon: 'verification'},
|
{name: 'Verification', link: '/dashboard/verification', icon: 'verification', nestedLink:[]},
|
||||||
{name: 'Payments', link: '/dashboard/payments', icon: 'payments'},
|
{name: 'Payments', link: '/dashboard/payments', icon: 'payments', nestedLink:[]},
|
||||||
{name: 'Legals', link: '/dashboard/legals', icon: 'legals'},
|
{name: 'Legals', link: '/dashboard/legals', icon: 'legals', nestedLink:[]},
|
||||||
|
{name: 'Nested Link', icon: 'home', nestedLink:[
|
||||||
|
{name: 'Link 2', link: '/dashboard/not-found', icon: 'legals'},
|
||||||
|
{name: 'Link 1', link: '/dashboard/not-found', icon: 'home'}
|
||||||
|
]
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export default function DashboardLayout({children}:{children: ReactNode}) {
|
|||||||
|
|
||||||
const [showAside, setShowAside] = useState<boolean>(false)
|
const [showAside, setShowAside] = useState<boolean>(false)
|
||||||
|
|
||||||
const AsideDisplay = () => {
|
const asideDisplay = ():void => {
|
||||||
setShowAside(prev => !prev)
|
setShowAside(prev => !prev)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ export default function DashboardLayout({children}:{children: ReactNode}) {
|
|||||||
</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 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 asideDisplay={asideDisplay}/>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<main className={`dash-bg-image bg-[#F9F9F9] relative w-full overflow-y-auto overflow-x-hidden`}>
|
<main className={`dash-bg-image bg-[#F9F9F9] relative w-full overflow-y-auto overflow-x-hidden`}>
|
||||||
@@ -43,22 +43,22 @@ export default function DashboardLayout({children}:{children: ReactNode}) {
|
|||||||
<div className='w-full'>Welcome Austin Catherine</div>
|
<div className='w-full'>Welcome Austin Catherine</div>
|
||||||
<div
|
<div
|
||||||
className="relative md:hidden w-5 h-[20px] flex flex-col items-center justify-between"
|
className="relative md:hidden w-5 h-[20px] flex flex-col items-center justify-between"
|
||||||
onClick={AsideDisplay}
|
onClick={asideDisplay}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-500 ${
|
className={`absolute left-0 w-5 h-1 bg-black/80 dark:bg-white transition-all duration-500 ${
|
||||||
showAside ? "top-1/2 -translate-y-1/2 rotate-45" : "top-0"
|
showAside ? "top-1/2 -translate-y-1/2 rotate-45" : "top-0"
|
||||||
}`}
|
}`}
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-300 ${
|
className={`absolute left-0 w-5 h-1 bg-black/80 dark:bg-white transition-all duration-300 ${
|
||||||
showAside
|
showAside
|
||||||
? "top-1/2 -translate-y-1/2 rotate-[2000deg] opacity-0"
|
? "top-1/2 -translate-y-1/2 rotate-[2000deg] opacity-0"
|
||||||
: "top-1/2 -translate-y-1/2"
|
: "top-1/2 -translate-y-1/2"
|
||||||
}`}
|
}`}
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 w-5 h-1 bg-black dark:bg-white transition-all duration-500 ${
|
className={`absolute left-0 w-5 h-1 bg-black/80 dark:bg-white transition-all duration-500 ${
|
||||||
showAside
|
showAside
|
||||||
? "top-1/2 -translate-y-1/2 -rotate-45"
|
? "top-1/2 -translate-y-1/2 -rotate-45"
|
||||||
: "bottom-0"
|
: "bottom-0"
|
||||||
|
|||||||
Reference in New Issue
Block a user