mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-04-06 21:41:42 +02:00
Lead_tech: intégrer capitalisations (24-03-2026)
Backend — Risques & vigilance: - Code d’erreur générique sur 409 (conflict) — +index/+ancre/+section - Tests e2e d’autorisation avec buildApp isolé — +index/+ancre/+section - MAJ date Frontend — Risques & vigilance: - Guard de rôle via return conditionnel dans le render — +index/+ancre/+section - Méthodes Zustand sans rethrow — +index/+ancre/+section - Regex globale singleton (/g) — +index/+ancre/+section - MAJ date Divers: - Purge 95_a_capitaliser.md (tampon vidé)
This commit is contained in:
@@ -7,7 +7,7 @@ Ce fichier recense des risques front-end susceptibles de provoquer :
|
||||
- dette technique rapide,
|
||||
- régressions UX/perf/a11y.
|
||||
|
||||
Dernière mise à jour : 23-03-2026
|
||||
Dernière mise à jour : 24-03-2026
|
||||
|
||||
---
|
||||
|
||||
@@ -60,6 +60,9 @@ Dernière mise à jour : 23-03-2026
|
||||
- [`useCallback` inutile quand le callback est wrappé en inline au render](#risque-usecallback-inutile-inline)
|
||||
- [Formulaire React avec `defaultValue` sans `key` prop](#risque-formulaire-defaultvalue-sans-key)
|
||||
- [Zustand : optimistic update sur item absent de la liste principale](#risque-zustand-optimistic-update-sous-listes)
|
||||
- [Guard de rôle via return conditionnel dans le render](#risque-guard-role-return-conditionnel)
|
||||
- [Méthodes Zustand qui avalent les erreurs (sans rethrow)](#risque-zustand-sans-rethrow)
|
||||
- [Regex globale singleton (/g) partagée au niveau module](#risque-regex-globale-singleton)
|
||||
|
||||
---
|
||||
|
||||
@@ -1045,3 +1048,80 @@ const target =
|
||||
- Règle complémentaire : ne pas mettre à jour une sous-liste (ex: `pinnedThreads`) lors d'une action qui n'y a pas de rapport (ex: mise en vitrine ne touche pas `pinnedThreads`)
|
||||
|
||||
- Contexte technique : React Native / Zustand — app-alexandrie 23-03-2026
|
||||
|
||||
---
|
||||
|
||||
<a id="risque-guard-role-return-conditionnel"></a>
|
||||
## Guard de rôle via return conditionnel dans le render
|
||||
|
||||
### Risques
|
||||
|
||||
- Flash “Accès refusé” pendant le chargement du store auth (`user === null` au montage)
|
||||
- UX instable (re-render successif qui corrige le faux négatif)
|
||||
|
||||
### Symptômes
|
||||
|
||||
- `if (user?.role !== "ADMIN") return <AccessDenied />` directement dans le composant
|
||||
|
||||
### Bonnes pratiques / mitigations
|
||||
|
||||
- Router côté client après détermination du rôle, et rendre un placeholder tant que l’état est inconnu
|
||||
|
||||
```tsx
|
||||
useEffect(() => {
|
||||
if (user !== null && user.role !== 'ADMIN') router.replace('/(tabs)');
|
||||
}, [user, router]);
|
||||
|
||||
return user === null || user.role !== 'ADMIN' ? <View /> : <AdminScreen />;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<a id="risque-zustand-sans-rethrow"></a>
|
||||
## Méthodes Zustand qui avalent les erreurs (sans rethrow)
|
||||
|
||||
### Risques
|
||||
|
||||
- Erreurs métier (ex: `UNSAFE_LINK`) invisibles pour l’écran → pas de feedback utilisateur
|
||||
|
||||
### Symptômes
|
||||
|
||||
- `try/catch` dans le store qui ne re‑lance pas l’erreur et ne met pas à jour un état d’erreur
|
||||
|
||||
### Bonnes pratiques / mitigations
|
||||
|
||||
- Relancer l’erreur pour que l’écran gère l’UX, ou stocker explicitement l’erreur dans le state (selon design)
|
||||
|
||||
```ts
|
||||
async updateThread(forumSlug, threadId, body) {
|
||||
try {
|
||||
await communityService.updateThread(accessToken, forumSlug, threadId, body);
|
||||
} catch (e) {
|
||||
const err = e as Error & { code?: string };
|
||||
throw err; // ou set({ error: err.message }) si l’UX l’exige
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<a id="risque-regex-globale-singleton"></a>
|
||||
## Regex globale singleton (/g) partagée au niveau module
|
||||
|
||||
### Risques
|
||||
|
||||
- État `lastIndex` partagé si la regex est réutilisée avec `.test()`/`.exec()` → bugs stateful difficiles à diagnostiquer
|
||||
|
||||
### Symptômes
|
||||
|
||||
- Regex définie en constante module: `const LINK_PATTERN = /https?:\/\/\S+/gi;`
|
||||
- Fonction qui “marche” avec `replace` mais casse après un refactor qui ajoute `.test()`
|
||||
|
||||
### Bonnes pratiques / mitigations
|
||||
|
||||
- Créer une instance nouvelle par appel (factory), éviter le singleton module pour `/g` ou `/y`
|
||||
|
||||
```ts
|
||||
function makeLinkPattern(): RegExp { return /https?:\/\/\S+/gi; }
|
||||
function processLinks(content: string) { return content.replace(makeLinkPattern(), ...); }
|
||||
```
|
||||
Reference in New Issue
Block a user