-
Notifications
You must be signed in to change notification settings - Fork 285
Expand file tree
/
Copy pathApp.tsx
More file actions
119 lines (106 loc) · 3.57 KB
/
App.tsx
File metadata and controls
119 lines (106 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import {
Navigate,
Route,
HashRouter as Router,
Routes,
useLocation,
} from 'react-router-dom';
import { BaseStyles, ThemeProvider } from '@primer/react';
import './App.css';
import { useEffect } from 'react';
import { QueryClientProvider } from '@tanstack/react-query';
import { AppProvider } from './context/App';
import { AccountsRoute } from './routes/Accounts';
import { FiltersRoute } from './routes/Filters';
import { LoginRoute } from './routes/Login';
import { LoginWithDeviceFlowRoute } from './routes/LoginWithDeviceFlow';
import { LoginWithOAuthAppRoute } from './routes/LoginWithOAuthApp';
import { LoginWithPersonalAccessTokenRoute } from './routes/LoginWithPersonalAccessToken';
import { NotificationsRoute } from './routes/Notifications';
import { SettingsRoute } from './routes/Settings';
import { useAccountsStore } from './stores';
import { initializeStoreSubscriptions } from './stores/subscriptions';
import { GlobalShortcuts } from './components/GlobalShortcuts';
import { AppLayout } from './components/layout/AppLayout';
import { queryClient } from './utils/api/client';
import { migrateLegacyStoreToZustand } from './utils/storage';
// Run migration from legacy local storage to Zustand stores (async)
migrateLegacyStoreToZustand();
function RequireAuth({ children }) {
const location = useLocation();
const isLoggedIn = useAccountsStore((s) => s.isLoggedIn());
return isLoggedIn ? (
children
) : (
<Navigate replace state={{ from: location }} to="/login" />
);
}
export const App = () => {
// Initialize store subscriptions with proper cleanup
useEffect(() => {
const cleanup = initializeStoreSubscriptions();
return cleanup;
}, []);
return (
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<BaseStyles>
<AppProvider>
<Router>
<GlobalShortcuts />
<AppLayout>
<Routes>
<Route
element={
<RequireAuth>
<NotificationsRoute />
</RequireAuth>
}
path="/"
/>
<Route
element={
<RequireAuth>
<FiltersRoute />
</RequireAuth>
}
path="/filters"
/>
<Route
element={
<RequireAuth>
<SettingsRoute />
</RequireAuth>
}
path="/settings"
/>
<Route
element={
<RequireAuth>
<AccountsRoute />
</RequireAuth>
}
path="/accounts"
/>
<Route element={<LoginRoute />} path="/login" />
<Route
element={<LoginWithDeviceFlowRoute />}
path="/login-device-flow"
/>
<Route
element={<LoginWithPersonalAccessTokenRoute />}
path="/login-personal-access-token"
/>
<Route
element={<LoginWithOAuthAppRoute />}
path="/login-oauth-app"
/>
</Routes>
</AppLayout>
</Router>
</AppProvider>
</BaseStyles>
</ThemeProvider>
</QueryClientProvider>
);
};