Skip to content

Commit 9d9eee9

Browse files
committed
React disable dimensioning on losing focus
1 parent 5704558 commit 9d9eee9

File tree

1 file changed

+68
-5
lines changed

1 file changed

+68
-5
lines changed

React/ParcelMDClient/App.tsx

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
NativeModules,
1212
Dimensions,
1313
ScaledSize,
14+
AppState,
15+
AppStateStatus,
1416
} from 'react-native';
1517
import CheckBox from '@react-native-community/checkbox';
1618
import Toast from 'react-native-toast-message';
@@ -49,6 +51,7 @@ const App: React.FC = () => {
4951
const [widthStatus, setWidthStatus] = useState('');
5052
const [heightStatus, setHeightStatus] = useState('');
5153

54+
const isEnableCalled = useRef(false);
5255
const readyLength = useRef('');
5356
const readyWidth = useRef('');
5457
const readyHeight = useRef('');
@@ -57,20 +60,63 @@ const App: React.FC = () => {
5760
setIsLandscape(window.width > window.height);
5861
};
5962

63+
const ignoreOneBackgroundState = useRef(true);
64+
65+
useEffect(() => {
66+
const handleFocusChange = () => {
67+
if (!isEnableCalled.current) {
68+
ignoreOneBackgroundState.current = true;
69+
isEnableCalled.current = true;
70+
EnableDimension({ MODULE: ZebraMobileDimensioning.PARCEL_MODULE });
71+
}
72+
};
73+
const handleAppStateChange = (nextAppState: AppStateStatus) => {
74+
if (nextAppState === 'background') {
75+
if (ignoreOneBackgroundState.current)
76+
ignoreOneBackgroundState.current = false;
77+
else {
78+
ignoreOneBackgroundState.current = true;
79+
isEnableCalled.current = false;
80+
setIsDimensionEnabled(false);
81+
DisableDimension({});
82+
}
83+
}
84+
};
85+
86+
const appStateSubscription = AppState.addEventListener(
87+
'change',
88+
handleAppStateChange,
89+
);
90+
const focusSubscription = AppState.addEventListener(
91+
'focus',
92+
handleFocusChange,
93+
);
94+
95+
return () => {
96+
appStateSubscription.remove();
97+
focusSubscription.remove();
98+
};
99+
}, []);
100+
60101
useEffect(() => {
61-
const subscription = Dimensions.addEventListener('change', handleOrientationChange);
102+
const subscription = Dimensions.addEventListener(
103+
'change',
104+
handleOrientationChange,
105+
);
62106
handleOrientationChange({ window: Dimensions.get('window') });
63107
return () => {
64108
subscription?.remove();
65109
};
66110
}, []);
67111

68112
useEffect(() => {
113+
ignoreOneBackgroundState.current = true;
114+
isEnableCalled.current = true;
69115
EnableDimension({ MODULE: ZebraMobileDimensioning.PARCEL_MODULE });
70116

71117
const subscription = eventEmitter.addListener(
72118
ZebraMobileDimensioning.DIMENSIONING_EVENT,
73-
async (event) => {
119+
async event => {
74120
const action = event[ZebraMobileDimensioning.ACTION];
75121
const message = event[ZebraMobileDimensioning.RESULT_MESSAGE];
76122
const resultCode = event[ZebraMobileDimensioning.RESULT_CODE];
@@ -82,13 +128,15 @@ const App: React.FC = () => {
82128
// After enabling, call Get Parameters to update the UI
83129
if (resultCode === ZebraMobileDimensioning.SUCCESS) {
84130
setIsDimensionEnabled(true);
131+
ignoreOneBackgroundState.current = true;
85132
GetDimensionParameters({});
86133
} else {
87134
Toast.show({
88135
type: 'error',
89136
text1: 'Enable Dimension Failed',
90137
text2: message,
91138
});
139+
isEnableCalled.current = false;
92140
}
93141
break;
94142
case ZebraMobileDimensioning.INTENT_ACTION_DISABLE_DIMENSION:
@@ -103,6 +151,7 @@ const App: React.FC = () => {
103151
case ZebraMobileDimensioning.INTENT_ACTION_SET_DIMENSION_PARAMETER:
104152
// After setting parameters, call Get Parameters again to update the ready values
105153
if (resultCode === ZebraMobileDimensioning.SUCCESS) {
154+
ignoreOneBackgroundState.current = true;
106155
GetDimensionParameters({});
107156
} else {
108157
Toast.show({
@@ -163,7 +212,9 @@ const App: React.FC = () => {
163212
if (cacheImagePath) {
164213
try {
165214
// Save to gallery using CameraRoll
166-
const savedToGallery = await CameraRoll.saveAsset(cacheImagePath);
215+
const savedToGallery = await CameraRoll.saveAsset(
216+
cacheImagePath,
217+
);
167218
console.log('Image saved to Gallery:', savedToGallery);
168219
} catch (error) {
169220
console.error('Image storage failed', error);
@@ -184,6 +235,9 @@ const App: React.FC = () => {
184235
);
185236

186237
return () => {
238+
ignoreOneBackgroundState.current = true;
239+
isEnableCalled.current = false;
240+
setIsDimensionEnabled(false);
187241
DisableDimension({});
188242
subscription.remove();
189243
};
@@ -192,6 +246,7 @@ const App: React.FC = () => {
192246
useEffect(() => {
193247
if (!isInitialSetup) {
194248
const updateDimensionParameters = async () => {
249+
ignoreOneBackgroundState.current = true;
195250
await SetDimensionParameters({
196251
DIMENSIONING_UNIT: unit,
197252
REPORT_IMAGE: saveImage,
@@ -220,6 +275,7 @@ const App: React.FC = () => {
220275
};
221276

222277
const handleStartDimensioning = () => {
278+
ignoreOneBackgroundState.current = true;
223279
GetDimension({ OBJECT_ID: objectId });
224280
};
225281

@@ -282,7 +338,11 @@ const App: React.FC = () => {
282338
<Text style={styles.descriptionText}>
283339
Scan or type in your Object ID:
284340
</Text>
285-
<View style={isLandscape ? styles.landscapeObjectIdRow : styles.objectIdContainer}>
341+
<View
342+
style={
343+
isLandscape ? styles.landscapeObjectIdRow : styles.objectIdContainer
344+
}
345+
>
286346
<Text style={styles.objectIdLabel}>Object ID:</Text>
287347
<TextInput
288348
style={styles.objectIdInput}
@@ -291,7 +351,10 @@ const App: React.FC = () => {
291351
onChangeText={setObjectId}
292352
/>
293353
{isLandscape && (
294-
<TouchableOpacity onPress={handleScanBarcode} style={styles.landscapeScanButton}>
354+
<TouchableOpacity
355+
onPress={handleScanBarcode}
356+
style={styles.landscapeScanButton}
357+
>
295358
<Text style={styles.buttonText}>Scan Barcode</Text>
296359
</TouchableOpacity>
297360
)}

0 commit comments

Comments
 (0)