This commit is contained in:
Marcos Rodriguez Velez 2025-02-21 23:14:00 -04:00
parent 2317d0a4cf
commit 6afc6624eb
2 changed files with 21 additions and 46 deletions

View file

@ -12,7 +12,7 @@ import {
ActivityIndicator,
} from 'react-native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { useFocusEffect, useNavigation } from '@react-navigation/native';
import { useFocusEffect, useNavigation, usePreventRemove } from '@react-navigation/native';
import { useTheme } from '../../components/themes';
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
import loc from '../../loc';
@ -197,7 +197,6 @@ const ManageWallets: React.FC = () => {
const navigation = useNavigation();
const debouncedSearchQuery = useDebounce(state.searchQuery, 300);
const bounceAnim = useBounceAnimation(state.searchQuery);
const beforeRemoveListenerRef = useRef<(() => void) | null>(null);
const stylesHook = {
root: {
backgroundColor: colors.elevated,
@ -225,6 +224,23 @@ const ManageWallets: React.FC = () => {
}
}, [debouncedSearchQuery, state.order]);
const hasUnsavedChanges = useMemo(() => {
return JSON.stringify(walletsRef.current) !== JSON.stringify(state.tempOrder.map(item => item.data));
}, [state.tempOrder]);
usePreventRemove(hasUnsavedChanges, async () => {
await new Promise<void>(resolve => {
Alert.alert(
loc._.discard_changes,
loc._.discard_changes_explain,
[
{ text: loc._.cancel, style: 'cancel', onPress: () => resolve() },
{ text: loc._.ok, style: 'default', onPress: () => resolve() },
]
);
});
});
const handleClose = useCallback(() => {
if (state.searchQuery.length === 0 && !state.isSearchFocused) {
const newWalletOrder = state.tempOrder
@ -243,20 +259,12 @@ const ManageWallets: React.FC = () => {
}
});
if (beforeRemoveListenerRef.current) {
navigation.removeListener('beforeRemove', beforeRemoveListenerRef.current);
}
goBack();
} else {
dispatch({ type: SET_SEARCH_QUERY, payload: '' });
dispatch({ type: SET_IS_SEARCH_FOCUSED, payload: false });
}
}, [goBack, setWalletsWithNewOrder, state.searchQuery, state.isSearchFocused, state.tempOrder, navigation, handleWalletDeletion]);
const hasUnsavedChanges = useMemo(() => {
return JSON.stringify(walletsRef.current) !== JSON.stringify(state.tempOrder.map(item => item.data));
}, [state.tempOrder]);
}, [goBack, setWalletsWithNewOrder, state.searchQuery, state.isSearchFocused, state.tempOrder, handleWalletDeletion]);
const HeaderLeftButton = useMemo(
() => (
@ -298,45 +306,12 @@ const ManageWallets: React.FC = () => {
useFocusEffect(
useCallback(() => {
setIsDrawerShouldHide(true);
const beforeRemoveListener = (e: { preventDefault: () => void; data: { action: any } }) => {
if (!hasUnsavedChanges) {
return;
}
e.preventDefault();
Alert.alert(loc._.discard_changes, loc._.discard_changes_explain, [
{ text: loc._.cancel, style: 'cancel', onPress: () => {} },
{
text: loc._.ok,
style: 'default',
onPress: () => navigation.dispatch(e.data.action),
},
]);
};
// @ts-ignore: fix later
beforeRemoveListenerRef.current = beforeRemoveListener;
navigation.addListener('beforeRemove', beforeRemoveListener);
return () => {
if (beforeRemoveListenerRef.current) {
navigation.removeListener('beforeRemove', beforeRemoveListenerRef.current);
}
setIsDrawerShouldHide(false);
};
}, [hasUnsavedChanges, navigation, setIsDrawerShouldHide]),
}, [setIsDrawerShouldHide]),
);
// Ensure the listener is re-added every time there are unsaved changes
useEffect(() => {
if (beforeRemoveListenerRef.current) {
navigation.removeListener('beforeRemove', beforeRemoveListenerRef.current);
navigation.addListener('beforeRemove', beforeRemoveListenerRef.current);
}
}, [hasUnsavedChanges, navigation]);
const renderHighlightedText = useCallback(
(text: string, query: string) => {
const parts = text.split(new RegExp(`(${query})`, 'gi'));

View file

@ -164,7 +164,7 @@ const WalletTransactions: React.FC<WalletTransactionsProps> = ({ route }) => {
useEffect(() => {
if (wallet && wallet.getLastTxFetch() === 0 && !isLoading) {
debouncedRefresh().finally(() => setIsLoading(false));
debouncedRefresh();
}
}, [wallet, isLoading, debouncedRefresh]);