-
Notifications
You must be signed in to change notification settings - Fork 2
/
App.tsx
153 lines (141 loc) · 7.56 KB
/
App.tsx
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
* Tricordarr Secondary Entrypoint.
* index.js is still the start. The good stuff goes here.
*/
import React, {useEffect} from 'react';
import {LogBox} from 'react-native';
import {Portal} from 'react-native-paper';
import TimeAgo from 'javascript-time-ago';
import en from 'javascript-time-ago/locale/en.json';
import {setupChannels} from './src/libraries/Notifications/Channels';
import {configureAxios} from './src/libraries/Network/APIClient';
import {UserNotificationDataProvider} from './src/components/Context/Providers/UserNotificationDataProvider';
import {UserDataProvider} from './src/components/Context/Providers/UserDataProvider';
import {setupInitialNotification} from './src/libraries/Notifications/InitialNotification';
import {ErrorHandlerProvider} from './src/components/Context/Providers/ErrorHandlerProvider';
import {ForegroundService} from './src/components/Libraries/Notifications/ForegroundService';
import {NotificationDataListener} from './src/components/Libraries/Notifications/NotificationDataListener';
import {StyleProvider} from './src/components/Context/Providers/StyleProvider';
import {ModalProvider} from './src/components/Context/Providers/ModalProvider';
import {UserRelationsProvider} from './src/components/Context/Providers/UserRelationsProvider';
import {TwitarrProvider} from './src/components/Context/Providers/TwitarrProvider';
import {PrivilegeProvider} from './src/components/Context/Providers/PrivilegeProvider';
import {SocketProvider} from './src/components/Context/Providers/SocketProvider';
import {AppEventHandler} from './src/components/Navigation/AppEventHandler';
import {AuthProvider} from './src/components/Context/Providers/AuthProvider';
import {ConfigProvider} from './src/components/Context/Providers/ConfigProvider';
import {registerFgsWorker} from './src/libraries/Service';
import {RootStackNavigator} from './src/components/Navigation/Stacks/RootStackNavigator';
import {DrawerProvider} from './src/components/Context/Providers/DrawerProvider';
import {HeaderButtonsProvider} from 'react-navigation-header-buttons';
import {CruiseProvider} from './src/components/Context/Providers/CruiseProvider';
import {FilterProvider} from './src/components/Context/Providers/FilterProvider';
import {registerTranslation, en as paperEn} from 'react-native-paper-dates';
import {FeatureProvider} from './src/components/Context/Providers/FeatureProvider';
import {NotificationDataPoller} from './src/components/Libraries/Notifications/NotificationDataPoller';
// https://reactnavigation.org/docs/drawer-layout/
import 'react-native-gesture-handler';
// https://github.com/facebook/react-native/issues/30034
// https://phab.comm.dev/D6193
// react-native has an issue with inverted lists on Android, and it got worse
// with Android 13. To avoid it we patch a react-native style, but that style
// got deprecated in React Native 0.70. For now the deprecation is limited to a
// JS runtime check, which we disable here.
// @ts-ignore
import ViewReactNativeStyleAttributes from 'react-native/Libraries/Components/View/ReactNativeStyleAttributes';
import {SwiftarrQueryClientProvider} from './src/components/Context/Providers/SwiftarrQueryClientProvider';
import {LoadingProvider} from './src/components/Context/Providers/LoadingProvider';
import {AppNavigationThemeProvider} from './src/components/Context/Providers/AppNavigationThemeProvider.tsx';
import {GestureHandlerRootView} from 'react-native-gesture-handler';
import {CriticalErrorProvider} from './src/components/Context/Providers/CriticalErrorProvider.tsx';
import {SelectionProvider} from './src/components/Context/Providers/SelectionProvider.tsx';
import {configureImageCache} from './src/libraries/Storage/ImageStorage.ts';
ViewReactNativeStyleAttributes.scaleY = true;
// For development, disable warning popups because I already respond to them.
if (__DEV__) {
LogBox.ignoreLogs(['AxiosError', 'Websockets.ts']);
}
console.log('[App.tsx] Tricordarr start!');
// Time and locale setup, used in various places within the app.
TimeAgo.addDefaultLocale(en);
registerTranslation('en', paperEn);
// Configure network interceptors
configureAxios();
// Declare what the Foreground Service worker function should be.
registerFgsWorker();
// Set up image caching
configureImageCache();
function App(): React.JSX.Element {
setupChannels().catch(error => {
console.error('Error setting up notification channels:', error);
});
useEffect(() => {
console.log('[App.tsx] Calling useEffect from Main App.');
setupInitialNotification().catch(console.error);
}, []);
/**
* Known Dependencies:
* These were of course not determined when I did the big refactor around LFGs/Forums
* when it would have been useful...
*
* ModalProvider needs UserRelationsProvider for blocks/mutes/favorites to mutate successfully.
* SwiftarrQueryClientProvider needs ConfigProvider for cache busting.
* StyleProvider needs PaperProvider for theming.
* LoadingProvider needs SwiftarrQueryClientProvider for useIsRestoring.
* SwiftarrQueryClientProvider requires ErrorHandlerProvider for global error callback
*/
return (
<GestureHandlerRootView>
<ConfigProvider>
<AppNavigationThemeProvider>
<StyleProvider>
<ErrorHandlerProvider>
<SwiftarrQueryClientProvider>
<LoadingProvider>
<AuthProvider>
<CriticalErrorProvider>
<UserDataProvider>
<PrivilegeProvider>
<SocketProvider>
<TwitarrProvider>
<UserRelationsProvider>
<UserNotificationDataProvider>
<FeatureProvider>
<ModalProvider>
<Portal.Host>
<HeaderButtonsProvider stackType={'native'}>
<CruiseProvider>
<DrawerProvider>
<FilterProvider>
<SelectionProvider>
<AppEventHandler />
<ForegroundService />
<NotificationDataListener />
<NotificationDataPoller />
<RootStackNavigator />
</SelectionProvider>
</FilterProvider>
</DrawerProvider>
</CruiseProvider>
</HeaderButtonsProvider>
</Portal.Host>
</ModalProvider>
</FeatureProvider>
</UserNotificationDataProvider>
</UserRelationsProvider>
</TwitarrProvider>
</SocketProvider>
</PrivilegeProvider>
</UserDataProvider>
</CriticalErrorProvider>
</AuthProvider>
</LoadingProvider>
</SwiftarrQueryClientProvider>
</ErrorHandlerProvider>
</StyleProvider>
</AppNavigationThemeProvider>
</ConfigProvider>
</GestureHandlerRootView>
);
}
export default App;