Skip to content

Commit c6feaa4

Browse files
authored
Merge pull request #80748 from software-mansion-labs/@GCyganek/gps/check-gps-state-when-switching-to-od
Warn about ongoing GPS trip when switching to OD
2 parents f9ff25e + 13dd9e8 commit c6feaa4

File tree

28 files changed

+187
-76
lines changed

28 files changed

+187
-76
lines changed

src/ONYXKEYS.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ const ONYXKEYS = {
5252
/** Keeps track if OpenApp failure modal is opened */
5353
IS_OPEN_APP_FAILURE_MODAL_OPEN: 'isOpenAppFailureModalOpen',
5454

55+
/** Keeps track if 'GPS in progress' modal is opened */
56+
IS_GPS_IN_PROGRESS_MODAL_OPEN: 'isGpsInProgressModalOpen',
57+
5558
/** Stores the PIN for an activated UK/EU Expensify card to be shown once after activation */
5659
ACTIVATED_CARD_PIN: 'activatedCardPin',
5760

@@ -1220,6 +1223,7 @@ type OnyxValuesMapping = {
12201223
[ONYXKEYS.STASHED_CREDENTIALS]: OnyxTypes.Credentials;
12211224
[ONYXKEYS.MODAL]: OnyxTypes.Modal;
12221225
[ONYXKEYS.IS_OPEN_APP_FAILURE_MODAL_OPEN]: boolean;
1226+
[ONYXKEYS.IS_GPS_IN_PROGRESS_MODAL_OPEN]: boolean;
12231227
[ONYXKEYS.GPS_DRAFT_DETAILS]: OnyxTypes.GpsDraftDetails;
12241228
[ONYXKEYS.FULLSCREEN_VISIBILITY]: boolean;
12251229
[ONYXKEYS.NETWORK]: OnyxTypes.Network;

src/components/ConfirmNavigateExpensifyClassicModal/BaseConfirmNavigateExpensifyClassicModal.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useCallback} from 'react';
1+
import React from 'react';
22
import ConfirmModal from '@components/ConfirmModal';
33
import useLocalize from '@hooks/useLocalize';
44
import useOnyx from '@hooks/useOnyx';
@@ -8,23 +8,25 @@ import {openOldDotLink} from '@libs/actions/Link';
88
import CONFIG from '@src/CONFIG';
99
import CONST from '@src/CONST';
1010
import ONYXKEYS from '@src/ONYXKEYS';
11+
import {isTrackingSelector} from '@src/selectors/GPSDraftDetails';
1112

1213
function BaseConfirmNavigateExpensifyClassicModal() {
1314
const [isOpenAppConfirmNavigateExpensifyClassicModalOpen = false] = useOnyx(ONYXKEYS.IS_OPEN_CONFIRM_NAVIGATE_EXPENSIFY_CLASSIC_MODAL_OPEN, {canBeMissing: true});
15+
const [isTrackingGPS = false] = useOnyx(ONYXKEYS.GPS_DRAFT_DETAILS, {canBeMissing: true, selector: isTrackingSelector});
1416
const {translate} = useLocalize();
1517

16-
const handleConfirm = useCallback(() => {
18+
const handleConfirm = () => {
1719
setIsOpenConfirmNavigateExpensifyClassicModalOpen(false);
1820
if (CONFIG.IS_HYBRID_APP) {
19-
closeReactNativeApp({shouldSetNVP: true});
21+
closeReactNativeApp({shouldSetNVP: true, isTrackingGPS});
2022
return;
2123
}
2224
openOldDotLink(CONST.OLDDOT_URLS.INBOX);
23-
}, []);
25+
};
2426

25-
const handleCancel = useCallback(() => {
27+
const handleCancel = () => {
2628
setIsOpenConfirmNavigateExpensifyClassicModalOpen(false);
27-
}, []);
29+
};
2830

2931
return (
3032
<ConfirmModal
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import ConfirmModal from '@components/ConfirmModal';
2+
import useLocalize from '@hooks/useLocalize';
3+
import useOnyx from '@hooks/useOnyx';
4+
import {closeReactNativeApp} from '@libs/actions/HybridApp';
5+
import {setIsGPSInProgressModalOpen} from '@libs/actions/isGPSInProgressModalOpen';
6+
import {stopGpsTrip} from '@libs/GPSDraftDetailsUtils';
7+
import ONYXKEYS from '@src/ONYXKEYS';
8+
9+
function GPSInProgressModal() {
10+
const [isGPSInProgressModalOpen] = useOnyx(ONYXKEYS.IS_GPS_IN_PROGRESS_MODAL_OPEN, {canBeMissing: true});
11+
const {translate} = useLocalize();
12+
13+
const stopGpsAndSwitchToOD = async () => {
14+
setIsGPSInProgressModalOpen(false);
15+
await stopGpsTrip();
16+
closeReactNativeApp({shouldSetNVP: true, isTrackingGPS: false});
17+
};
18+
19+
return (
20+
<ConfirmModal
21+
title={translate('gps.switchToODWarningTripInProgress.title')}
22+
isVisible={!!isGPSInProgressModalOpen}
23+
onCancel={() => setIsGPSInProgressModalOpen(false)}
24+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
25+
onConfirm={stopGpsAndSwitchToOD}
26+
confirmText={translate('gps.switchToODWarningTripInProgress.confirm')}
27+
cancelText={translate('common.cancel')}
28+
prompt={translate('gps.switchToODWarningTripInProgress.prompt')}
29+
danger
30+
/>
31+
);
32+
}
33+
34+
GPSInProgressModal.displayName = 'GPSInProgressModal';
35+
36+
export default GPSInProgressModal;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// GPS is not available on web
2+
function GPSInProgressModal() {
3+
return null;
4+
}
5+
6+
GPSInProgressModal.displayName = 'GPSInProgressModal';
7+
8+
export default GPSInProgressModal;

src/components/GPSTripStateChecker/index.native.tsx

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import OnyxUtils from 'react-native-onyx/dist/OnyxUtils';
44
import ConfirmModal from '@components/ConfirmModal';
55
import useLocalize from '@hooks/useLocalize';
66
import useOnyx from '@hooks/useOnyx';
7-
import {setEndAddress, setIsTracking} from '@libs/actions/GPSDraftDetails';
8-
import {addressFromGpsPoint, coordinatesToString} from '@libs/GPSDraftDetailsUtils';
7+
import {stopGpsTrip} from '@libs/GPSDraftDetailsUtils';
98
import Navigation from '@libs/Navigation/Navigation';
109
import {generateReportID} from '@libs/ReportUtils';
1110
import {BACKGROUND_LOCATION_TRACKING_TASK_NAME, getBackgroundLocationTaskOptions} from '@pages/iou/request/step/IOURequestStepDistanceGPS/const';
@@ -65,28 +64,6 @@ function GPSTripStateChecker() {
6564
);
6665
};
6766

68-
const stopGpsTrip = async () => {
69-
setIsTracking(false);
70-
71-
const gpsTrip = await OnyxUtils.get(ONYXKEYS.GPS_DRAFT_DETAILS);
72-
73-
const lastPoint = gpsTrip?.gpsPoints?.at(-1);
74-
75-
if (!lastPoint) {
76-
return;
77-
}
78-
79-
const endAddress = await addressFromGpsPoint(lastPoint);
80-
81-
if (endAddress === null) {
82-
const formattedCoordinates = coordinatesToString(lastPoint);
83-
setEndAddress({value: formattedCoordinates, type: 'coordinates'});
84-
return;
85-
}
86-
87-
setEndAddress({value: endAddress, type: 'address'});
88-
};
89-
9067
const onContinueTrip = () => {
9168
setShowContinueTripModal(false);
9269
continueGpsTrip();

src/components/ScreenWrapper/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ function ScreenWrapper({
174174
if (!CONFIG.IS_HYBRID_APP) {
175175
return;
176176
}
177-
closeReactNativeApp({shouldSetNVP: false});
177+
closeReactNativeApp({shouldSetNVP: false, isTrackingGPS: false});
178178
});
179179

180180
useEffect(() => {

src/languages/de.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7637,6 +7637,11 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
76377637
prompt: 'Bist du sicher, dass du die Reise verwerfen und dich abmelden möchtest?',
76387638
confirm: 'Verwerfen und abmelden',
76397639
},
7640+
switchToODWarningTripInProgress: {
7641+
title: 'GPS-Tracking läuft',
7642+
prompt: 'Sind Sie sicher, dass Sie die GPS-Verfolgung beenden und zu Expensify Classic wechseln möchten?',
7643+
confirm: 'Anhalten und wechseln',
7644+
},
76407645
locationServicesRequiredModal: {
76417646
title: 'Standortzugriff erforderlich',
76427647
confirm: 'Einstellungen öffnen',

src/languages/en.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7575,6 +7575,11 @@ const translations = {
75757575
prompt: 'Are you sure you want to discard the trip and sign out?',
75767576
confirm: 'Discard and sign out',
75777577
},
7578+
switchToODWarningTripInProgress: {
7579+
title: 'GPS tracking in progress',
7580+
prompt: 'Are you sure you want to stop GPS tracking and switch to Expensify Classic?',
7581+
confirm: 'Stop and switch',
7582+
},
75787583
locationServicesRequiredModal: {
75797584
title: 'Location access required',
75807585
confirm: 'Open settings',

src/languages/es.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8626,6 +8626,11 @@ ${amount} para ${merchant} - ${date}`,
86268626
prompt: '¿Seguro que quieres descartar el viaje y cerrar sesión?',
86278627
confirm: 'Descartar y cerrar sesión',
86288628
},
8629+
switchToODWarningTripInProgress: {
8630+
title: 'Seguimiento por GPS en curso',
8631+
prompt: '¿Seguro que quieres detener el seguimiento por GPS y cambiar a Expensify Classic?',
8632+
confirm: 'Detener y cambiar',
8633+
},
86298634
locationServicesRequiredModal: {
86308635
title: 'Se requiere acceso a la ubicación',
86318636
confirm: 'Abrir ajustes',

src/languages/fr.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7651,6 +7651,11 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
76517651
prompt: 'Voulez-vous vraiment abandonner le voyage et vous déconnecter ?',
76527652
confirm: 'Ignorer et se déconnecter',
76537653
},
7654+
switchToODWarningTripInProgress: {
7655+
title: 'Suivi GPS en cours',
7656+
prompt: 'Voulez-vous vraiment arrêter le suivi GPS et passer à Expensify Classic ?',
7657+
confirm: 'Arrêter et changer',
7658+
},
76547659
locationServicesRequiredModal: {
76557660
title: 'Accès à la localisation requis',
76567661
confirm: 'Ouvrir les paramètres',

0 commit comments

Comments
 (0)