From d7713a9c68d62457fcf66fa99a5d545e81dfb39c Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 16 Nov 2023 13:41:32 +0200 Subject: [PATCH] Change to dropdown with copy/open/reactivate --- .../invoice/edit/invoice_edit_contacts.dart | 57 +++++++++++++++++++ lib/utils/i18n.dart | 5 ++ 2 files changed, 62 insertions(+) diff --git a/lib/ui/invoice/edit/invoice_edit_contacts.dart b/lib/ui/invoice/edit/invoice_edit_contacts.dart index fd202e6b9..9fc710598 100644 --- a/lib/ui/invoice/edit/invoice_edit_contacts.dart +++ b/lib/ui/invoice/edit/invoice_edit_contacts.dart @@ -8,10 +8,12 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; +import 'package:invoiceninja_flutter/ui/app/icon_text.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; +import 'package:url_launcher/url_launcher.dart'; class InvoiceEditContacts extends StatelessWidget { const InvoiceEditContacts({ @@ -61,6 +63,7 @@ class InvoiceEditContacts extends StatelessWidget { return _ContactListTile( fullName: contact.fullName, email: contact.email, + hash: '', invoice: invoice, invitation: invitation, onTap: () => invitation == null @@ -97,6 +100,7 @@ class InvoiceEditContacts extends StatelessWidget { return _ContactListTile( fullName: contact.fullName, email: contact.email, + hash: client?.clientHash ?? '', invoice: invoice, invitation: invitation, onTap: () => invitation == null @@ -114,12 +118,14 @@ class _ContactListTile extends StatelessWidget { required this.fullName, required this.email, required this.invoice, + required this.hash, this.invitation, this.onTap, }); final String fullName; final String email; + final String hash; final InvoiceEntity invoice; final InvitationEntity? invitation; final Function? onTap; @@ -128,6 +134,8 @@ class _ContactListTile extends StatelessWidget { Widget build(BuildContext context) { final localization = AppLocalization.of(context)!; final store = StoreProvider.of(context); + + /* final invitationButton = (invitation?.link ?? '').isNotEmpty ? IconButton( tooltip: localization.copyLink, @@ -139,6 +147,55 @@ class _ContactListTile extends StatelessWidget { }, ) : SizedBox(); + */ + + final invitationButton = (invitation?.link ?? '').isNotEmpty + ? PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (BuildContext context) { + return [ + PopupMenuItem( + child: IconText( + text: localization.viewPortal, + icon: Icons.open_in_new, + ), + value: localization.viewPortal, + ), + PopupMenuItem( + child: IconText( + text: localization.copyLink, + icon: Icons.copy, + ), + value: localization.copyLink, + ), + PopupMenuItem( + child: IconText( + text: localization.reactivateEmail, + icon: Icons.check_circle, + ), + value: localization.reactivateEmail, + ), + ]; + }, + onSelected: (String action) { + var viewLinkWithHash = invitation!.silentLink; + if (!viewLinkWithHash.contains('?')) { + viewLinkWithHash += '?'; + } + viewLinkWithHash += '&client_hash=$hash'; + + if (action == localization.viewPortal) { + launchUrl(Uri.parse(viewLinkWithHash)); + } else if (action == localization.copyLink) { + Clipboard.setData(ClipboardData(text: invitation!.link)); + showToast( + localization.copiedToClipboard.replaceFirst(':value ', '')); + } else if (action == localization.reactivateEmail) { + // + } + }, + ) + : SizedBox(); return Padding( padding: const EdgeInsets.all(10), diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index f88f95f22..211ec049e 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'reactivate_email': 'Reactivate Email', 'template_help': 'Enable using the design as a template', 'delivery_note_design': 'Delivery Note Design', 'statement_design': 'Statement Design', @@ -109970,6 +109971,10 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]!['template_help'] ?? _localizedValues['en']!['template_help']!; + String get reactivateEmail => + _localizedValues[localeCode]!['reactivate_email'] ?? + _localizedValues['en']!['reactivate_email']!; + // STARTER: lang field - do not remove comment String lookup(String? key) {