ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

107 lines
3.4 KiB

  1. import axios from 'axios'
  2. import { useEffect, useState } from 'react'
  3. import { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom'
  4. import RouteBlockerOverlay from '@/components/RouteBlockerOverlay'
  5. import TopNav from '@/components/TopNav'
  6. import { Toaster } from '@/components/ui/toaster'
  7. import { apiPost } from '@/lib/api'
  8. import NicoTagListPage from '@/pages/tags/NicoTagListPage'
  9. import NotFound from '@/pages/NotFound'
  10. import PostDetailPage from '@/pages/posts/PostDetailPage'
  11. import PostHistoryPage from '@/pages/posts/PostHistoryPage'
  12. import PostListPage from '@/pages/posts/PostListPage'
  13. import PostNewPage from '@/pages/posts/PostNewPage'
  14. import ServiceUnavailable from '@/pages/ServiceUnavailable'
  15. import SettingPage from '@/pages/users/SettingPage'
  16. import WikiDetailPage from '@/pages/wiki/WikiDetailPage'
  17. import WikiDiffPage from '@/pages/wiki/WikiDiffPage'
  18. import WikiEditPage from '@/pages/wiki/WikiEditPage'
  19. import WikiHistoryPage from '@/pages/wiki/WikiHistoryPage'
  20. import WikiNewPage from '@/pages/wiki/WikiNewPage'
  21. import WikiSearchPage from '@/pages/wiki/WikiSearchPage'
  22. import type { FC } from 'react'
  23. import type { User } from '@/types'
  24. const PostDetailRoute = ({ user }: { user: User | null }) => {
  25. const location = useLocation ()
  26. const key = location.pathname
  27. return <PostDetailPage key={key} user={user}/>
  28. }
  29. export default (() => {
  30. const [user, setUser] = useState<User | null> (null)
  31. const [status, setStatus] = useState (200)
  32. useEffect (() => {
  33. const createUser = async () => {
  34. const data = await apiPost<{ code: string; user: User }> ('/users')
  35. if (data.code)
  36. {
  37. localStorage.setItem ('user_code', data.code)
  38. setUser (data.user)
  39. }
  40. }
  41. const code = localStorage.getItem ('user_code')
  42. if (code)
  43. {
  44. void (async () => {
  45. try
  46. {
  47. const data = await apiPost<{ valid: boolean; user: User }> ('/users/verify', { code })
  48. if (data.valid)
  49. setUser (data.user)
  50. else
  51. await createUser ()
  52. }
  53. catch (err)
  54. {
  55. if (axios.isAxiosError (err))
  56. setStatus (err.status ?? 200)
  57. }
  58. }) ()
  59. }
  60. else
  61. createUser ()
  62. }, [])
  63. switch (status)
  64. {
  65. case 503:
  66. return <ServiceUnavailable/>
  67. }
  68. return (
  69. <>
  70. <RouteBlockerOverlay/>
  71. <BrowserRouter>
  72. <div className="flex flex-col h-screen w-screen">
  73. <TopNav user={user}/>
  74. <Routes>
  75. <Route path="/" element={<Navigate to="/posts" replace/>}/>
  76. <Route path="/posts" element={<PostListPage/>}/>
  77. <Route path="/posts/new" element={<PostNewPage user={user}/>}/>
  78. <Route path="/posts/:id" element={<PostDetailRoute user={user}/>}/>
  79. <Route path="/posts/changes" element={<PostHistoryPage/>}/>
  80. <Route path="/tags/nico" element={<NicoTagListPage user={user}/>}/>
  81. <Route path="/wiki" element={<WikiSearchPage/>}/>
  82. <Route path="/wiki/:title" element={<WikiDetailPage/>}/>
  83. <Route path="/wiki/new" element={<WikiNewPage user={user}/>}/>
  84. <Route path="/wiki/:id/edit" element={<WikiEditPage user={user}/>}/>
  85. <Route path="/wiki/:id/diff" element={<WikiDiffPage/>}/>
  86. <Route path="/wiki/changes" element={<WikiHistoryPage/>}/>
  87. <Route path="/users/settings" element={<SettingPage user={user} setUser={setUser}/>}/>
  88. <Route path="/settings" element={<Navigate to="/users/settings" replace/>}/>
  89. <Route path="*" element={<NotFound/>}/>
  90. </Routes>
  91. </div>
  92. <Toaster/>
  93. </BrowserRouter>
  94. </>)
  95. }) satisfies FC