Implement reactivate email API call

This commit is contained in:
Hillel Coren 2023-11-16 16:17:32 +02:00
parent fc24804211
commit 3357341605
1 changed files with 50 additions and 36 deletions

View File

@ -115,7 +115,7 @@ class InvoiceEditContacts extends StatelessWidget {
} }
} }
class _ContactListTile extends StatelessWidget { class _ContactListTile extends StatefulWidget {
const _ContactListTile({ const _ContactListTile({
required this.fullName, required this.fullName,
required this.email, required this.email,
@ -132,6 +132,13 @@ class _ContactListTile extends StatelessWidget {
final InvitationEntity? invitation; final InvitationEntity? invitation;
final Function? onTap; final Function? onTap;
@override
State<_ContactListTile> createState() => _ContactListTileState();
}
class _ContactListTileState extends State<_ContactListTile> {
bool _showEmailError = true;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final localization = AppLocalization.of(context)!; final localization = AppLocalization.of(context)!;
@ -152,7 +159,7 @@ class _ContactListTile extends StatelessWidget {
: SizedBox(); : SizedBox();
*/ */
final invitationButton = (invitation?.link ?? '').isNotEmpty final invitationButton = (widget.invitation?.link ?? '').isNotEmpty
? PopupMenuButton<String>( ? PopupMenuButton<String>(
icon: Icon(Icons.more_vert), icon: Icon(Icons.more_vert),
itemBuilder: (BuildContext context) { itemBuilder: (BuildContext context) {
@ -174,16 +181,16 @@ class _ContactListTile extends StatelessWidget {
]; ];
}, },
onSelected: (String action) { onSelected: (String action) {
var viewLinkWithHash = invitation!.silentLink; var viewLinkWithHash = widget.invitation!.silentLink;
if (!viewLinkWithHash.contains('?')) { if (!viewLinkWithHash.contains('?')) {
viewLinkWithHash += '?'; viewLinkWithHash += '?';
} }
viewLinkWithHash += '&client_hash=$hash'; viewLinkWithHash += '&client_hash=${widget.hash}';
if (action == localization.viewPortal) { if (action == localization.viewPortal) {
launchUrl(Uri.parse(viewLinkWithHash)); launchUrl(Uri.parse(viewLinkWithHash));
} else if (action == localization.copyLink) { } else if (action == localization.copyLink) {
Clipboard.setData(ClipboardData(text: invitation!.link)); Clipboard.setData(ClipboardData(text: widget.invitation!.link));
showToast( showToast(
localization.copiedToClipboard.replaceFirst(':value ', '')); localization.copiedToClipboard.replaceFirst(':value ', ''));
} else if (action == localization.reactivateEmail) { } else if (action == localization.reactivateEmail) {
@ -202,8 +209,8 @@ class _ContactListTile extends StatelessWidget {
children: [ children: [
Checkbox( Checkbox(
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context).colorScheme.secondary,
value: invitation != null, value: widget.invitation != null,
onChanged: (value) => onTap!(), onChanged: (value) => widget.onTap!(),
), ),
if (store.state.prefState.showPdfPreviewSideBySide) if (store.state.prefState.showPdfPreviewSideBySide)
invitationButton, invitationButton,
@ -215,33 +222,36 @@ class _ContactListTile extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Text( Text(
fullName.isNotEmpty widget.fullName.isNotEmpty
? fullName ? widget.fullName
: AppLocalization.of(context)!.blankContact, : AppLocalization.of(context)!.blankContact,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
if (email.isNotEmpty) ...[ if (widget.email.isNotEmpty) ...[
Padding( Padding(
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(top: 4),
child: Text( child: Text(
email, widget.email,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
), ),
if ((invitation?.emailStatus ?? '').isNotEmpty) if ((widget.invitation?.emailStatus ?? '').isNotEmpty)
Padding( Padding(
padding: const EdgeInsets.only(top: 2), padding: const EdgeInsets.only(top: 2),
child: Text( child: Text(
localization.lookup(invitation!.latestEmailStatus) + localization
.lookup(widget.invitation!.latestEmailStatus) +
'' + '' +
formatDate( formatDate(widget.invitation!.latestEmailStatusDate,
invitation!.latestEmailStatusDate, context), context),
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
), ),
if ((invitation?.emailError ?? '').isNotEmpty && if ((widget.invitation?.emailError ?? '').isNotEmpty &&
invitation?.emailStatus != widget.invitation?.emailStatus !=
InvitationEntity.EMAIL_STATUS_DELIVERED) ...[ InvitationEntity.EMAIL_STATUS_DELIVERED &&
_showEmailError) ...[
if (state.isHosted) ...[
SizedBox(height: 16), SizedBox(height: 16),
OutlinedButton( OutlinedButton(
onPressed: () { onPressed: () {
@ -249,19 +259,23 @@ class _ContactListTile extends StatelessWidget {
store.dispatch(StartSaving()); store.dispatch(StartSaving());
WebClient() WebClient()
.post( .post(
'${credentials.url}/reactivate_email/${invitation!.messageId}', '${credentials.url}/reactivate_email/${widget.invitation!.messageId}',
credentials.token) credentials.token)
.then((value) { .then((value) {
store.dispatch(StopSaving()); store.dispatch(StopSaving());
showToast(localization.emailReactivated); showToast(localization.emailReactivated);
setState(() {
_showEmailError = false;
});
}).catchError((error) { }).catchError((error) {
store.dispatch(StopSaving()); store.dispatch(StopSaving());
}); });
}, },
child: Text(localization.reactivateEmail)), child: Text(localization.reactivateEmail)),
],
SizedBox(height: 16), SizedBox(height: 16),
Text( Text(
invitation!.emailError, widget.invitation!.emailError,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
], ],