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:
openclaw
2026-03-24 12:32:51 +01:00
parent e8ab0b641a
commit d8a947eb79
3 changed files with 132 additions and 135 deletions

View File

@@ -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 relance pas lerreur et ne met pas à jour un état derreur
### Bonnes pratiques / mitigations
- Relancer lerreur pour que lécran gère lUX, ou stocker explicitement lerreur 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 lUX lexige
}
}
```
---
<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(), ...); }
```