TF-4045 Add storage information in settings

This commit is contained in:
dab246
2025-10-01 14:23:17 +07:00
committed by Dat H. Pham
parent 0f3002879d
commit 075878f919
21 changed files with 605 additions and 37 deletions
+5
View File
@@ -0,0 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M17.1395 13.6987C17.0223 15.9353 13.8222 17.5 10 17.5C6.10573 17.5 2.85715 15.8757 2.85715 13.5714V6.42857L2.86047 6.30126C2.97769 4.06469 6.17784 2.5 10 2.5C13.8943 2.5 17.1429 4.12429 17.1429 6.42857V13.5714L17.1395 13.6987ZM15.7151 8.8325C14.4033 9.78273 12.3158 10.3571 10 10.3571C7.6846 10.3571 5.59746 9.78294 4.28566 8.83302L4.28572 10C4.28572 11.2461 6.79348 12.5 10 12.5C13.2065 12.5 15.7143 11.2461 15.7143 10L15.7151 8.8325ZM10 3.92857C6.79348 3.92857 4.28572 5.18245 4.28572 6.42857C4.28572 7.67469 6.79348 8.92857 10 8.92857C13.2065 8.92857 15.7143 7.67469 15.7143 6.42857C15.7143 5.18245 13.2065 3.92857 10 3.92857ZM15.7151 12.4039C14.4033 13.3542 12.3158 13.9286 10 13.9286C7.6846 13.9286 5.59746 13.3544 4.28566 12.4045L4.28572 13.5714L4.28941 13.6545C4.39752 14.8727 6.86473 16.0714 10 16.0714C13.2065 16.0714 15.7143 14.8175 15.7143 13.5714L15.7151 12.4039Z"
fill="#007AFF" />
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="16" height="16" rx="8" fill="#FF3347"/>
<path d="M8.64111 4L8.53955 9.69922H7.45752L7.35596 4H8.64111ZM8.00049 12.0742C7.78434 12.0742 7.59945 11.9987 7.4458 11.8477C7.29215 11.694 7.21663 11.5091 7.21924 11.293C7.21663 11.0794 7.29215 10.8971 7.4458 10.7461C7.59945 10.5924 7.78434 10.5156 8.00049 10.5156C8.21143 10.5156 8.39372 10.5924 8.54736 10.7461C8.70101 10.8971 8.77913 11.0794 8.78174 11.293C8.77913 11.4362 8.74137 11.5677 8.66846 11.6875C8.59814 11.8047 8.50439 11.8984 8.38721 11.9687C8.27002 12.0391 8.14111 12.0742 8.00049 12.0742Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 679 B

