mirror of
https://github.com/utopia-os/utopia-ui.git
synced 2026-01-16 01:44:43 +00:00
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
/* eslint-disable @typescript-eslint/prefer-find */
|
|
import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon'
|
|
import { useEffect, useState } from 'react'
|
|
import { Link, useLocation } from 'react-router-dom'
|
|
|
|
import type { Route } from './SideBar'
|
|
|
|
function SidebarSubmenu({
|
|
submenu,
|
|
name,
|
|
icon,
|
|
}: {
|
|
path: string
|
|
icon: React.JSX.Element
|
|
name: string
|
|
submenu?: Route[]
|
|
}) {
|
|
const location = useLocation()
|
|
const [isExpanded, setIsExpanded] = useState(false)
|
|
|
|
/** Open Submenu list if path found in routes, this is for directly loading submenu routes first time */
|
|
useEffect(() => {
|
|
if (
|
|
submenu?.filter((m) => {
|
|
return m.path === location.pathname
|
|
})[0]
|
|
)
|
|
setIsExpanded(true)
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [])
|
|
|
|
return (
|
|
<div className='flex-col'>
|
|
{/** Route header */}
|
|
<div
|
|
className='w-full'
|
|
onClick={() => {
|
|
setIsExpanded(!isExpanded)
|
|
}}
|
|
>
|
|
{icon} <span>{name} </span>
|
|
<ChevronDownIcon
|
|
className={
|
|
'w-5 h-5 mt-1 float-right delay-400 duration-500 transition-all ' +
|
|
(isExpanded ? 'rotate-180' : '')
|
|
}
|
|
/>
|
|
</div>
|
|
|
|
{/** Submenu list */}
|
|
<div className={' w-full' + (isExpanded ? '' : 'hidden')}>
|
|
<ul className={'menu menu-compact'}>
|
|
{submenu?.map((m, k) => {
|
|
return (
|
|
<li key={k}>
|
|
<Link to={m.path} className=''>
|
|
{m.icon}
|
|
<span className='' data-te-sidenav-slim='false'>
|
|
{m.name}
|
|
</span>
|
|
{location.pathname === m.path ? (
|
|
<span
|
|
className='absolute mt-1 mb-1 inset-y-0 left-0 w-1 rounded-tr-md rounded-br-md bg-primary '
|
|
aria-hidden='true'
|
|
></span>
|
|
) : null}
|
|
</Link>
|
|
</li>
|
|
)
|
|
})}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default SidebarSubmenu
|