ぼざクリ タグ広場 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.
 
 
 
 
 
 

95 lines
3.2 KiB

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