mirror of
https://github.com/siop-spelev/siop2.git
synced 2026-08-08 12:41:54 +00:00
Scanner expo-camera (QR seulement) : analyseScan testée — URL portail …/q/REF des étiquettes A6 ou référence tapée, QR étrangers refusés ; résolution D4 dans le parc en cache d'abord (sous-sol inclus), message honnête sinon. Fiche ascenseur en consultation (D3, historique scopé « voir autre »). Fiche OT : un bouton principal selon la machine à états, coûts figés, garde alimentée par closureBlockers (source unique API). Clôture terrain : bilan codé 6 champs au pouce (sélecteur plein écran), garde visible, clôture en ligne. Préventif : mes grilles → checklist cochable, appui long = N/A, aria-checked (leçon RN web : accessibilityState.checked ne produit pas aria-checked). Écritures en ligne assumées en R4.2 (bandeaux hors-ligne explicites) — la file persistée et le verrou optimiste sont R4.3 (D1/D2). Vérifié 12/12 en Expo web piloté : scan → fiche → OT-0341 (505 MAD, garde), coche/décoche restituée, OT de test Démarrer → bilan → Terminé, zéro erreur console, données purgées. 12 tests jest-expo. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
17 lines
683 B
TypeScript
17 lines
683 B
TypeScript
/** Analyse du scan (D4) : le QR des étiquettes A6 (R1) encode l'URL du
|
|
* portail public `…/q/REF`. On accepte aussi une référence tapée à la main.
|
|
* Retour : la référence normalisée, ou null si le code n'est pas un nôtre. */
|
|
|
|
const REF_VALIDE = /^[A-Z0-9][A-Z0-9-]{0,11}$/;
|
|
|
|
export function analyseScan(brut: string): string | null {
|
|
const texte = brut.trim();
|
|
if (!texte) return null;
|
|
|
|
// URL d'étiquette : http(s)://…/q/A1 (quel que soit le domaine d'origine)
|
|
const url = texte.match(/^https?:\/\/[^\s]+\/q\/([^\s/?#]+)$/i);
|
|
const candidat = decodeURIComponent(url?.[1] ?? texte).toUpperCase();
|
|
|
|
return REF_VALIDE.test(candidat) ? candidat : null;
|
|
}
|