QRScanView
Scanner un code QR et soumettre le résultat.
Description
Le composant QRScanView fournit une interface de scanner de codes QR. L'application mobile prend en charge toute l'implémentation du scanner (caméra, torche, mise au point, formats, interface), tandis que la vue se contente de décrire ce qu'il faut scanner et où soumettre le résultat.
Principes de conception :
- L'application mobile prend en charge TOUTE l'implémentation du scanner
- La vue décrit uniquement ce qu'il faut scanner et où soumettre
- Le nom du champ est TOUJOURS "qrData" (non configurable)
- Soumission automatique par défaut : scan → POST immédiat de
{ qrData: "scanned-value" } - Un bouton de soumission désactive la soumission automatique, pour les parcours à confirmation manuelle
- L'aperçu est en lecture seule : une valeur que l'utilisateur pourrait ressaisir permettrait de publier n'importe quoi comme si cela avait été scanné
Convention de soumission :
- Soumission automatique : POST vers
{service.baseUrl}/{viewId}avec{ qrData: "scanned-value" } - Avec bouton : l'utilisateur scanne, consulte l'aperçu (s'il est activé), puis appuie sur le bouton pour soumettre
Contrat de comportement côté client
Le moteur de rendu résout les trois indicateurs dans cet ordre — le premier qui s'applique l'emporte :
submitest défini → un bouton est affiché, la soumission automatique est désactivée (le SDK force égalementautoSubmit: false)preview.enabledvaut true → la valeur scannée est affichée et la soumission attend l'appui- sinon
autoSubmit(true par défaut) → un scan valide est envoyé immédiatement
Scans refusés : lorsqu'une valeur scannée échoue à la validation, le client arrête le scanner et affiche un panneau d'échec portant validation.errorMessage. Il ne poursuit pas silencieusement le balayage — un code qui enfreint les règles les enfreindrait de nouveau à chaque image — et il ne renvoie jamais la valeur refusée à l'utilisateur. Deux conséquences pour le fournisseur :
- Rédigez
errorMessagede façon à énoncer la règle (« doit commencer par PROD- suivi de 6 à 12 chiffres »), et pas simplement « code invalide » : c'est la seule information visible par l'utilisateur. - La seule issue pour l'utilisateur est de scanner à nouveau ou de quitter la vue.
Message de confirmation. submit.confirmMessage est rendu comme texte d'aide sur l'écran de résultat du scan, à côté de la valeur scannée — et non comme une boîte de dialogue modale. Sur une vue QRScan, l'appui sur le bouton de soumission (avec la valeur sous les yeux de l'utilisateur) constitue déjà l'étape de confirmation ; une boîte de dialogue poserait deux fois la même question. Servez-vous-en pour indiquer ce que l'utilisateur doit vérifier avant d'appuyer (« comparez la référence avec celle imprimée sur l'étiquette »). Le champ conserve son nom par cohérence avec SubmitAction dans les autres vues ; seul son rendu en QRScan diffère.
Quand activer l'aperçu. Il affiche la valeur brute scannée : il n'est donc utile que si cette valeur signifie quelque chose pour l'utilisateur — une référence de billet, un numéro de facture imprimé à côté du code, ou un lot de codes assez proches physiquement pour que la caméra lise le mauvais. Pour des charges utiles opaques (blobs signés, UUID, URL), laissez-le désactivé et soumettez automatiquement, puis renvoyez une vue décrivant ce à quoi le code correspond : l'utilisateur confirme ainsi un sens plutôt qu'une chaîne de caractères. Afficher une charge utile opaque ou sensible expose au regard indiscret sans aucun bénéfice.
Description des champs
idstringrequistypestringrequis"QRScan"contentQRScanContentrequiscontent.titlestringrequiscontent.introstringoptionnelcontent.autoSubmitbooleanoptionnelcontent.submitQRScanSubmitActionoptionnelcontent.submit.textstringrequis*content.submit.methodHttpMethodoptionnelcontent.submit.confirmMessagestringoptionnelcontent.validationobjectoptionnelcontent.validation.formatstringoptionnel"text", "number", "url", "email"content.validation.startsWithstringoptionnelcontent.validation.minLengthnumberoptionnelcontent.validation.maxLengthnumberoptionnelcontent.validation.errorMessagestringrequis*content.previewobjectoptionnelcontent.preview.enabledbooleanoptionnelcontent.preview.labelstringoptionnelprocessIdstringoptionnelmetadataobjectoptionnelNote : Le serveur DOIT revalider les données scannées pour des raisons de sécurité, même si une validation côté client a été effectuée. Les règles côté client relèvent du confort d'usage — elles évitent un aller-retour, elles ne garantissent rien.
Méthodes
setIntro(intro)→ thisintro- Texte d'instruction
submitButton(text, confirmMessage?)→ thistext- Texte du boutonconfirmMessage- Message optionnel affiché comme texte d'aide avec la valeur scannée
setValidation(errorMessage, format?, minLength?, maxLength?, startsWith?)→ thiserrorMessage- Message d'erreurformat- Format des données ('text', 'number', 'url', 'email')minLength- Longueur minimalemaxLength- Longueur maximalestartsWith- Préfixe requis
enablePreview(label?)→ thislabel- Libellé du champ (par défaut : "Scanned Code")
disablePreview()→ thissetAutoSubmit(enabled?)→ thisenabled- Indicateur d'activation (par défaut : true)
serve()→ Record<string, unknown>toJSON()→ Record<string, unknown>setState(key, value)→ voidkey- Clé d'étatvalue- Valeur d'état
getState(key)→ unknownkey- Clé d'état
setNext(url)→ thisurl- URL de la vue suivante
setPrev(url)→ thisurl- URL de la vue précédente
setProcess(processId, context?)→ thisprocessId- Identifiant de processuscontext- Contexte de processus
Exemples de code JavaScript
Scan QR simple avec soumission automatique
1import { YeriaApp } from '@numerum-tech/yeriasdk';
2
3const yeriaApp = new YeriaApp({ appId: 'my-app' });
4
5const qrScan = yeriaApp
6 .createQRScanView('scan-ticket', 'Scan Your Ticket')
7 .setIntro('Point camera at the QR code on your ticket');
8// → Scans, immediately POSTs { qrData: "ABC123" } to {baseUrl}/scan-ticket
9
10const response = yeriaApp.serve(qrScan);Scan QR avec confirmation manuelle
1const qrScan = yeriaApp
2 .createQRScanView('verify-product', 'Verify Product')
3 .setIntro('Scan the product barcode')
4 .enablePreview('Product Code')
5 .submitButton('Verify Product');
6// → Scans, shows the code read-only, user clicks "Verify Product" to submitScan QR avec validation
1const qrScan = yeriaApp
2 .createQRScanView('scan-invoice', 'Scan Invoice')
3 .setIntro('Scan the invoice QR code')
4 .setValidation(
5 'Invalid invoice format',
6 'number', // Format: digits only
7 10, // minLength
8 15, // maxLength
9 'INV-' // startsWith prefix
10 )
11 .submitButton('Process Invoice');
12// → Accepts: "INV-123456" (10-15 chars total, digits after INV-)Scan QR avec validation de code numérique
1const qrScan = yeriaApp
2 .createQRScanView('scan-code', 'Scan Code')
3 .setIntro('Scan the 6-digit code')
4 .setValidation(
5 'Code must be 6 digits',
6 'number', // Format: digits only
7 6, // minLength
8 6 // maxLength
9 );
10// → Accepts: "123456", "000001"Scan QR avec validation de format e-mail
1const qrScan = yeriaApp
2 .createQRScanView('scan-email', 'Scan Email QR')
3 .setIntro('Scan the email QR code')
4 .setValidation(
5 'Invalid email format',
6 'email' // Simple check: has @ and .
7 )
8 .submitButton('Submit Email');
9// → Accepts: "user@example.com"Scan QR avec validation de format URL
1const qrScan = yeriaApp
2 .createQRScanView('scan-url', 'Scan URL')
3 .setIntro('Scan the URL QR code')
4 .setValidation(
5 'Invalid URL',
6 'url' // Starts with http:// or https://
7 )
8 .submitButton('Open URL');
9// → Accepts: "https://example.com"Scan QR avec validation de préfixe
1const qrScan = yeriaApp
2 .createQRScanView('scan-ticket', 'Scan Ticket')
3 .setIntro('Scan your ticket QR code')
4 .setValidation(
5 'Must start with TICKET-',
6 undefined, // No format restriction
7 undefined, // No minLength
8 undefined, // No maxLength
9 'TICKET-' // Required prefix
10 )
11 .submitButton('Confirm Ticket');
12// → Accepts: "TICKET-ABC123", "TICKET-XYZ"Scan QR avec validation de plage de longueur
1const qrScan = yeriaApp
2 .createQRScanView('scan-code', 'Scan Code')
3 .setIntro('Scan the code')
4 .setValidation(
5 'Code must be 8-20 characters',
6 undefined, // No format restriction
7 8, // minLength
8 20 // maxLength
9 )
10 .submitButton('Submit Code');Scan QR avec aperçu et message de confirmation
1const qrScan = yeriaApp
2 .createQRScanView('scan-confirm', 'Scan Code')
3 .setIntro('Scan the code on the parcel')
4 .enablePreview('Parcel Code')
5 .submitButton('Confirm', 'Check the code against the label before validating.');
6// → Shows the scanned code read-only, with the message rendered as help text
7// next to it, and submits on the tap. The preview is never editable.Scan QR désactivant la soumission automatique
1const qrScan = yeriaApp
2 .createQRScanView('scan-review', 'Scan Code')
3 .setIntro('Scan the code')
4 .setAutoSubmit(false) // Explicitly disable auto-submit
5 .submitButton('Review and Submit');
6// → Requires button click to submitScan QR dans un parcours multi-étapes
1const qrScan = yeriaApp
2 .createQRScanView('scan-step-2', 'Scan Verification Code')
3 .setProcess('verification', {
4 processName: 'Account Verification',
5 currentStep: 2,
6 totalSteps: 3,
7 stepName: 'Scan Code'
8 })
9 .setIntro('Scan the verification code sent to your email')
10 .setValidation(
11 'Invalid verification code',
12 'number',
13 6,
14 6
15 )
16 .submitButton('Verify');Exemple JSON complet
1{
2 "id": "scan-verification",
3 "type": "QRScan",
4 "content": {
5 "title": "Scan Verification Code",
6 "intro": "Scan the verification code sent to your email",
7 "autoSubmit": true,
8 "submit": {
9 "text": "Verify",
10 "method": "POST"
11 },
12 "validation": {
13 "errorMessage": "Invalid verification code",
14 "format": "number",
15 "minLength": 6,
16 "maxLength": 6
17 },
18 "preview": {
19 "enabled": true,
20 "label": "Scanned Code"
21 }
22 },
23 "process": {
24 "processId": "verification",
25 "processName": "Account Verification",
26 "currentStep": 2,
27 "totalSteps": 3,
28 "stepName": "Scan Code"
29 },
30 "metadata": {
31 "version": "2.0.0",
32 "createdAt": "2025-01-28T10:00:00.000Z"
33 }
34}