TF-1994 Enable long press to copy an email address in email view
(cherry picked from commit 8af88c0091f7e3489a641fb798fbe96c27a2c5fa)
This commit is contained in:
@@ -3,11 +3,13 @@ import 'package:core/presentation/extensions/color_extension.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
typedef OnTapMaterialTextButton = Function();
|
typedef OnTapMaterialTextButton = Function();
|
||||||
|
typedef OnLongPressMaterialTextButton = Function();
|
||||||
|
|
||||||
class MaterialTextButton extends StatelessWidget {
|
class MaterialTextButton extends StatelessWidget {
|
||||||
|
|
||||||
final String label;
|
final String label;
|
||||||
final OnTapMaterialTextButton? onTap;
|
final OnTapMaterialTextButton? onTap;
|
||||||
|
final OnLongPressMaterialTextButton? onLongPress;
|
||||||
final double borderRadius;
|
final double borderRadius;
|
||||||
final Color? labelColor;
|
final Color? labelColor;
|
||||||
final double labelSize;
|
final double labelSize;
|
||||||
@@ -21,6 +23,7 @@ class MaterialTextButton extends StatelessWidget {
|
|||||||
Key? key,
|
Key? key,
|
||||||
required this.label,
|
required this.label,
|
||||||
required this.onTap,
|
required this.onTap,
|
||||||
|
this.onLongPress,
|
||||||
this.borderRadius = 12,
|
this.borderRadius = 12,
|
||||||
this.labelColor,
|
this.labelColor,
|
||||||
this.labelSize = 15,
|
this.labelSize = 15,
|
||||||
@@ -37,6 +40,7 @@ class MaterialTextButton extends StatelessWidget {
|
|||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
|
onLongPress: onLongPress,
|
||||||
customBorder: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)),
|
customBorder: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: padding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 5),
|
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/navigation_router.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.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/routes/route_utils.dart';
|
||||||
|
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
class SingleEmailController extends BaseController with AppLoaderMixin {
|
class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||||
@@ -950,12 +951,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
|
|
||||||
void copyEmailAddress(BuildContext context, EmailAddress emailAddress) {
|
void copyEmailAddress(BuildContext context, EmailAddress emailAddress) {
|
||||||
popBack();
|
popBack();
|
||||||
|
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
|
||||||
Clipboard.setData(ClipboardData(text: emailAddress.emailAddress)).then((_){
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(content: Text(AppLocalizations.of(context).email_address_copied_to_clipboard))
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void composeEmailFromEmailAddress(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/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/features/email/presentation/controller/single_email_controller.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.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 {
|
class EmailReceiverBuilder extends StatelessWidget {
|
||||||
|
|
||||||
@@ -190,6 +191,9 @@ class EmailReceiverBuilder extends StatelessWidget {
|
|||||||
? emailAddress.asString()
|
? emailAddress.asString()
|
||||||
: '${emailAddress.asString()},',
|
: '${emailAddress.asString()},',
|
||||||
onTap: () => controller.openEmailAddressDialog(context, emailAddress),
|
onTap: () => controller.openEmailAddressDialog(context, emailAddress),
|
||||||
|
onLongPress: () {
|
||||||
|
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
|
||||||
|
},
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
labelColor: Colors.black,
|
labelColor: Colors.black,
|
||||||
labelSize: 16,
|
labelSize: 16,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
import 'package:model/extensions/email_address_extension.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/features/base/widget/material_text_button.dart';
|
||||||
|
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||||
|
|
||||||
typedef OnOpenEmailAddressDetailAction = Function(BuildContext context, EmailAddress emailAddress);
|
typedef OnOpenEmailAddressDetailAction = Function(BuildContext context, EmailAddress emailAddress);
|
||||||
|
|
||||||
@@ -32,6 +33,9 @@ class EmailSenderBuilder extends StatelessWidget {
|
|||||||
MaterialTextButton(
|
MaterialTextButton(
|
||||||
label: emailAddress.displayName,
|
label: emailAddress.displayName,
|
||||||
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
|
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
|
||||||
|
onLongPress: () {
|
||||||
|
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
|
||||||
|
},
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
padding: const EdgeInsets.all(3),
|
padding: const EdgeInsets.all(3),
|
||||||
labelSize: 20,
|
labelSize: 20,
|
||||||
@@ -45,6 +49,9 @@ class EmailSenderBuilder extends StatelessWidget {
|
|||||||
child: MaterialTextButton(
|
child: MaterialTextButton(
|
||||||
label: '<${emailAddress.emailAddress}>',
|
label: '<${emailAddress.emailAddress}>',
|
||||||
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
|
onTap: () => openEmailAddressDetailAction?.call(context, emailAddress),
|
||||||
|
onLongPress: () {
|
||||||
|
AppUtils.copyEmailAddressToClipboard(context, emailAddress.emailAddress);
|
||||||
|
},
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
padding: const EdgeInsets.all(3),
|
padding: const EdgeInsets.all(3),
|
||||||
labelSize: 16,
|
labelSize: 16,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import 'package:core/utils/platform_info.dart';
|
import 'package:core/utils/platform_info.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_dotenv/flutter_dotenv.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:tmail_ui_user/main/utils/app_config.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
import 'package:intl/intl.dart' as intl;
|
import 'package:intl/intl.dart' as intl;
|
||||||
@@ -38,4 +40,12 @@ class AppUtils {
|
|||||||
static bool isEmailLocalhost(String email) {
|
static bool isEmailLocalhost(String email) {
|
||||||
return RegExp(r'^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@localhost$').hasMatch(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))
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user