Skip to content

Commit

Permalink
TF-1994 Enable long press to copy an email address in email view
Browse files Browse the repository at this point in the history
  • Loading branch information
dab246 committed Jul 12, 2023
1 parent 6fc90ba commit 8af88c0
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 6 deletions.
4 changes: 4 additions & 0 deletions lib/features/base/widget/material_text_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
10 changes: 10 additions & 0 deletions lib/main/utils/app_utils.dart
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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))
);
});
}
}

0 comments on commit 8af88c0

Please sign in to comment.