TF-3219 display limits of email recovery in a yellow banner and filter out invalid suggestions

This commit is contained in:
Florent Azavant
2024-11-14 15:13:56 +01:00
committed by Dat H. Pham
parent 2fcb5f03d0
commit 68e9fc2f16
15 changed files with 270 additions and 13 deletions
@@ -28,7 +28,7 @@ enum EmailRecoveryField {
String getHintText(BuildContext context) {
switch (this) {
case EmailRecoveryField.deletionDate:
return AppLocalizations.of(context).last1Year;
return AppLocalizations.of(context).last7Days;
case EmailRecoveryField.receptionDate:
return AppLocalizations.of(context).allTime;
case EmailRecoveryField.subject:
@@ -40,16 +40,20 @@ enum EmailRecoveryField {
}
}
List<EmailRecoveryTimeType> getSupportedTimeTypes() {
List<EmailRecoveryTimeType> getSupportedTimeTypes(DateTime restorationHorizon) {
switch (this) {
case EmailRecoveryField.deletionDate:
return [
EmailRecoveryTimeType.last1Year,
final supportedTypes = [
EmailRecoveryTimeType.last7Days,
EmailRecoveryTimeType.last15Days,
EmailRecoveryTimeType.last30Days,
EmailRecoveryTimeType.last6Months,
EmailRecoveryTimeType.customRange,
];
EmailRecoveryTimeType.last1Year,
].where((type) => restorationHorizon
.subtract(const Duration(seconds: 2)) // to allow "15 days" if restorationHorizon is exactly 15
.isBefore(type.toOldestUTCDate()!.value)).toList();
return [...supportedTypes, EmailRecoveryTimeType.customRange];
case EmailRecoveryField.receptionDate:
return [
EmailRecoveryTimeType.allTime,
@@ -6,6 +6,7 @@ import 'package:jmap_dart_client/jmap/core/utc_date.dart';
enum EmailRecoveryTimeType {
allTime,
last7Days,
last15Days,
last30Days,
last6Months,
last1Year,
@@ -18,6 +19,8 @@ enum EmailRecoveryTimeType {
return AppLocalizations.of(context).allTime;
case EmailRecoveryTimeType.last7Days:
return AppLocalizations.of(context).last7Days;
case EmailRecoveryTimeType.last15Days:
return AppLocalizations.of(context).last15Days;
case EmailRecoveryTimeType.last30Days:
return AppLocalizations.of(context).last30Days;
case EmailRecoveryTimeType.last6Months:
@@ -47,6 +50,10 @@ enum EmailRecoveryTimeType {
final today = DateTime.now();
final last7Days = today.subtract(const Duration(days: 7));
return last7Days.toUTCDate();
case EmailRecoveryTimeType.last15Days:
final today = DateTime.now();
final last15Days = today.subtract(const Duration(days: 15));
return last15Days.toUTCDate();
case EmailRecoveryTimeType.last30Days:
final today = DateTime.now();
final last30Days = today.subtract(const Duration(days: 30));
@@ -68,6 +75,7 @@ enum EmailRecoveryTimeType {
UTCDate? toLatestUTCDate() {
switch(this) {
case EmailRecoveryTimeType.last7Days:
case EmailRecoveryTimeType.last15Days:
case EmailRecoveryTimeType.last30Days:
case EmailRecoveryTimeType.last6Months:
case EmailRecoveryTimeType.last1Year:
@@ -0,0 +1,42 @@
import 'package:duration/duration.dart';
import 'package:email_recovery/email_recovery/capability_deleted_messages_vault.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:model/extensions/session_extension.dart';
extension SessionExtension on Session {
String getRestorationHorizonAsString() {
String restorationHorizon = 'restorationHorizon';
String defaultHorizon = "15 days";
return (getCapabilityProperties(accountId, capabilityDeletedMessagesVault)
?.props[0] as Map<String, dynamic>?)
?[restorationHorizon]
?? defaultHorizon;
}
Duration getRestorationHorizonAsDuration() {
try {
String horizonWithCorrectFormat = getRestorationHorizonAsString()
.replaceAll(" days", "d")
.replaceAll(" day", "d")
.replaceAll(" hours", "h")
.replaceAll(" hour", "h")
.replaceAll(" minutes", "m")
.replaceAll(" minute", "m")
.replaceAll(" seconds", "s")
.replaceAll(" second", "s")
.replaceAll(" milliseconds", "ms")
.replaceAll(" millisecond", "ms");
return parseDuration(horizonWithCorrectFormat, separator: ' ');
} catch (e) {
return const Duration(days: 15);
}
}
DateTime getRestorationHorizonAsDateTime() {
return DateTime.now().subtract(getRestorationHorizonAsDuration());
}
}