import axios from 'axios' import toCamel from 'camelcase-keys' import React, { useState, useEffect } from 'react' import { Link, useLocation, useNavigate, useParams } from 'react-router-dom' import { Button } from '@/components/ui/button' import { API_BASE_URL } from '@/config' import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' import { cn } from '@/lib/utils' import type { Tag, User, WikiPage } from '@/types' type Props = { user: User | null setUser: (user: User) => void } const enum Menu { None, Post, User, Tag, Wiki } export default ({ user, setUser }: Props) => { const location = useLocation () const navigate = useNavigate () const [selectedMenu, setSelectedMenu] = useState (Menu.None) const [wikiId, setWikiId] = useState (WikiIdBus.get ()) const [wikiSearch, setWikiSearch] = useState ('') const [activeIndex, setActiveIndex] = useState (-1) const [suggestions, setSuggestions] = useState ([]) const [suggestionsVsbl, setSuggestionsVsbl] = useState (false) const [tagSearch, setTagSearch] = useState ('') const [userSearch, setUserSearch] = useState ('') const [postCount, setPostCount] = useState (null) const MyLink = ({ to, title, menu, base }: { to: string title: string menu?: Menu base?: string }) => ( {title} ) const whenTagSearchChanged = ev => { // TODO: 実装 setTagSearch (ev.target.value) const q: string = ev.target.value.split (' ').at (-1) if (!(q)) { setSuggestions ([]) return } } const whenWikiSearchChanged = ev => { // TODO: 実装 setWikiSearch (ev.target.value) const q: string = ev.target.value.split (' ').at (-1) if (!(q)) { setSuggestions ([]) return } } const whenUserSearchChanged = ev => { // TODO: 実装 setUserSearch (ev.target.value) const q: string = ev.target.value.split (' ').at (-1) if (!(q)) { setSuggestions ([]) return } } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.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 (() => { if (location.pathname.startsWith ('/posts')) setSelectedMenu (Menu.Post) else if (location.pathname.startsWith ('/users')) setSelectedMenu (Menu.User) else if (location.pathname.startsWith ('/tags')) setSelectedMenu (Menu.Tag) else if (location.pathname.startsWith ('/wiki')) setSelectedMenu (Menu.Wiki) else setSelectedMenu (Menu.None) }, [location]) useEffect (() => { if (!(wikiId)) return void (async () => { try { const { data: pageData } = await axios.get (`${ API_BASE_URL }/wiki/${ wikiId }`) const wikiPage: WikiPage = toCamel (pageData, { deep: true }) const { data: tagData } = await axios.get (`${ API_BASE_URL }/tags/name/${ wikiPage.title }`) const tag: Tag = toCamel (tagData, { deep: true }) setPostCount (tag.postCount) } catch { setPostCount (0) } }) () }, [wikiId]) return ( <> {(() => { const className = 'bg-gray-700 text-white px-3 flex items-center w-full min-h-[40px]' const subClass = 'hover:text-orange-500 h-full flex items-center px-3' const inputBox = 'flex items-center px-3 mx-2' const Separator = () => | switch (selectedMenu) { case Menu.Post: return (
一覧 投稿追加 ヘルプ
) case Menu.Tag: return (
{/* TODO: リリース後にやる */} {/* setSuggestionsVsbl (true)} onBlur={() => setSuggestionsVsbl (false)} onKeyDown={handleKeyDown} /> */} {/* タグ */} {/* 別名タグ 上位タグ */} ニコニコ連携 タグのつけ方 ヘルプ
) case Menu.Wiki: return (
{/* TODO: リリース後にやる */} {/* setSuggestionsVsbl (true)} onBlur={() => setSuggestionsVsbl (false)} onKeyDown={handleKeyDown} /> */} 検索 新規 全体履歴 ヘルプ {(/^\/wiki\/(?!new|changes)[^\/]+/.test (location.pathname) && wikiId) && <> 広場 ({postCount || 0}) 履歴 編輯 }
) case Menu.User: return (
{/* TODO: リリース後にやる */} {/* setSuggestionsVsbl (true)} onBlur={() => setSuggestionsVsbl (false)} onKeyDown={handleKeyDown} /> */} {/* 一覧 {user && お前} */} {user && 設定}
) } }) ()} ) }