fix(mobile): R6.8 — la connexion routait toujours vers "Ma journée"

connexion.tsx faisait router.replace('/(tabs)/journee') en dur — trouvé
en recette : Karim (Demandeur) atterrissait sur l'écran du Technicien
après avoir basculé de compte démo. La redirection par rôle
(ongletAccueil) n'était branchée qu'à l'aiguillage initial (app/index.tsx,
R6.1), pas au retour de connexion — le chemin réellement emprunté à
chaque bascule de compte (pas de sélecteur de rôle en direct sur mobile,
changer de compte = se déconnecter puis se reconnecter).

useLogin()/useDemoLogin() (auth/session.tsx) renvoient maintenant la
réponse complète (contient user.role.name) au lieu de la jeter après en
avoir extrait le jeton. connexion.tsx : entrer(role) route vers
/(tabs)/${ongletAccueil(role)} pour les deux chemins (connexion classique
et sélecteur démo).

Au passage : sous-titre "Technicien" et accroche "sur le terrain — même
sans réseau" (reste de R4, mobile alors réservé au Technicien) devenus
trompeurs pour les autres rôles depuis R6 — généricisés.

Typecheck/tests/lint verts sur les 4 paquets.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-08-03 09:37:12 +01:00
parent 19076a91d3
commit 39320d081e
4 changed files with 51 additions and 9 deletions

View File

@@ -9,12 +9,18 @@ import {
TextInput,
View,
} from 'react-native';
import type { RoleName } from '@siop/shared';
import { ongletAccueil } from '@/auth/roles';
import { useDemoAccounts, useDemoLogin, useLogin } from '@/auth/session';
import { useTokens } from '@/theme/tokens';
/** Connexion mobile — mêmes règles que le web : formulaire e-mail/mot de
* passe, et le sélecteur démo (< 3 s pour changer de rôle, ADR-002)
* UNIQUEMENT si l'API l'expose. */
* UNIQUEMENT si l'API l'expose. Depuis R6, l'app n'est plus réservée au
* Technicien : on route vers l'onglet d'accueil du RÔLE réel (« Ma
* journée » pour le terrain, « Accueil » sinon) — jamais un onglet figé
* (trouvé en recette : un Demandeur atterrissait sur « Ma journée »,
* l'écran du Technicien, faute de lire le rôle retourné par la connexion). */
export default function PageConnexion() {
const t = useTokens();
const [email, setEmail] = useState('');
@@ -23,7 +29,7 @@ export default function PageConnexion() {
const login = useLogin();
const demo = useDemoLogin();
const entrer = () => router.replace('/(tabs)/journee');
const entrer = (role: RoleName) => router.replace(`/(tabs)/${ongletAccueil(role)}`);
return (
<KeyboardAvoidingView
@@ -36,12 +42,9 @@ export default function PageConnexion() {
<Text style={{ fontFamily: 'Manrope_800ExtraBold', fontSize: 26, color: t.encre }}>
SIOP
</Text>
<Text style={{ fontFamily: 'Manrope_600SemiBold', fontSize: 13, color: t.encre3 }}>
Technicien
</Text>
</View>
<Text style={{ fontFamily: 'Manrope_400Regular', color: t.encre2, marginBottom: 8 }}>
Vos ordres de travail, sur le terrain même sans réseau.
Vos interventions et votre suivi, que vous soyez.
</Text>
<View style={{ gap: 10 }}>
@@ -84,7 +87,10 @@ export default function PageConnexion() {
accessibilityRole="button"
disabled={!email || !motDePasse || login.isPending}
onPress={() =>
login.mutate({ email, password: motDePasse }, { onSuccess: entrer })
login.mutate(
{ email, password: motDePasse },
{ onSuccess: (res) => entrer(res.user.role.name) },
)
}
style={{
backgroundColor: !email || !motDePasse ? t.bordureForte : t.primaire,
@@ -122,7 +128,9 @@ export default function PageConnexion() {
key={c.id}
accessibilityRole="button"
disabled={demo.isPending}
onPress={() => demo.mutate(c.id, { onSuccess: entrer })}
onPress={() =>
demo.mutate(c.id, { onSuccess: (res) => entrer(res.user.role.name) })
}
style={{
backgroundColor: t.surface,
borderColor: t.bordure,