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

96 lines
3.2 KiB

  1. import React, { useEffect, useState } from 'react'
  2. import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom'
  3. import HomePage from './pages/HomePage'
  4. import TagPage from './pages/TagPage'
  5. import TopNav from './components/TopNav'
  6. import TagSidebar from './components/TagSidebar'
  7. import PostPage from './pages/PostPage'
  8. import PostNewPage from './pages/PostNewPage'
  9. import PostDetailPage from './pages/PostDetailPage'
  10. import WikiShowPage from './pages/WikiShowPage'
  11. import { API_BASE_URL } from './config'
  12. import axios from 'axios'
  13. import { Toaster } from '@/components/ui/toaster'
  14. import { camelizeKeys } from 'humps'
  15. type Tag = { id: number
  16. name: string
  17. category: string }
  18. type Post = { id: number
  19. url: string
  20. title: string
  21. thumbnail: string
  22. tags: Tag[]
  23. viewed: boolean }
  24. type User = { id: number
  25. name: string | null
  26. inheritanceCode: string
  27. role: string }
  28. const App = () => {
  29. const [posts, setPosts] = useState<Post[]> ([])
  30. const [user, setUser] = useState<User | null> (null)
  31. useEffect (() => {
  32. const createUser = () => (
  33. axios.post (`${ API_BASE_URL }/users`)
  34. .then (res => {
  35. if (res.data.code)
  36. {
  37. localStorage.setItem ('user_code', res.data.code)
  38. setUser (camelizeKeys (res.data.user))
  39. }
  40. }))
  41. const code = localStorage.getItem ('user_code')
  42. if (code)
  43. {
  44. void (axios.post (`${ API_BASE_URL }/users/verify`, { code })
  45. .then (res => {
  46. if (res.data.valid)
  47. setUser (camelizeKeys (res.data.user))
  48. else
  49. createUser ()
  50. }))
  51. }
  52. else
  53. createUser ()
  54. alert ('このサイトはまだ作りかけです!!!!\n出てけ!!!!!!!!!!!!!!!!!!!!')
  55. }, [])
  56. return (
  57. <>
  58. <Router>
  59. <div className="flex flex-col h-screen w-screen">
  60. <TopNav user={user} setUser={setUser} />
  61. <div className="flex flex-1">
  62. <Routes>
  63. <Route path="/posts/new" />
  64. <Route path="/posts" element={<TagSidebar posts={posts} setPosts={setPosts} />} />
  65. <Route path="/posts/:id" element={<TagSidebar posts={posts} setPosts={setPosts} />} />
  66. </Routes>
  67. <main className="flex-1 overflow-y-auto p-4">
  68. <Routes>
  69. <Route path="/" element={<Navigate to="/posts" replace />} />
  70. <Route path="/posts" element={<PostPage posts={posts} setPosts={setPosts} />} />
  71. <Route path="/posts/new" element={<PostNewPage />} />
  72. <Route path="/posts/:id" element={<PostDetailPage posts={posts} setPosts={setPosts} />} />
  73. <Route path="/tags/:tag" element={<TagPage />} />
  74. <Route path="/wiki/:name" element={<WikiShowPage />} />
  75. </Routes>
  76. </main>
  77. </div>
  78. </div>
  79. </Router>
  80. <Toaster />
  81. </>)
  82. }
  83. export default App