From ee1f2ee4b176714762dd79e41198382d161ff881 Mon Sep 17 00:00:00 2001 From: Florian Griffon Date: Thu, 30 Jan 2025 14:15:07 +0000 Subject: [PATCH] feat: can share any contact using qr code (#30) Reviewed-on: https://git.gmoker.com/icing/monorepo/pulls/30 Co-authored-by: Florian Griffon Co-committed-by: Florian Griffon --- .../widgets/alphabet_scroll_page.dart | 2 -- .../contacts/widgets/contact_modal.dart | 10 ++++-- .../contacts/widgets/share_own_qr.dart | 27 +++------------ dialer/lib/services/contact_service.dart | 34 +++++++++++++++---- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart b/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart index 4595b24..822c36e 100644 --- a/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart +++ b/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart @@ -1,5 +1,3 @@ -// alphabet_scrollpage.dart -import 'dart:ui'; import 'package:dialer/services/obfuscate_service.dart'; import 'package:dialer/widgets/username_color_generator.dart'; import 'package:flutter/material.dart'; diff --git a/dialer/lib/features/contacts/widgets/contact_modal.dart b/dialer/lib/features/contacts/widgets/contact_modal.dart index fe42bb2..632d8be 100644 --- a/dialer/lib/features/contacts/widgets/contact_modal.dart +++ b/dialer/lib/features/contacts/widgets/contact_modal.dart @@ -1,11 +1,10 @@ -import 'dart:ui'; - import 'package:dialer/services/obfuscate_service.dart'; import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:dialer/widgets/username_color_generator.dart'; import '../../../services/block_service.dart'; +import '../../../services/contact_service.dart'; class ContactModal extends StatefulWidget { final Contact contact; @@ -139,6 +138,11 @@ class _ContactModalState extends State { } } + void _shareContactAsQRCode() { + // Use the ContactService to show the QR code for the contact's vCard + ContactService().showContactQRCodeDialog(context, widget.contact); + } + @override Widget build(BuildContext context) { String email = widget.contact.emails.isNotEmpty @@ -188,6 +192,8 @@ class _ContactModalState extends State { onSelected: (String choice) { if (choice == 'delete') { _deleteContact(); + } else if (choice == 'share') { + _shareContactAsQRCode(); } // Handle other choices if needed }, diff --git a/dialer/lib/features/contacts/widgets/share_own_qr.dart b/dialer/lib/features/contacts/widgets/share_own_qr.dart index ef16c27..058ed35 100644 --- a/dialer/lib/features/contacts/widgets/share_own_qr.dart +++ b/dialer/lib/features/contacts/widgets/share_own_qr.dart @@ -1,7 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_contacts/contact.dart'; -import 'package:qr_flutter/qr_flutter.dart'; +import 'package:dialer/services/contact_service.dart'; class QRCodeButton extends StatelessWidget { final List contacts; @@ -23,32 +23,13 @@ class QRCodeButton extends StatelessWidget { @override Widget build(BuildContext context) { - return IconButton( icon: Icon(Icons.qr_code, color: selfContact != null ? Colors.blue : Colors.grey), onPressed: selfContact != null ? () { - showDialog( - barrierColor: Colors.white24, - context: context, - barrierDismissible: true, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: Colors.black, - content: SizedBox( - width: 200, - height: 220, - child: QrImageView( - data: selfContact!.toVCard(), - version: QrVersions.auto, - backgroundColor: Colors.white, // Ensure QR code is visible on black background - size: 200.0, - ), - ), - ); - }, - ); - } + // Use the ContactService to show the QR code + ContactService().showContactQRCodeDialog(context, selfContact!); + } : null, ); } diff --git a/dialer/lib/services/contact_service.dart b/dialer/lib/services/contact_service.dart index 61d365d..ef00185 100644 --- a/dialer/lib/services/contact_service.dart +++ b/dialer/lib/services/contact_service.dart @@ -1,4 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; +import 'package:qr_flutter/qr_flutter.dart'; // Service to manage contact-related operations class ContactService { @@ -15,17 +17,35 @@ class ContactService { } Future> fetchFavoriteContacts() async { - // Fetch all contacts List contacts = await fetchContacts(); - - // Filter contacts to only include those with isStarred: true - List favoriteContacts = - contacts.where((contact) => contact.isStarred).toList(); - - return favoriteContacts; + return contacts.where((contact) => contact.isStarred).toList(); } Future addNewContact(Contact contact) async { await FlutterContacts.insertContact(contact); } + + // Function to show an AlertDialog with a QR code for the contact's vCard + void showContactQRCodeDialog(BuildContext context, Contact contact) { + showDialog( + barrierColor: Colors.white24, + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: Colors.black, + content: SizedBox( + width: 200, + height: 220, + child: QrImageView( + data: contact.toVCard(), // Generate vCard QR code + version: QrVersions.auto, + backgroundColor: Colors.white, // Make sure QR code is visible on black background + size: 200.0, + ), + ), + ); + }, + ); + } }