fix(expo): harden account deletion handler

- Add isDeletingAccount ref to prevent double-tap race
- Guard against null session before calling API
- Set 15s timeout on delete request (API makes 3-4 Supabase round-trips)
- Log error to console and restore guard in finally block

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Arthur Belleville 2026-04-29 15:51:38 +02:00
parent ea90d5133c
commit 6c74bb8bcf
No known key found for this signature in database

View file

@ -61,6 +61,7 @@ export default function SettingsScreen() {
const [pushNotifications, setPushNotifications] = useState(true); const [pushNotifications, setPushNotifications] = useState(true);
const [emailNotifications, setEmailNotifications] = useState(true); const [emailNotifications, setEmailNotifications] = useState(true);
const [biometricAuth, setBiometricAuth] = useState(false); const [biometricAuth, setBiometricAuth] = useState(false);
const isDeletingAccount = React.useRef(false);
const handleSignOut = () => { const handleSignOut = () => {
Alert.alert("Déconnexion", "Êtes-vous sûr de vouloir vous déconnecter ?", [ Alert.alert("Déconnexion", "Êtes-vous sûr de vouloir vous déconnecter ?", [
@ -90,17 +91,27 @@ export default function SettingsScreen() {
text: "Supprimer mon compte", text: "Supprimer mon compte",
style: "destructive", style: "destructive",
onPress: async () => { onPress: async () => {
if (isDeletingAccount.current) return;
isDeletingAccount.current = true;
try { try {
const session = useAuthStore.getState().session; const session = useAuthStore.getState().session;
if (!session) {
Alert.alert("Erreur", "Session expirée. Veuillez vous reconnecter.");
return;
}
await api.delete("/api/v1/users/me", { await api.delete("/api/v1/users/me", {
headers: { Authorization: `Bearer ${session?.access_token}` }, headers: { Authorization: `Bearer ${session.access_token}` },
timeout: 15000,
}); });
await signOut(); await signOut();
} catch { } catch (error) {
console.error("Account deletion error:", error);
Alert.alert( Alert.alert(
"Erreur", "Erreur",
"Une erreur est survenue lors de la suppression de votre compte. Veuillez réessayer." "Une erreur est survenue lors de la suppression de votre compte. Veuillez réessayer."
); );
} finally {
isDeletingAccount.current = false;
} }
}, },
}, },