Fix navigation: add isNavigatingAway flag to prevent redirect conflicts

- Added isNavigatingAway state to block auto-redirects when user clicks back
- Both header back button and main button now set this flag before navigating
- Prevents loadBeneficiary from triggering competing redirects

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Sergei 2026-01-09 19:52:39 -08:00
parent c2c6a52b31
commit 62f70853cb

View File

@ -91,9 +91,10 @@ export default function EquipmentStatusScreen() {
const [isRefreshing, setIsRefreshing] = useState(false); const [isRefreshing, setIsRefreshing] = useState(false);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const [isConfirming, setIsConfirming] = useState(false); const [isConfirming, setIsConfirming] = useState(false);
const [isNavigatingAway, setIsNavigatingAway] = useState(false);
const loadBeneficiary = useCallback(async () => { const loadBeneficiary = useCallback(async () => {
if (!id) return; if (!id || isNavigatingAway) return;
if (!isRefreshing) { if (!isRefreshing) {
setIsLoading(true); setIsLoading(true);
@ -105,6 +106,9 @@ export default function EquipmentStatusScreen() {
if (response.ok && response.data) { if (response.ok && response.data) {
setBeneficiary(response.data); setBeneficiary(response.data);
// Skip auto-redirects if user is navigating away
if (isNavigatingAway) return;
// Self-guard: Redirect if user has devices - shouldn't be on this page // Self-guard: Redirect if user has devices - shouldn't be on this page
if (hasBeneficiaryDevices(response.data)) { if (hasBeneficiaryDevices(response.data)) {
router.replace(`/(tabs)/beneficiaries/${id}`); router.replace(`/(tabs)/beneficiaries/${id}`);
@ -126,7 +130,7 @@ export default function EquipmentStatusScreen() {
setIsLoading(false); setIsLoading(false);
setIsRefreshing(false); setIsRefreshing(false);
} }
}, [id, isRefreshing]); }, [id, isRefreshing, isNavigatingAway]);
useEffect(() => { useEffect(() => {
loadBeneficiary(); loadBeneficiary();
@ -193,7 +197,10 @@ export default function EquipmentStatusScreen() {
<SafeAreaView style={styles.container} edges={['top', 'bottom']}> <SafeAreaView style={styles.container} edges={['top', 'bottom']}>
{/* Header */} {/* Header */}
<View style={styles.header}> <View style={styles.header}>
<TouchableOpacity style={styles.backButton} onPress={() => router.push('/(tabs)/beneficiaries')}> <TouchableOpacity style={styles.backButton} onPress={() => {
setIsNavigatingAway(true);
router.replace('/(tabs)/beneficiaries');
}}>
<Ionicons name="arrow-back" size={24} color={AppColors.textPrimary} /> <Ionicons name="arrow-back" size={24} color={AppColors.textPrimary} />
</TouchableOpacity> </TouchableOpacity>
<Text style={styles.headerTitle}>{beneficiary.name}</Text> <Text style={styles.headerTitle}>{beneficiary.name}</Text>
@ -285,7 +292,10 @@ export default function EquipmentStatusScreen() {
styles.backToLovedOnesButton, styles.backToLovedOnesButton,
pressed && { opacity: 0.7 } pressed && { opacity: 0.7 }
]} ]}
onPress={() => router.dismissAll()} onPress={() => {
setIsNavigatingAway(true);
router.replace('/(tabs)/beneficiaries');
}}
> >
<Ionicons name="people" size={20} color={AppColors.white} /> <Ionicons name="people" size={20} color={AppColors.white} />
<Text style={styles.backToLovedOnesText}>Back to My Loved Ones</Text> <Text style={styles.backToLovedOnesText}>Back to My Loved Ones</Text>