Skip to content

Commit 08b8a07

Browse files
Refactor RefreshControl into extra button
1 parent 134cd96 commit 08b8a07

File tree

3 files changed

+39
-48
lines changed

3 files changed

+39
-48
lines changed

src/components/Charts/ImportantCharts.tsx

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import type { FC } from 'react';
2-
import { useCallback } from 'react';
2+
import { useCallback, useEffect, useState } from 'react';
33
import { useTranslation } from 'react-i18next';
44
import { Box } from 'react-native-flex-layout';
5-
import { Icon, Text, TouchableRipple, useTheme } from 'react-native-paper';
5+
import {
6+
IconButton,
7+
Text,
8+
TouchableRipple,
9+
useTheme,
10+
} from 'react-native-paper';
611

712
import { View } from 'react-native';
813

@@ -11,6 +16,11 @@ import DcVoltageChart from '@/components/Charts/DcVoltageChart';
1116
import StyledSurface from '@/components/styled/StyledSurface';
1217

1318
import { spacing } from '@/constants';
19+
import {
20+
useDatabase,
21+
useDatabaseIsFetching,
22+
useRefreshDatabase,
23+
} from '@/database';
1424
import { useAppSelector } from '@/store';
1525

1626
import type { NavigationProp, ParamListBase } from '@react-navigation/native';
@@ -46,6 +56,25 @@ const ImportantCharts: FC = () => {
4656
navigation.navigate('ConfigureGraphsScreen');
4757
}, [navigation]);
4858

59+
const [isRefreshing, setIsRefreshing] = useState<boolean>(false);
60+
61+
const refreshing = useDatabaseIsFetching();
62+
const triggerRefresh = useRefreshDatabase();
63+
const database = useDatabase();
64+
65+
const handleRefresh = useCallback(() => {
66+
if (!database) return;
67+
68+
triggerRefresh?.();
69+
setIsRefreshing(true);
70+
}, [database, triggerRefresh]);
71+
72+
useEffect(() => {
73+
if (!refreshing) {
74+
setIsRefreshing(false);
75+
}
76+
}, [refreshing]);
77+
4978
if (!hasDatabaseConfig) {
5079
return (
5180
<Box p={8} mt={4}>
@@ -95,9 +124,11 @@ const ImportantCharts: FC = () => {
95124
{t('livedata.changeTimerangeAndRefreshInterval')}
96125
</Text>
97126
</View>
98-
<View>
99-
<Icon size={20} source="chevron-right" />
100-
</View>
127+
<IconButton
128+
icon="reload"
129+
onPress={handleRefresh}
130+
loading={isRefreshing}
131+
/>
101132
</View>
102133
</TouchableRipple>
103134
</StyledSurface>

src/views/navigation/NavigationTabs.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const renderScene = BottomNavigationPaper.SceneMap({
3030
settings: SettingsRoute,
3131
});
3232

33-
const BottomNavigation: FC = () => {
33+
const NavigationTabs: FC = () => {
3434
const theme = useTheme();
3535
const { t } = useTranslation();
3636
const [index, setIndex] = useState<number>(0);
@@ -80,4 +80,4 @@ const BottomNavigation: FC = () => {
8080
);
8181
};
8282

83-
export default BottomNavigation;
83+
export default NavigationTabs;

src/views/navigation/tabs/GraphTab.tsx

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,17 @@
1-
import { useCallback, useEffect, useState } from 'react';
21
import { useTheme } from 'react-native-paper';
32

4-
import { RefreshControl } from 'react-native';
5-
63
import ImportantCharts from '@/components/Charts/ImportantCharts';
74
import DeviceOfflineWrapper from '@/components/DeviceOfflineWrapper';
85

9-
import {
10-
useDatabase,
11-
useDatabaseIsFetching,
12-
useRefreshDatabase,
13-
} from '@/database';
146
import { StyledSafeAreaView, StyledScrollView } from '@/style';
157

168
const LivedataTab = () => {
179
const theme = useTheme();
1810

19-
const [isRefreshing, setIsRefreshing] = useState<boolean>(false);
20-
21-
const refreshing = useDatabaseIsFetching();
22-
const triggerRefresh = useRefreshDatabase();
23-
const database = useDatabase();
24-
25-
const handleRefresh = useCallback(() => {
26-
if (!database) return;
27-
28-
triggerRefresh?.();
29-
setIsRefreshing(true);
30-
}, [database, triggerRefresh]);
31-
32-
useEffect(() => {
33-
if (!refreshing) {
34-
setIsRefreshing(false);
35-
}
36-
}, [refreshing]);
37-
3811
return (
3912
<StyledSafeAreaView theme={theme}>
4013
<DeviceOfflineWrapper>
41-
<StyledScrollView
42-
theme={theme}
43-
refreshControl={
44-
database ? (
45-
<RefreshControl
46-
refreshing={isRefreshing}
47-
onRefresh={handleRefresh}
48-
colors={[theme.colors.primary]}
49-
progressBackgroundColor={theme.colors.elevation.level3}
50-
tintColor={theme.colors.primary}
51-
/>
52-
) : undefined
53-
}
54-
>
14+
<StyledScrollView theme={theme}>
5515
<ImportantCharts />
5616
</StyledScrollView>
5717
</DeviceOfflineWrapper>

0 commit comments

Comments
 (0)