|
|
@@ -1,9 +1,10 @@ |
|
|
|
import axios from 'axios' |
|
|
|
import toCamel from 'camelcase-keys' |
|
|
|
import { useState, useEffect } from 'react' |
|
|
|
import { Link, useLocation, useNavigate } from 'react-router-dom' |
|
|
|
import { Link, useLocation } from 'react-router-dom' |
|
|
|
|
|
|
|
import Separator from '@/components/MenuSeparator' |
|
|
|
import TopNavUser from '@/components/TopNavUser' |
|
|
|
import { API_BASE_URL } from '@/config' |
|
|
|
import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' |
|
|
|
import { cn } from '@/lib/utils' |
|
|
@@ -15,7 +16,6 @@ type Props = { user: User | null } |
|
|
|
|
|
|
|
export default ({ user }: Props) => { |
|
|
|
const location = useLocation () |
|
|
|
const navigate = useNavigate () |
|
|
|
|
|
|
|
const [menuOpen, setMenuOpen] = useState (false) |
|
|
|
const [openItemIdx, setOpenItemIdx] = useState (-1) |
|
|
@@ -57,6 +57,7 @@ export default ({ user }: Props) => { |
|
|
|
}, []) |
|
|
|
|
|
|
|
useEffect (() => { |
|
|
|
setMenuOpen (false) |
|
|
|
setOpenItemIdx (menu.findIndex (item => ( |
|
|
|
location.pathname.startsWith (item.base || item.to)))) |
|
|
|
}, [location]) |
|
|
@@ -107,14 +108,7 @@ export default ({ user }: Props) => { |
|
|
|
))} |
|
|
|
</div> |
|
|
|
|
|
|
|
{user && ( |
|
|
|
<div className="hidden md:block ml-auto pr-4"> |
|
|
|
<Link to="/users/settings" |
|
|
|
className="font-bold text-red-600 hover:text-red-400 |
|
|
|
dark:text-yellow-400 dark:hover:text-yellow-200"> |
|
|
|
{user.name || '名もなきニジラー'} |
|
|
|
</Link> |
|
|
|
</div>)} |
|
|
|
<TopNavUser user={user} /> |
|
|
|
|
|
|
|
<a href="#" |
|
|
|
className="md:hidden ml-auto pr-4 |
|
|
@@ -145,22 +139,20 @@ export default ({ user }: Props) => { |
|
|
|
<Separator /> |
|
|
|
{menu.map ((item, i) => ( |
|
|
|
<> |
|
|
|
<a key={i} |
|
|
|
href="#" |
|
|
|
className={cn ('w-full min-h-[40px] flex items-center pl-8', |
|
|
|
i === openItemIdx && 'font-bold bg-yellow-50 dark:bg-red-950')} |
|
|
|
onClick={ev => { |
|
|
|
ev.preventDefault () |
|
|
|
if (i === openItemIdx) |
|
|
|
{ |
|
|
|
setMenuOpen (false) |
|
|
|
navigate (item.to) |
|
|
|
} |
|
|
|
else |
|
|
|
setOpenItemIdx (i) |
|
|
|
}}> |
|
|
|
<Link key={i} |
|
|
|
to={i === openItemIdx ? item.to : '#'} |
|
|
|
className={cn ('w-full min-h-[40px] flex items-center pl-8', |
|
|
|
((i === openItemIdx) |
|
|
|
&& 'font-bold bg-yellow-50 dark:bg-red-950'))} |
|
|
|
onClick={ev => { |
|
|
|
if (i !== openItemIdx) |
|
|
|
{ |
|
|
|
ev.preventDefault () |
|
|
|
setOpenItemIdx (i) |
|
|
|
} |
|
|
|
}}> |
|
|
|
{item.name} |
|
|
|
</a> |
|
|
|
</Link> |
|
|
|
{i === openItemIdx && ( |
|
|
|
item.subMenu |
|
|
|
.filter (subItem => subItem.visible ?? true) |
|
|
@@ -172,16 +164,7 @@ export default ({ user }: Props) => { |
|
|
|
{subItem.name} |
|
|
|
</Link>)))} |
|
|
|
</>))} |
|
|
|
{user && ( |
|
|
|
<> |
|
|
|
<Separator /> |
|
|
|
<Link to="/users/settings" |
|
|
|
className="w-full min-h-[40px] flex items-center pl-8 |
|
|
|
font-bold text-red-600 hover:text-red-400 |
|
|
|
dark:text-yellow-400 dark:hover:text-yellow-200"> |
|
|
|
{user.name || '名もなきニジラー'} |
|
|
|
</Link> |
|
|
|
</>)} |
|
|
|
<TopNavUser user={user} sp /> |
|
|
|
<Separator /> |
|
|
|
</div> |
|
|
|
</>) |
|
|
|