monorepo/dialer/lib/widgets/qr_scanner.dart
2025-01-12 12:31:44 +00:00

73 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
class QRCodeScannerScreen extends StatefulWidget {
const QRCodeScannerScreen({Key? key}) : super(key: key);
@override
_QRCodeScannerScreenState createState() => _QRCodeScannerScreenState();
}
class _QRCodeScannerScreenState extends State<QRCodeScannerScreen> {
final MobileScannerController cameraController = MobileScannerController();
bool isScanning = true;
@override
void dispose() {
cameraController.dispose();
super.dispose();
}
void _showInvalidQRDialog() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Invalid QR Code'),
content:
const Text('The scanned QR code does not contain valid vCard data.'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(); // Close dialog
setState(() {
isScanning = true; // Resume scanning
});
},
child: const Text('Try Again'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Scan Contact QR Code'),
),
body: MobileScanner(
controller: cameraController,
// allowDuplicates: false, // or true, depending on your preference
onDetect: (capture) {
if (!isScanning) return;
isScanning = false; // Stop multiple triggers
final List<Barcode> barcodes = capture.barcodes;
for (final barcode in barcodes) {
final String? code = barcode.rawValue;
// If the QR code contains 'BEGIN:VCARD', let's assume it's a valid vCard
if (code != null && code.contains('BEGIN:VCARD')) {
Navigator.pop(context, code); // pop back with the full vCard text
return;
}
}
// If no valid vCard was found in any of the barcodes
_showInvalidQRDialog();
},
),
);
}
}