diff --git a/lib/features/composer/presentation/extensions/email_action_type_extension.dart b/lib/features/composer/presentation/extensions/email_action_type_extension.dart index 95551ce06..b1cecef92 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -33,6 +33,8 @@ extension EmailActionTypeExtension on EmailActionType { case EmailActionType.editSendingEmail: case EmailActionType.reopenComposerBrowser: case EmailActionType.editAsNewEmail: + case EmailActionType.composeFromMailtoUri: + case EmailActionType.composeFromUnsubscribeMailtoLink: return subject; default: return ''; diff --git a/lib/main/routes/route_utils.dart b/lib/main/routes/route_utils.dart index 494539da4..554739f03 100644 --- a/lib/main/routes/route_utils.dart +++ b/lib/main/routes/route_utils.dart @@ -204,6 +204,11 @@ abstract class RouteUtils { mapMailto[paramSubject] = subject; mapMailto[paramBody] = body; } else if (parsedMailToUri?.path == "/$mailtoPrefix" || parsedMailToUri?.path == "/$mailtoPrefix/") { + final uriPrefixQueryParam = parsedMailToUri?.queryParameters[uriPrefix] ?? ''; + final uriFromUriPrefixQueryParam = Uri.tryParse(uriPrefixQueryParam); + if (uriFromUriPrefixQueryParam?.queryParameters.isNotEmpty == true) { + return parseMapMailtoFromUri(mailtoUri?.split('?uri=').last); + } final to = { ...?parsedMailToUri?.queryParameters[uriPrefix]?.split('$mailtoPrefix:').last.split(ADDRESS_SEPARATOR), ...?parsedMailToUri?.queryParameters[paramTo]?.split(ADDRESS_SEPARATOR) diff --git a/test/main/routes/route_utils_test.dart b/test/main/routes/route_utils_test.dart index 5227bbaa1..ee587d31f 100644 --- a/test/main/routes/route_utils_test.dart +++ b/test/main/routes/route_utils_test.dart @@ -224,5 +224,33 @@ void main() { equals(body) ); }); + + test( + 'should parse url with mailto uri ' + 'when the query parameter belongs to the mailto uri', + () { + // arrange + const to = 'to@example.com'; + const cc1 = 'cc1@example.com', cc2 = 'cc2@example.com'; + const bcc1 = 'bcc1@example.com', bcc2 = 'bcc2@example.com'; + const subject = 'Hello'; + const body = 'Bye'; + const mailtoUri = 'https://example.com/mailto/' + '?uri=mailto:$to' + '?subject=$subject' + '&cc=$cc1,$cc2' + '&bcc=$bcc1,$bcc2' + '&body=$body'; + + // act + final result = RouteUtils.parseMapMailtoFromUri(mailtoUri); + + // assert + expect(result[RouteUtils.paramMailtoAddress], equals(to)); + expect(result[RouteUtils.paramCc], containsAll([cc1, cc2])); + expect(result[RouteUtils.paramBcc], containsAll([bcc1, bcc2])); + expect(result[RouteUtils.paramSubject], equals(subject)); + expect(result[RouteUtils.paramBody], equals(body)); + }); }); } \ No newline at end of file