import { router } from 'expo-router'; import { useState } from 'react'; import { KeyboardAvoidingView, Platform, Pressable, ScrollView, Text, 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. 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(''); const [motDePasse, setMotDePasse] = useState(''); const { data: comptes } = useDemoAccounts(); const login = useLogin(); const demo = useDemoLogin(); const entrer = (role: RoleName) => router.replace(`/(tabs)/${ongletAccueil(role)}`); return ( SIOP Vos interventions et votre suivi, où que vous soyez. login.mutate( { email, password: motDePasse }, { onSuccess: (res) => entrer(res.user.role.name) }, ) } style={{ backgroundColor: !email || !motDePasse ? t.bordureForte : t.primaire, borderRadius: 10, padding: 14, alignItems: 'center', }} > {login.isPending ? 'Connexion…' : 'Se connecter'} {login.isError ? ( {login.error.message} ) : null} {comptes?.length ? ( Mode démo — connexion 1 clic {comptes.map((c) => ( demo.mutate(c.id, { onSuccess: (res) => entrer(res.user.role.name) }) } style={{ backgroundColor: t.surface, borderColor: t.bordure, borderWidth: 1, borderRadius: 10, padding: 12, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', }} > {c.displayName} {c.roleName} ))} ) : null} ); }