mirror of
https://github.com/siop-spelev/siop2.git
synced 2026-08-08 12:41:54 +00:00
EXPO_PUBLIC_WEB_URL/WEB_URL pour le lien d'activation (pointe la page web /activation?token=…, aucun équivalent mobile). api/pilotage.ts (useAnalyticsSummary, useUsers, useRoles, useInviteUser). Écran Statistiques (maquette écran 7) : période 3/6/12 mois, coût du mois, taux préventif, OT clôturés, pannes par organe, top équipements — cartes plutôt que graphes denses (D4). Écran Personnes & équipes : liste + statut, Inviter (nom/e-mail/rôle), lien d'activation en texte sélectionnable (Text selectable, RN natif) — expo-clipboard est une dépendance native absente, différée comme expo-sharing en R6.3 plutôt qu'ajoutée à la légère. Taux horaire/rôles/ équipes restent gérés au web (D4). Assistant reste "à venir" dans le Menu : un chat sourcé est un nouveau patron d'écran jamais maquetté sur mobile, contrairement aux autres familles qui réutilisaient des patrons déjà validés — mérite son propre tour de design-first plutôt qu'être exécuté par réflexe en fin de release. R6 quasi close (Exploitation/Parc/Ressources/Pilotage livrés pour tous les rôles, hors Assistant) — reste la confirmation du référent sur iPhone (R6.1 + correctif déconnexion) avant clôture réelle. Typecheck propre, 17 tests Jest, lint 5/5 paquets. Contrat non touché. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
import { router, useLocalSearchParams } from 'expo-router';
|
|
import { ScrollView, Text, View } from 'react-native';
|
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
import { WEB_URL } from '@/api/client';
|
|
import { BoutonTel, Carte, EnteteFiche } from '@/composants/ui';
|
|
import { useTokens } from '@/theme/tokens';
|
|
|
|
/** Lien d'activation émis — R6.4. Pas de presse-papiers natif sur mobile
|
|
* pour l'instant (`expo-clipboard` demanderait un nouveau build natif,
|
|
* même raisonnement que l'ouverture de document en Ressources) : le texte
|
|
* est sélectionnable (`Text selectable`, RN natif, aucune dépendance) —
|
|
* appui long → copier, comme partout sur le téléphone. */
|
|
export default function PageLienActivation() {
|
|
const t = useTokens();
|
|
const { token, expiresAt } = useLocalSearchParams<{ token: string; expiresAt: string }>();
|
|
const url = `${WEB_URL}/activation?token=${token}`;
|
|
|
|
return (
|
|
<SafeAreaView style={{ flex: 1, backgroundColor: t.fond }} edges={['top']}>
|
|
<ScrollView contentContainerStyle={{ padding: 14, gap: 12 }}>
|
|
<EnteteFiche titre="Lien d'activation émis" />
|
|
<Text style={{ fontFamily: 'Manrope_600SemiBold', fontSize: 13, color: t.encre2 }}>
|
|
Transmettez ce lien à la personne (valable jusqu'au{' '}
|
|
{new Intl.DateTimeFormat('fr-FR', { dateStyle: 'long' }).format(new Date(expiresAt))}) :
|
|
</Text>
|
|
<Carte>
|
|
<Text
|
|
selectable
|
|
style={{ fontFamily: 'Manrope_700Bold', fontSize: 13, color: t.primaire }}
|
|
>
|
|
{url}
|
|
</Text>
|
|
</Carte>
|
|
<Text style={{ fontFamily: 'Manrope_400Regular', fontSize: 11.5, color: t.encre3 }}>
|
|
Appui long sur le lien pour le sélectionner et le copier.
|
|
</Text>
|
|
<View style={{ marginTop: 8 }}>
|
|
<BoutonTel libelle="Terminé" surAppui={() => router.replace('/personnes')} />
|
|
</View>
|
|
</ScrollView>
|
|
</SafeAreaView>
|
|
);
|
|
}
|