import AccountMenu from "./src/components/AccountMenu";
-import { loadSession, clearSession } from "./src/utils/sessionStorage";
+import { loadSession } from "./src/utils/sessionStorage";
import { hasSeenTutorial } from "./src/utils/tutorialStorage";
+import { logout as authLogout } from "./src/services/api/authApi";
export type RootStackParamList = {
Dashboard: undefined;
setReady(true);
}
- init();
+ void init();
return () => {
active = false;
text: "Déconnexion",
style: "destructive",
onPress: async () => {
- await clearSession();
+ await authLogout();
setIsAuthed(false);
setSessionEmail("—");
setNeedsTutorial(false);
+ setMenuVisible(false);
},
},
]);
/>
<Stack.Screen name="Settings" options={{ title: "Paramètres" }}>
- {() => (
- <SettingsScreen
- onRequestTutorial={() => {
- // Force le tuto à s'afficher hors stack
- setNeedsTutorial(true);
- }}
- />
- )}
+ {() => (
+ <SettingsScreen
+ onRequestTutorial={() => {
+ // Force le tuto à s'afficher hors stack
+ setNeedsTutorial(true);
+ }}
+ />
+ )}
</Stack.Screen>
<Stack.Screen
import { useMemo, useState } from "react";
import { ui } from "../components/ui/uiStyles";
-import { saveSession } from "../utils/sessionStorage";
-import { createUser, verifyLogin } from "../utils/authUsersStorage";
+import { login as authLogin, register as authRegister } from "../services/api/authApi";
/**
- * AuthScreen (Step 4 - local, sans API)
- * ------------------------------------
+ * AuthScreen (Step local, sans API serveur)
+ * ----------------------------------------
* Mode Connexion + Mode Création de compte.
* - Identifiant: email OU username
* - Mot de passe obligatoire
*
- * Plus tard : on remplacera createUser/verifyLogin par des appels REST.
+ * IMPORTANT :
+ * - L'écran appelle authApi (façade).
+ * - Plus tard, authApi sera remplacé par des appels REST,
+ * sans modifier cet écran.
*/
export default function AuthScreen({ onAuthenticated }: { onAuthenticated: () => void }) {
const [mode, setMode] = useState<"login" | "register">("login");
if (!l) return setError("Veuillez entrer un email ou un nom d’utilisateur.");
if (!p || p.length < 6) return setError("Mot de passe invalide (min 6).");
- const res = await verifyLogin({ login: l, password: p });
+ const res = await authLogin({ login: l, password: p });
if (!res.ok) return setError(res.message);
- await saveSession({
- userId: res.user.userId,
- email: res.user.email,
- createdAtMs: Date.now(),
- });
-
onAuthenticated();
};
const p2 = password2;
if (!isValidEmail(e)) return setError("Email invalide.");
- if (!isValidUsername(u)) return setError("Username invalide (3-20, lettres/chiffres/_).");
+ if (!isValidUsername(u)) return setError("Nom d’utilisateur invalide (3-20, lettres/chiffres/_).");
if (!p1 || p1.length < 6) return setError("Mot de passe trop court (min 6).");
if (p1 !== p2) return setError("Les mots de passe ne correspondent pas.");
- const res = await createUser({
+ const res = await authRegister({
email: e,
username: u,
displayName: d || undefined,
if (!res.ok) return setError(res.message);
- // auto-login après création
- await saveSession({
- userId: res.user.userId,
- email: res.user.email,
- createdAtMs: Date.now(),
- });
-
onAuthenticated();
};
setError(null);
}}
>
- <Text style={[styles.tabText, mode === "login" && styles.tabTextActive]}>
- Connexion
- </Text>
+ <Text style={[styles.tabText, mode === "login" && styles.tabTextActive]}>Connexion</Text>
</TouchableOpacity>
<TouchableOpacity
setError(null);
}}
>
- <Text style={[styles.tabText, mode === "register" && styles.tabTextActive]}>
- Créer un compte
- </Text>
+ <Text style={[styles.tabText, mode === "register" && styles.tabTextActive]}>Créer un compte</Text>
</TouchableOpacity>
</View>
</TouchableOpacity>
<Text style={[ui.muted, { marginTop: 10 }]}>
- (Mode local sans API : destiné au développement / démo.)
+ (Mode local sans API serveur : destiné au développement / démo.)
</Text>
</>
) : (
</TouchableOpacity>
<Text style={[ui.muted, { marginTop: 10 }]}>
- (Sans API : stockage local + hash SHA-256 pour éviter le mot de passe en clair.)
+ (Sans API serveur : stockage local + hash SHA-256, pas de mot de passe en clair.)
</Text>
</>
)}