import { router } from 'expo-router'; import { FlatList, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useUsers } from '@/api/pilotage'; import { usePermissions } from '@/auth/use-permissions'; import { BoutonTel, EnteteFiche } from '@/composants/ui'; import { useTokens, type Tokens } from '@/theme/tokens'; const LABEL_STATUT: Record<'active' | 'invited' | 'disabled', string> = { active: 'Actif', invited: 'Invitation envoyée', disabled: 'Désactivé', }; /** Personnes & équipes — R6.4 (Pilotage). Consultation + « Inviter » (D4) — * taux horaire, équipes, rôles restent gérés depuis le web pour l'instant. */ export default function PagePersonnes() { const t = useTokens(); const { data: users } = useUsers(); const { can } = usePermissions(); const personnes = [...(users ?? [])].sort((a, b) => a.displayName.localeCompare(b.displayName)); return ( {can('PEOPLE_TEAMS', 'create') ? ( router.push('/personnes/inviter')} /> ) : null} u.id} contentContainerStyle={{ gap: 8, paddingBottom: 12 }} ListEmptyComponent={ Personne accessible. } renderItem={({ item: u }) => } /> ); } function LignePersonne({ utilisateur: u, t, }: { utilisateur: { id: string; displayName: string; email: string; role: { name: string }; teams: { name: string }[]; status: 'active' | 'invited' | 'disabled' }; t: Tokens; }) { const [enc, fond] = u.status === 'active' ? [t.stTermine, t.stTermineFond] : u.status === 'invited' ? [t.stAttente, t.stAttenteFond] : [t.stAnnule, t.stAnnuleFond]; return ( {u.displayName} {LABEL_STATUT[u.status]} {u.role.name} {u.teams.length ? ` · ${u.teams.map((eq) => eq.name).join(', ')}` : ''} ); }