forked from Memmy-App/memmy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStart.tsx
123 lines (108 loc) · 3.62 KB
/
Start.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
import React, { useEffect, useRef, useState } from "react";
import { NativeBaseProvider } from "native-base";
import { ErrorBoundary } from "react-error-boundary";
import { StatusBar } from "expo-status-bar";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { ActionSheetProvider } from "@expo/react-native-action-sheet";
import { AppState } from "react-native";
import MemmyErrorView from "./components/ui/Loading/MemmyErrorView";
import Stack from "./Stack";
import { writeToLog } from "./helpers/LogHelper";
import { useAppDispatch, useAppSelector } from "./store";
import { loadSettings } from "./slices/settings/settingsActions";
import { loadAccounts } from "./slices/accounts/accountsActions";
import { selectAccountsLoaded } from "./slices/accounts/accountsSlice";
import { selectSettings } from "./slices/settings/settingsSlice";
import { brownTheme, darkTheme, lightTheme, purpleTheme } from "./theme/theme";
import { getUnreadCount } from "./slices/site/siteActions";
import { lemmyAuthToken, lemmyInstance } from "./lemmy/LemmyInstance";
const logError = (e, info) => {
writeToLog(e.toString());
writeToLog(
info && info.componentStack ? info.componentStack.toString() : "No stack."
);
};
function Start() {
const [loaded, setLoaded] = useState(false);
const dispatch = useAppDispatch();
const accountsLoaded = useAppSelector(selectAccountsLoaded);
const { theme } = useAppSelector(selectSettings);
const [selectedTheme, setSelectedTheme] = useState<any>(brownTheme);
const appState = useRef(AppState.currentState);
let refreshInterval;
useEffect(() => {
if (!loaded) return;
startInterval();
const subscription = AppState.addEventListener("change", (nextAppState) => {
if (
appState.current.match(/inactive|background/) &&
nextAppState === "active" &&
!refreshInterval
) {
writeToLog("Starting refresh interval.");
startInterval();
} else if (
appState.current === "active" &&
nextAppState.match(/inactive|background/)
) {
writeToLog("Ending refresh interval.");
clearInterval(refreshInterval);
refreshInterval = null;
}
appState.current = nextAppState;
});
return () => {
subscription.remove();
};
}, [loaded]);
const startInterval = () => {
console.log("starting an interval.");
refreshInterval = setInterval(() => {
console.log("Looking for updates...");
if (lemmyInstance && lemmyAuthToken) {
dispatch(getUnreadCount());
}
}, 30000);
};
useEffect(() => {
switch (theme) {
case "Light":
setSelectedTheme(lightTheme);
break;
case "Dark":
setSelectedTheme(darkTheme);
break;
case "Purple":
setSelectedTheme(purpleTheme);
break;
case "Brown":
setSelectedTheme(brownTheme);
break;
default:
setSelectedTheme(brownTheme);
break;
}
}, [theme]);
if (!loaded) {
dispatch(loadSettings());
dispatch(loadAccounts());
setLoaded(true);
}
if (!accountsLoaded) {
return null;
}
return (
<NativeBaseProvider theme={selectedTheme}>
<ErrorBoundary onError={logError} FallbackComponent={MemmyErrorView}>
{/* eslint-disable-next-line react/style-prop-object */}
<StatusBar style={theme === "Light" ? "dark" : "light"} />
<GestureHandlerRootView style={{ flex: 1 }}>
<ActionSheetProvider>
<Stack />
</ActionSheetProvider>
</GestureHandlerRootView>
</ErrorBoundary>
</NativeBaseProvider>
);
}
export default Start;