@@ -241,6 +241,7 @@ extension AppColor on Color {
static const m3Tertiary20 = Color(0xFF71767C);
static const m3Neutral70 = Color(0xFFAEAAAE);
static const m3Neutral90 = Color(0xFFE6E1E5);
static const m3Neutral40 = Color(0xFF605D62);
static const m3SysLightSecondaryBlue = Color(0xFF5C9CE6);
static const m3SysLight = Color(0xFF0157AD);
static const m3SysOutline = Color(0xFFAEAEC0);
@@ -279,6 +280,9 @@ extension AppColor on Color {
static const lightGreenBBF7D0 = Color(0xFFBBF7D0);
static const lightBlueEFF6FF = Color(0xFFEFF6FF);
static const lightBlueBFDBFE = Color(0xFFBFDBFE);
static const lightGrayF6FAFF = Color(0xFFF6FAFF);
static const lightGrayF7F6F9 = Color(0xFFF7F6F9);
static const blue25AEFE = Color(0xFF25AEFE);
static const mapGradientColor = [
[Color(0xFF21D4FD), Color(0xFFB721FF)],
@@ -249,6 +249,8 @@ class ImagePaths {
String get icPremium => _getImagePath('ic_premium.svg');
String get icCloud => _getImagePath('ic_cloud.svg');
String get icNoRules => _getImagePath('ic_no_rules.svg');
String get icStorage => _getImagePath('ic_storage.svg');
String get icWarning => _getImagePath('ic_warning.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
@@ -0,0 +1,17 @@
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
extension ValidateSettingCapabilitySupportedExtension
on ManageAccountDashBoardController {
bool get isStorageCapabilitySupported {
if (accountId.value != null && sessionCurrent != null) {
return CapabilityIdentifier.jmapQuota.isSupported(
sessionCurrent!,
accountId.value!,
);
} else {
return false;
}
}
}
@@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/notification/bindings/notification_binding.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller_bindings.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -213,6 +214,9 @@ class ManageAccountDashBoardController extends ReloadableController
case AccountMenuItem.notification:
NotificationBinding().dependencies();
break;
case AccountMenuItem.storage:
StorageBindings().dependencies();
break;
default:
break;
}
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/na
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
@@ -20,6 +21,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_a
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
@@ -167,6 +169,12 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
return const VacationView();
case AccountMenuItem.mailboxVisibility:
return MailboxVisibilityView();
case AccountMenuItem.storage:
if (controller.isStorageCapabilitySupported) {
return const StorageView();
} else {
return const SizedBox.shrink();
}
default:
return const SizedBox.shrink();
}
@@ -4,6 +4,7 @@ import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
@@ -48,6 +49,8 @@ class ManageAccountMenuController extends GetxController with ContactSupportMixi
AccountMenuItem.mailboxVisibility,
if (dashBoardController.isLanguageSettingDisplayed)
AccountMenuItem.languageAndRegion,
if (dashBoardController.isStorageCapabilitySupported)
AccountMenuItem.storage,
];
listAccountMenuItem.value = newListMenuSetting;
@@ -7,6 +7,7 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart';
@@ -169,6 +170,33 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
),
]);
}),
Obx(() {
if (controller.manageAccountDashboardController.isStorageCapabilitySupported) {
return Column(children: [
Divider(
color: AppColor.colorDividerHorizontal,
height: 1,
indent: SettingsUtils.getHorizontalPadding(
context,
controller.responsiveUtils,
),
endIndent: SettingsUtils.getHorizontalPadding(
context,
controller.responsiveUtils,
),
),
SettingFirstLevelTileBuilder(
key: const ValueKey('setting_storage'),
AccountMenuItem.storage.getName(AppLocalizations.of(context)),
AccountMenuItem.storage.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).storageSettingExplanation,
() => controller.selectSettings(AccountMenuItem.storage),
),
]);
} else {
return const SizedBox.shrink();
}
}),
Obx(() {
if (controller.manageAccountDashboardController.isFcmCapabilitySupported && PlatformInfo.isMobile) {
return Column(children: [
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
@@ -13,6 +14,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/notification/notification_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
@@ -137,6 +139,12 @@ class SettingsView extends GetWidget<SettingsController> {
return MailboxVisibilityView();
case AccountMenuItem.notification:
return const NotificationView();
case AccountMenuItem.storage:
if (controller.manageAccountDashboardController.isStorageCapabilitySupported) {
return const StorageView();
} else {
return const SizedBox.shrink();
}
default:
return const SizedBox.shrink();
}
@@ -12,6 +12,7 @@ enum AccountMenuItem {
mailboxVisibility,
notification,
contactSupport,
storage,
signOut,
none;
@@ -35,6 +36,8 @@ enum AccountMenuItem {
return imagePaths.icNotification;
case AccountMenuItem.contactSupport:
return imagePaths.icHelp;
case AccountMenuItem.storage:
return imagePaths.icStorage;
case AccountMenuItem.signOut:
return imagePaths.icSignOut;
case AccountMenuItem.none:
@@ -62,6 +65,8 @@ enum AccountMenuItem {
return appLocalizations.notification;
case AccountMenuItem.contactSupport:
return appLocalizations.contactSupport;
case AccountMenuItem.storage:
return appLocalizations.storageQuotas;
case AccountMenuItem.signOut:
return appLocalizations.sign_out;
case AccountMenuItem.none:
@@ -83,6 +88,8 @@ enum AccountMenuItem {
return appLocalizations.vacationSettingExplanation;
case AccountMenuItem.mailboxVisibility:
return appLocalizations.folderVisibilitySubtitle;
case AccountMenuItem.storage:
return appLocalizations.storageSettingExplanation;
default:
return '';
}
@@ -108,6 +115,8 @@ enum AccountMenuItem {
return 'notification';
case AccountMenuItem.contactSupport:
return 'contact-support';
case AccountMenuItem.storage:
return 'storage';
case AccountMenuItem.signOut:
return 'sign-out';
case AccountMenuItem.none:
@@ -0,0 +1,12 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_controller.dart';
import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_interactor_bindings.dart';
class StorageBindings extends Bindings {
@override
void dependencies() {
QuotasInteractorBindings().dependencies();
Get.lazyPut(() => StorageController(Get.find<GetQuotasInteractor>()));
}
}
@@ -0,0 +1,67 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/quotas/quota.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/quotas/domain/extensions/list_quotas_extensions.dart';
import 'package:tmail_ui_user/features/quotas/domain/state/get_quotas_state.dart';
import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart';
class StorageController extends BaseController {
final dashBoardController = Get.find<ManageAccountDashBoardController>();
final GetQuotasInteractor _getQuotasInteractor;
final octetsQuota = Rxn<Quota>();
StorageController(this._getQuotasInteractor);
@override
void onReady() {
final accountId = dashBoardController.accountId.value;
if(accountId != null) {
_getQuotasAction(accountId);
} else {
consumeState(
Stream.value(
Left(GetQuotasFailure(NotFoundAccountIdException())),
),
);
}
super.onReady();
}
void _getQuotasAction(AccountId accountId) {
consumeState(_getQuotasInteractor.execute(accountId));
}
void _handleGetQuotasSuccess(GetQuotasSuccess success) {
octetsQuota.value = success.quotas.octetsQuota;
}
void onUpgradeStorage() {
}
@override
void handleSuccessViewState(Success success) {
if (success is GetQuotasSuccess) {
_handleGetQuotasSuccess(success);
} else {
super.handleSuccessViewState(success);
}
}
@override
void handleFailureViewState(Failure failure) {
if (failure is GetQuotasFailure) {
octetsQuota.value = null;
} else {
super.handleFailureViewState(failure);
}
}
}
@@ -0,0 +1,107 @@
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/widgets/storage_progress_bar_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/storage/widgets/upgrade_storage_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_explanation_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart';
import 'package:tmail_ui_user/features/quotas/domain/extensions/quota_extensions.dart';
class StorageView extends GetWidget<StorageController> {
const StorageView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final responsiveUtils = controller.responsiveUtils;
final isMobile = responsiveUtils.isMobile(context);
final isDesktop = responsiveUtils.isDesktop(context);
final isWebDesktop = responsiveUtils.isWebDesktop(context);
return SettingDetailViewBuilder(
responsiveUtils: responsiveUtils,
child: Container(
color: SettingsUtils.getContentBackgroundColor(
context,
responsiveUtils,
),
decoration: SettingsUtils.getBoxDecorationForContent(
context,
responsiveUtils,
),
width: double.infinity,
padding: isDesktop
? const EdgeInsets.symmetric(vertical: 30, horizontal: 22)
: null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (isWebDesktop)
SettingHeaderWidget(
menuItem: AccountMenuItem.storage,
textStyle: ThemeUtils.textStyleInter600().copyWith(
color: Colors.black.withValues(alpha: 0.9),
),
padding: EdgeInsets.zero,
)
else
const SettingExplanationWidget(
menuItem: AccountMenuItem.storage,
padding: EdgeInsetsDirectional.only(
start: 16,
end: 16,
bottom: 16,
),
isCenter: true,
textAlign: TextAlign.center,
),
Expanded(
child: Padding(
padding: _getPadding(isMobile: isMobile, isDesktop: isDesktop),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Obx(() {
final octetsQuota = controller.octetsQuota.value;
if (octetsQuota != null && octetsQuota.storageAvailable) {
return StorageProgressBarWidget(
imagePaths: controller.imagePaths,
quota: octetsQuota,
isMobile: isMobile,
);
} else {
return const SizedBox.shrink();
}
}),
UpgradeStorageWidget(
imagePaths: controller.imagePaths,
isMobile: isMobile,
onUpgradeStorageAction: controller.onUpgradeStorage,
)
],
),
),
),
],
),
),
);
}
EdgeInsetsGeometry _getPadding({
bool isMobile = false,
bool isDesktop = false,
}) {
if (isMobile) {
return const EdgeInsetsDirectional.only(top: 31, start: 24, end: 24);
} else if (isDesktop) {
return const EdgeInsetsDirectional.only(top: 37, start: 15);
} else {
return const EdgeInsetsDirectional.only(top: 31, start: 32, end: 32);
}
}
}
@@ -0,0 +1,141 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:jmap_dart_client/jmap/quotas/quota.dart';
import 'package:tmail_ui_user/features/quotas/domain/extensions/quota_extensions.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class StorageProgressBarWidget extends StatelessWidget {
final ImagePaths imagePaths;
final Quota quota;
final bool isMobile;
const StorageProgressBarWidget({
super.key,
required this.imagePaths,
required this.quota,
this.isMobile = false,
});
@override
Widget build(BuildContext context) {
final appLocalizations = AppLocalizations.of(context);
final logoStorageWidget = Container(
width: 64,
height: 64,
decoration: const BoxDecoration(
color: AppColor.lightGrayF6FAFF,
borderRadius: BorderRadius.all(Radius.circular(100)),
),
alignment: Alignment.center,
child: SvgPicture.asset(
imagePaths.icCloud,
width: 30.72,
height: 30.72,
fit: BoxFit.fill,
),
);
final infoStorageWidgets = <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
quota.usedStorageAsString,
style: ThemeUtils.textStyleInter600().copyWith(
color: AppColor.m3SurfaceBackground,
fontSize: 18.13,
height: 22.66 / 18.13,
letterSpacing: 0.0,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
Expanded(
child: Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8,
),
child: Text(
appLocalizations.storageUsedMessage(
quota.hardLimitStorageAsString,
),
style: ThemeUtils.textStyleInter500().copyWith(
color: AppColor.m3Tertiary20,
fontSize: 9.06,
height: 13.6 / 9.06,
letterSpacing: 0.08,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
),
Text(
appLocalizations.storageAvailableMessage(
quota.quotaAvailableStorageAsString,
),
style: ThemeUtils.textStyleInter600().copyWith(
color: AppColor.m3Tertiary20,
fontSize: 9.06,
height: 13.6 / 9.06,
letterSpacing: 0.08,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
),
],
),
Container(
padding: const EdgeInsets.only(top: 5),
width: double.infinity,
child: LinearProgressIndicator(
color: quota.getQuotasStateProgressBarColor(
fromSetting: true,
),
minHeight: 4.53,
backgroundColor: AppColor.lightGrayF7F6F9,
borderRadius: const BorderRadius.all(
Radius.circular(13.03),
),
value: quota.usedStoragePercent,
),
),
];
return Container(
width: isMobile ? double.infinity : 439,
padding: const EdgeInsets.only(bottom: 16),
child: isMobile
? Column(
mainAxisSize: MainAxisSize.min,
children: [
logoStorageWidget,
const SizedBox(height: 8),
...infoStorageWidgets,
],
)
: Row(
children: [
logoStorageWidget,
const SizedBox(width: 24),
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
children: infoStorageWidgets,
),
),
],
),
);
}
}
@@ -0,0 +1,68 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/dialog/confirm_dialog_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class UpgradeStorageWidget extends StatelessWidget {
final ImagePaths imagePaths;
final bool isMobile;
final VoidCallback onUpgradeStorageAction;
const UpgradeStorageWidget({
super.key,
required this.imagePaths,
required this.onUpgradeStorageAction,
this.isMobile = false,
});
@override
Widget build(BuildContext context) {
final appLocalizations = AppLocalizations.of(context);
return SizedBox(
width: isMobile ? double.infinity : 439,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(
imagePaths.icWarning,
width: 16,
height: 16,
fit: BoxFit.fill,
),
const SizedBox(width: 7),
Expanded(
child: Text(
appLocalizations.storageIsAlmostFullMessage,
style: ThemeUtils.textStyleInter600().copyWith(
color: AppColor.m3Neutral40,
fontSize: 12,
height: 16 / 12,
letterSpacing: 0.4,
),
),
),
],
),
const SizedBox(height: 16),
Container(
constraints: const BoxConstraints(minWidth: 179),
height: 48,
child: ConfirmDialogButton(
label: appLocalizations.upgradeStorage,
backgroundColor: AppColor.primaryMain,
textColor: Colors.white,
onTapAction: onUpgradeStorageAction,
),
),
],
),
);
}
}
@@ -68,13 +68,13 @@ extension QuotasExtensions on Quota {
}
}
Color getQuotasStateProgressBarColor() {
Color getQuotasStateProgressBarColor({bool fromSetting = false}) {
if (isHardLimitReached) {
return AppColor.colorQuotaError;
} else if (isWarnLimitReached) {
return AppColor.colorBackgroundQuotasWarning;
} else {
return AppColor.blue400;
return fromSetting ? AppColor.blue25AEFE : AppColor.blue400;
}
}
@@ -1,43 +1,12 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/quotas/data/datasource/quotas_data_source.dart';
import 'package:tmail_ui_user/features/quotas/data/datasource_impl/quotas_data_source_impl.dart';
import 'package:tmail_ui_user/features/quotas/data/network/quotas_api.dart';
import 'package:tmail_ui_user/features/quotas/data/repository/quotas_repository_impl.dart';
import 'package:tmail_ui_user/features/quotas/domain/repository/quotas_repository.dart';
import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_controller.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
class QuotasBindings extends BaseBindings {
import 'package:tmail_ui_user/features/quotas/presentation/quotas_interactor_bindings.dart';
class QuotasBindings extends Bindings {
@override
void bindingsController() {
void dependencies() {
QuotasInteractorBindings().dependencies();
Get.put(QuotasController(Get.find<GetQuotasInteractor>()));
}
@override
void bindingsDataSource() {
Get.lazyPut<QuotasDataSource>(() => (Get.find<QuotasDataSourceImpl>()));
}
@override
void bindingsDataSourceImpl() {
Get.lazyPut(() => QuotasDataSourceImpl(Get.find<QuotasAPI>(), Get.find<RemoteExceptionThrower>()));
}
@override
void bindingsInteractor() {
Get.lazyPut(() => GetQuotasInteractor(Get.find<QuotasRepository>()));
}
@override
void bindingsRepository() {
Get.lazyPut<QuotasRepository>(() => Get.find<QuotasRepositoryImpl>());
}
@override
void bindingsRepositoryImpl() {
Get.lazyPut(() => QuotasRepositoryImpl(Get.find<QuotasDataSource>()));
}
}
@@ -0,0 +1,37 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/quotas/data/datasource/quotas_data_source.dart';
import 'package:tmail_ui_user/features/quotas/data/datasource_impl/quotas_data_source_impl.dart';
import 'package:tmail_ui_user/features/quotas/data/network/quotas_api.dart';
import 'package:tmail_ui_user/features/quotas/data/repository/quotas_repository_impl.dart';
import 'package:tmail_ui_user/features/quotas/domain/repository/quotas_repository.dart';
import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
class QuotasInteractorBindings extends InteractorsBindings {
@override
void bindingsDataSource() {
Get.lazyPut<QuotasDataSource>(() => (Get.find<QuotasDataSourceImpl>()));
}
@override
void bindingsDataSourceImpl() {
Get.lazyPut(() => QuotasDataSourceImpl(Get.find<QuotasAPI>(), Get.find<RemoteExceptionThrower>()));
}
@override
void bindingsInteractor() {
Get.lazyPut(() => GetQuotasInteractor(Get.find<QuotasRepository>()));
}
@override
void bindingsRepository() {
Get.lazyPut<QuotasRepository>(() => Get.find<QuotasRepositoryImpl>());
}
@override
void bindingsRepositoryImpl() {
Get.lazyPut(() => QuotasRepositoryImpl(Get.find<QuotasDataSource>()));
}
}
+38
View File
@@ -4887,5 +4887,43 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"storageSettingExplanation": "Monitor your available space.",
"@storageSettingExplanation": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"storageIsAlmostFullMessage": "The storage is almost full. You can free up space by deleting unnecessary files or subscribe to get extra space.",
"@storageIsAlmostFullMessage": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"upgradeStorage": "Upgrade storage",
"@upgradeStorage": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"storageUsedMessage": "of {limit} used",
"@storageUsedMessage": {
"type": "text",
"placeholders_order": [
"limit"
],
"placeholders": {
"limit": {}
}
},
"storageAvailableMessage": "Available: {count}",
"@storageAvailableMessage": {
"type": "text",
"placeholders_order": [
"count"
],
"placeholders": {
"count": {}
}
}
}
@@ -5161,4 +5161,41 @@ class AppLocalizations {
name: 'defaultIdentitySetupSuccessful',
);
}
String get storageSettingExplanation {
return Intl.message(
'Monitor your available space.',
name: 'storageSettingExplanation',
);
}
String get storageIsAlmostFullMessage {
return Intl.message(
'The storage is almost full. You can free up space by deleting unnecessary files or subscribe to get extra space.',
name: 'storageIsAlmostFullMessage',
);
}
String get upgradeStorage {
return Intl.message(
'Upgrade storage',
name: 'upgradeStorage',
);
}
String storageUsedMessage(String limit) {
return Intl.message(
'of $limit used',
name: 'storageUsedMessage',
args: [limit],
);
}
String storageAvailableMessage(String count) {
return Intl.message(
'Available: $count',
name: 'storageAvailableMessage',
args: [count],
);
}
}