TF-1994 Enable long press to copy an email address in email view

(cherry picked from commit 8af88c0091f7e3489a641fb798fbe96c27a2c5fa)
This commit is contained in:
dab246
2023-07-10 14:39:52 +07:00
committed by Dat Vu
parent c70c09ff6c
commit 99693b8f4a
5 changed files with 27 additions and 6 deletions
@@ -3,11 +3,13 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
typedef OnTapMaterialTextButton = Function();
typedef OnLongPressMaterialTextButton = Function();
class MaterialTextButton extends StatelessWidget {
final String label;
final OnTapMaterialTextButton? onTap;
final OnLongPressMaterialTextButton? onLongPress;
final double borderRadius;
final Color? labelColor;
final double labelSize;
@@ -21,6 +23,7 @@ class MaterialTextButton extends StatelessWidget {
Key? key,
required this.label,
required this.onTap,
this.onLongPress,
this.borderRadius = 12,
this.labelColor,
this.labelSize = 15,
@@ -37,6 +40,7 @@ class MaterialTextButton extends StatelessWidget {
color: Colors.transparent,
child: InkWell(
onTap: onTap,
onLongPress: onLongPress,
customBorder: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)),
child: Padding(
padding: padding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 5),
@@ -72,6 +72,7 @@ import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'package:uuid/uuid.dart';
class SingleEmailController extends BaseController with AppLoaderMixin {
@@ -950,12 +951,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void copyEmailAddress(BuildContext context, EmailAddress emailAddress) {
popBack();
Clipboard.setData(ClipboardData(text: emailAddress.emailAddress)).then((_){
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(AppLocalizations.of(context).email_address_copied_to_clipboard))
);
});
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
}
void composeEmailFromEmailAddress(EmailAddress emailAddress) {
@@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/base/widget/material_text_button.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class EmailReceiverBuilder extends StatelessWidget {
@@ -190,6 +191,9 @@ class EmailReceiverBuilder extends StatelessWidget {
? emailAddress.asString()
: '${emailAddress.asString()},',
onTap: () => controller.openEmailAddressDialog(context, emailAddress),
onLongPress: () {
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
},
borderRadius: 8,
labelColor: Colors.black,
labelSize: 16,
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/base/widget/material_text_button.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnOpenEmailAddressDetailAction = Function(BuildContext context, EmailAddress emailAddress);
@@ -32,6 +33,9 @@ class EmailSenderBuilder extends StatelessWidget {
MaterialTextButton(
label: emailAddress.displayName,
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
onLongPress: () {
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
},
borderRadius: 8,
padding: const EdgeInsets.all(3),
labelSize: 20,
@@ -45,6 +49,9 @@ class EmailSenderBuilder extends StatelessWidget {
child: MaterialTextButton(
label: '<${emailAddress.emailAddress}>',
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
onLongPress: () {
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
},
borderRadius: 8,
padding: const EdgeInsets.all(3),
labelSize: 16,
+10
View File
@@ -1,6 +1,8 @@
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:intl/intl.dart' as intl;
@@ -38,4 +40,12 @@ class AppUtils {
static bool isEmailLocalhost(String email) {
return RegExp(r'^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@localhost$').hasMatch(email);
}
static void copyEmailAddressToClipboard(BuildContext context, String emailAddress) {
Clipboard.setData(ClipboardData(text: emailAddress)).then((_){
ScaffoldMessenger.maybeOf(context)?.showSnackBar(
SnackBar(content: Text(AppLocalizations.of(context).email_address_copied_to_clipboard))
);
});
}
}