@@ -13,6 +13,8 @@ import { NRFPaLevel } from '@/types/opendtu/settings';
1313
1414import ChangeEnumValueModal from '@/components/modals/ChangeEnumValueModal' ;
1515import ChangeTextValueModal from '@/components/modals/ChangeTextValueModal' ;
16+ import type { ConfirmUnsavedDataModalInput } from '@/components/modals/ConfirmUnsavedDataModal' ;
17+ import ConfirmUnsavedDataModal from '@/components/modals/ConfirmUnsavedDataModal' ;
1618import SettingsSurface from '@/components/styled/SettingsSurface' ;
1719
1820import useDtuSettings from '@/hooks/useDtuSettings' ;
@@ -66,11 +68,28 @@ const DtuSettingsScreen: FC<PropsWithNavigation> = ({ navigation }) => {
6668 const [ isRefreshing , setIsRefreshing ] = useState < boolean > ( false ) ;
6769 const [ isSaving , setIsSaving ] = useState < boolean > ( false ) ;
6870
69- const handleGetDtuSettings = useCallback ( async ( ) => {
70- setIsRefreshing ( true ) ;
71- await openDtuApi . getDtuConfig ( ) ;
72- setIsRefreshing ( false ) ;
73- } , [ openDtuApi ] ) ;
71+ const hasChanges = useMemo ( ( ) => {
72+ return ! deepEqual ( initialDtuSettings , dtuSettings ) ;
73+ } , [ initialDtuSettings , dtuSettings ] ) ;
74+
75+ const [ confirmRefreshDataModalOpen , setConfirmRefreshDataModalOpen ] =
76+ useState < ConfirmUnsavedDataModalInput > ( false ) ;
77+
78+ const performRefresh = useCallback (
79+ async ( forceRefresh : boolean = false ) => {
80+ if ( hasChanges && ! forceRefresh ) {
81+ setConfirmRefreshDataModalOpen ( ( ) => ( ) => {
82+ performRefresh ( true ) ;
83+ } ) ;
84+ return ;
85+ }
86+
87+ setIsRefreshing ( true ) ;
88+ await openDtuApi . getDtuConfig ( ) ;
89+ setIsRefreshing ( false ) ;
90+ } ,
91+ [ hasChanges , openDtuApi ] ,
92+ ) ;
7493
7594 const handleSave = useCallback ( async ( ) => {
7695 if ( ! dtuSettings ) {
@@ -95,13 +114,11 @@ const DtuSettingsScreen: FC<PropsWithNavigation> = ({ navigation }) => {
95114
96115 useEffect ( ( ) => {
97116 if ( navigation . isFocused ( ) ) {
98- handleGetDtuSettings ( ) ;
117+ performRefresh ( ) ;
99118 }
100- } , [ handleGetDtuSettings , navigation ] ) ;
101-
102- const hasChanges = useMemo ( ( ) => {
103- return ! deepEqual ( initialDtuSettings , dtuSettings ) ;
104- } , [ initialDtuSettings , dtuSettings ] ) ;
119+ // we do not want to include performRefresh here
120+ // eslint-disable-next-line react-hooks/exhaustive-deps
121+ } , [ navigation ] ) ;
105122
106123 const [ changeSerialModalOpen , setChangeSerialModalOpen ] = useState ( false ) ;
107124 const [ changePollIntervalModalOpen , setChangePollIntervalModalOpen ] =
@@ -148,7 +165,17 @@ const DtuSettingsScreen: FC<PropsWithNavigation> = ({ navigation }) => {
148165 return (
149166 < >
150167 < Appbar . Header >
151- < Appbar . BackAction onPress = { ( ) => navigation . goBack ( ) } />
168+ < Appbar . BackAction
169+ onPress = { ( ) => {
170+ if ( hasChanges ) {
171+ setConfirmRefreshDataModalOpen ( ( ) => ( ) => {
172+ navigation . goBack ( ) ;
173+ } ) ;
174+ return ;
175+ }
176+ navigation . goBack ( ) ;
177+ } }
178+ />
152179 < Appbar . Content title = { t ( 'settings.dtuSettings.title' ) } />
153180 { isSaving || hasChanges ? (
154181 < Appbar . Action
@@ -165,7 +192,7 @@ const DtuSettingsScreen: FC<PropsWithNavigation> = ({ navigation }) => {
165192 refreshControl = {
166193 < RefreshControl
167194 refreshing = { isRefreshing }
168- onRefresh = { handleGetDtuSettings }
195+ onRefresh = { performRefresh }
169196 colors = { [ theme . colors . primary ] }
170197 progressBackgroundColor = { theme . colors . elevation . level3 }
171198 tintColor = { theme . colors . primary }
@@ -501,6 +528,12 @@ const DtuSettingsScreen: FC<PropsWithNavigation> = ({ navigation }) => {
501528 return true ;
502529 } }
503530 />
531+ < ConfirmUnsavedDataModal
532+ visible = { confirmRefreshDataModalOpen }
533+ onDismiss = { ( ) => {
534+ setConfirmRefreshDataModalOpen ( false ) ;
535+ } }
536+ />
504537 </ >
505538 ) ;
506539} ;
0 commit comments