diff --git a/frontend/src/components/MenuSeparator.tsx b/frontend/src/components/MenuSeparator.tsx new file mode 100644 index 0000000..43b94a7 --- /dev/null +++ b/frontend/src/components/MenuSeparator.tsx @@ -0,0 +1,6 @@ +export default () => ( + <> + | +
+ ) diff --git a/frontend/src/components/TopNav.tsx b/frontend/src/components/TopNav.tsx index db23f4a..4702f83 100644 --- a/frontend/src/components/TopNav.tsx +++ b/frontend/src/components/TopNav.tsx @@ -1,8 +1,9 @@ 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, useNavigate } from 'react-router-dom' +import Separator from '@/components/MenuSeparator' import { API_BASE_URL } from '@/config' import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' import { cn } from '@/lib/utils' @@ -14,16 +15,12 @@ type Props = { user: User | null } export default ({ user }: Props) => { const location = useLocation () - // const navigate = useNavigate () + const navigate = useNavigate () - // const [activeIndex, setActiveIndex] = useState (-1) + const [menuOpen, setMenuOpen] = useState (false) + const [openItemIdx, setOpenItemIdx] = useState (-1) const [postCount, setPostCount] = useState (null) - // const [suggestionsVsbl, setSuggestionsVsbl] = useState (false) - // const [suggestions, setSuggestions] = useState ([]) - // const [tagSearch, setTagSearch] = useState ('') - // const [userSearch, setUserSearch] = useState ('') const [wikiId, setWikiId] = useState (WikiIdBus.get ()) - // const [wikiSearch, setWikiSearch] = useState ('') const wikiPageFlg = Boolean (/^\/wiki\/(?!new|changes)[^\/]+/.test (location.pathname) && wikiId) const wikiTitle = location.pathname.split ('/')[2] @@ -44,8 +41,7 @@ export default ({ user }: Props) => { { name: '新規', to: '/wiki/new' }, { name: '全体履歴', to: '/wiki/changes' }, { name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' }, - { component: |, - visible: wikiPageFlg }, + { component: , visible: wikiPageFlg }, { name: `広場 (${ postCount || 0 })`, to: `/posts?tags=${ wikiTitle }`, visible: wikiPageFlg }, { name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg }, @@ -55,61 +51,16 @@ export default ({ user }: Props) => { { name: 'お前', to: `/users/${ user?.id }`, visible: false }, { name: '設定', to: '/users/settings', visible: Boolean (user) }] }] -// const whenTagSearchChanged = (ev: React.ChangeEvent) => { -// // TODO: 実装 -// -// setTagSearch (ev.target.value) -// -// const q: string = ev.target.value.split (' ').at (-1) -// if (!(q)) -// { -// // setSuggestions ([]) -// return -// } -// } - -// const whenWikiSearchChanged = (ev: React.ChangeEvent) => { -// // TODO: 実装 -// -// setWikiSearch (ev.target.value) -// -// const q: string = ev.target.value.split (' ').at (-1) -// if (!(q)) -// { -// // setSuggestions ([]) -// return -// } -// } - -// const whenUserSearchChanged = (ev: React.ChangeEvent) => { -// // TODO: 実装 -// -// setUserSearch (ev.target.value) -// -// const q: string = ev.target.value.split (' ').at (-1) -// if (!(q)) -// { -// // setSuggestions ([]) -// return -// } -// } - -// const handleKeyDown = (ev: React.KeyboardEvent) => { -// if (ev.key === 'Enter' && wikiSearch.length && (!(suggestionsVsbl) || activeIndex < 0)) -// { -// navigate (`/wiki/${ encodeURIComponent (wikiSearch) }`) -// setSuggestionsVsbl (false) -// } -// } - -// const handleTagSelect = (tag: Tag) => { -// } - useEffect (() => { const unsubscribe = WikiIdBus.subscribe (setWikiId) return () => unsubscribe () }, []) + useEffect (() => { + setOpenItemIdx (menu.findIndex (item => ( + location.pathname.startsWith (item.base || item.to)))) + }, [location]) + useEffect (() => { if (!(wikiId)) return @@ -136,16 +87,18 @@ export default ({ user }: Props) => { return ( <> -
+ +
{menu.find (item => location.pathname.startsWith (item.base || item.to))?.subMenu .filter (item => item.visible ?? true) - .map (item => 'component' in item ? item.component : ( - + .map ((item, i) => 'component' in item ? item.component : ( + {item.name} ))}
+ +
+ + {menu.map ((item, i) => ( + <> + { + ev.preventDefault () + if (i === openItemIdx) + { + setMenuOpen (false) + navigate (item.to) + } + else + setOpenItemIdx (i) + }}> + {item.name} + + {i === openItemIdx && ( + item.subMenu + .filter (subItem => subItem.visible ?? true) + .map ((subItem, j) => 'component' in subItem ? subItem.component : ( + + {subItem.name} + )))} + ))} + {user && ( + <> + + + {user.name || '名もなきニジラー'} + + )} + +
) }