Write on the margins of the internet. Powered by the AT Protocol.
margin.at
extension
web
atproto
comments
1import React from "react";
2import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
3import { initAuth, $user } from "./store/auth";
4import { loadPreferences } from "./store/preferences";
5import { useStore } from "@nanostores/react";
6
7import AppLayout from "./layouts/AppLayout";
8import Feed from "./views/core/Feed";
9import Login from "./views/auth/Login";
10import Notifications from "./views/core/Notifications";
11import Collections from "./views/collections/Collections";
12import Settings from "./views/core/Settings";
13import NewAnnotationPage from "./views/core/New";
14import MasonryFeed from "./components/feed/MasonryFeed";
15import {
16 ProfileWrapper,
17 SelfProfileWrapper,
18 CollectionDetailWrapper,
19 AnnotationDetailWrapper,
20 UserUrlWrapper,
21 UrlWrapper,
22} from "./routes/wrappers";
23import About from "./views/About";
24import AdminModeration from "./views/core/AdminModeration";
25import Search from "./views/core/Search";
26import Discover from "./views/core/Discover";
27
28function RootRoute() {
29 const user = useStore($user);
30
31 if (user) {
32 return <Navigate to="/home" replace />;
33 }
34
35 return <About />;
36}
37
38export default function App() {
39 React.useEffect(() => {
40 initAuth();
41 loadPreferences();
42 }, []);
43
44 return (
45 <BrowserRouter>
46 <Routes>
47 <Route path="/" element={<RootRoute />} />
48 <Route path="/login" element={<Login />} />
49 <Route path="/about" element={<About />} />
50 <Route path="/auth/*" element={<div>Redirecting...</div>} />
51
52 <Route
53 path="/home"
54 element={
55 <AppLayout>
56 <Feed initialType="all" />
57 </AppLayout>
58 }
59 />
60 <Route path="/my-feed" element={<Navigate to="/home" replace />} />
61
62 <Route
63 path="/search"
64 element={
65 <AppLayout>
66 <Search />
67 </AppLayout>
68 }
69 />
70
71 <Route
72 path="/discover"
73 element={
74 <AppLayout>
75 <Discover />
76 </AppLayout>
77 }
78 />
79
80 <Route
81 path="/annotations"
82 element={
83 <AppLayout>
84 <MasonryFeed
85 motivation="commenting"
86 emptyMessage="You haven't annotated anything yet."
87 showTabs={true}
88 title="Annotations"
89 />
90 </AppLayout>
91 }
92 />
93 <Route
94 path="/bookmarks"
95 element={
96 <AppLayout>
97 <MasonryFeed
98 motivation="bookmarking"
99 emptyMessage="You haven't bookmarked anything yet."
100 showTabs={true}
101 title="Bookmarks"
102 />
103 </AppLayout>
104 }
105 />
106 <Route
107 path="/highlights"
108 element={
109 <AppLayout>
110 <MasonryFeed
111 motivation="highlighting"
112 emptyMessage="You haven't highlighted anything yet."
113 showTabs={true}
114 title="Highlights"
115 />
116 </AppLayout>
117 }
118 />
119
120 <Route
121 path="/collections"
122 element={
123 <AppLayout>
124 <Collections />
125 </AppLayout>
126 }
127 />
128 <Route
129 path="/:handle/collection/:rkey"
130 element={
131 <AppLayout>
132 <CollectionDetailWrapper />
133 </AppLayout>
134 }
135 />
136 <Route
137 path="/collections/:rkey"
138 element={
139 <AppLayout>
140 <CollectionDetailWrapper />
141 </AppLayout>
142 }
143 />
144
145 <Route
146 path="/profile/:did"
147 element={
148 <AppLayout>
149 <ProfileWrapper />
150 </AppLayout>
151 }
152 />
153 <Route
154 path="/profile"
155 element={
156 <AppLayout>
157 <SelfProfileWrapper />
158 </AppLayout>
159 }
160 />
161
162 <Route
163 path="/new"
164 element={
165 <AppLayout>
166 <NewAnnotationPage />
167 </AppLayout>
168 }
169 />
170 <Route
171 path="/at/:did/:rkey"
172 element={
173 <AppLayout>
174 <AnnotationDetailWrapper />
175 </AppLayout>
176 }
177 />
178 <Route
179 path="/annotation/:uri"
180 element={
181 <AppLayout>
182 <AnnotationDetailWrapper />
183 </AppLayout>
184 }
185 />
186 <Route
187 path="/:handle/annotation/:rkey"
188 element={
189 <AppLayout>
190 <AnnotationDetailWrapper />
191 </AppLayout>
192 }
193 />
194 <Route
195 path="/:handle/highlight/:rkey"
196 element={
197 <AppLayout>
198 <AnnotationDetailWrapper />
199 </AppLayout>
200 }
201 />
202 <Route
203 path="/:handle/bookmark/:rkey"
204 element={
205 <AppLayout>
206 <AnnotationDetailWrapper />
207 </AppLayout>
208 }
209 />
210 <Route
211 path="/:handle/url/*"
212 element={
213 <AppLayout>
214 <UserUrlWrapper />
215 </AppLayout>
216 }
217 />
218 <Route
219 path="/url/*"
220 element={
221 <AppLayout>
222 <UrlWrapper />
223 </AppLayout>
224 }
225 />
226
227 <Route
228 path="/admin/moderation"
229 element={
230 <AppLayout>
231 <AdminModeration />
232 </AppLayout>
233 }
234 />
235
236 <Route
237 path="/settings"
238 element={
239 <AppLayout>
240 <Settings />
241 </AppLayout>
242 }
243 />
244 <Route
245 path="/notifications"
246 element={
247 <AppLayout>
248 <Notifications />
249 </AppLayout>
250 }
251 />
252
253 <Route path="*" element={<Navigate to="/home" replace />} />
254 </Routes>
255 </BrowserRouter>
256 );
257}