G-EIP-700-TLS-7-1-eip-steph.../dialer/lib/widgets/qr_scanner.dart
stcb 3f6ea2e332
All checks were successful
/ mirror (push) Successful in 5s
Merge contact_edition (#6)
Reviewed-on: #6
2024-11-29 08:27:29 +00:00

162 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
class QRCodeScannerScreen extends StatefulWidget {
const QRCodeScannerScreen({Key? key}) : super(key: key);
@override
_QRCodeScannerScreenState createState() => _QRCodeScannerScreenState();
}
class _QRCodeScannerScreenState extends State<QRCodeScannerScreen> {
MobileScannerController cameraController = MobileScannerController();
bool isScanning = true;
@override
void dispose() {
cameraController.dispose();
super.dispose();
}
Future<void> _createContactFromVCard(String vCardData) async {
// Parse VCard data
final Map<String, dynamic> contactInfo = _parseVCard(vCardData);
debugPrint("contactInfo: $contactInfo");
// // Create a new contact
// Contact newContact = Contact();
//
// // Set contact's name
// newContact.name = Name(
// first: contactInfo['firstName'] ?? '',
// last: contactInfo['lastName'] ?? '',
// );
//
// // Set contact's phone numbers
// if (contactInfo['phone'] != null) {
// newContact.phones = [
// Phone(contactInfo['phone'], label: PhoneLabel.mobile),
// ];
// }
//
// // Set contact's emails
// if (contactInfo['email'] != null) {
// newContact.emails = [
// Email(contactInfo['email'], label: EmailLabel.home),
// ];
// }
//
// // Request permission to write contacts
// bool permission = await FlutterContacts.requestPermission(readonly: false);
// if (!permission) {
// // Handle permission denied
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(content: Text('Contacts permission denied')),
// );
// return;
// }
//
// // Save the contact
// await newContact.insert();
}
Map<String, dynamic> _parseVCard(String vCardData) {
// Simple parser for VCard data
final Map<String, dynamic> contactInfo = {};
final lines = vCardData.split(RegExp(r'\r?\n'));
for (var line in lines) {
if (line.startsWith('FN:')) {
contactInfo['fullName'] = line.substring(3).trim();
} else if (line.startsWith('N:')) {
final names = line.substring(2).split(';');
contactInfo['lastName'] = names[0].trim();
contactInfo['firstName'] = names.length > 1 ? names[1].trim() : '';
} else if (line.startsWith('TEL:')) {
contactInfo['phone'] = line.substring(4).trim();
} else if (line.startsWith('EMAIL:')) {
contactInfo['email'] = line.substring(6).trim();
}
// Add more fields as needed
}
return contactInfo;
}
void _showContactAddedDialog() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Contact Added'),
content: Text('The contact has been added to your address book.'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(); // Close dialog
Navigator.of(context).pop(); // Go back to previous screen
},
child: Text('OK'),
),
],
),
);
}
void _showInvalidQRDialog() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Invalid QR Code'),
content: Text('The scanned QR code does not contain valid contact information.'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(); // Close dialog
isScanning = true; // Resume scanning
},
child: Text('Try Again'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scan Contact QR Code'),
),
body: MobileScanner(
controller: cameraController,
onDetect: (capture) {
if (!isScanning) return;
isScanning = false; // Prevent multiple scans
final List<Barcode> barcodes = capture.barcodes;
for (final barcode in barcodes) {
final String? code = barcode.rawValue;
if (code != null && code.contains('BEGIN:VCARD')) {
// Handle valid vCard QR code
_createContactFromVCard(code);
_showContactAddedDialog(); // TODO: Be a confirmation button "do you want to add XXX to your contacts?"
break;
}
}
if (!barcodes.any((barcode) =>
barcode.rawValue != null && barcode.rawValue!.contains('BEGIN:VCARD'))) {
// If no valid QR code is found
_showInvalidQRDialog();
isScanning = true; // Allow scanning again for invalid QR codes
}
},
),
);
}
}