TF-4193 [Label] Config Label in Setting#4194
Conversation
|
@coderabbitai please review this |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis PR introduces a label visibility feature that gates label rendering behind both capability checks and user settings. It adds infrastructure for managing label visibility state through SharedPreferences, creates new state management classes and interactors, integrates label setting checks into email views and mailbox components, and extends the settings UI to allow users to toggle label visibility. Changes
Sequence DiagramsequenceDiagram
participant UI as Settings UI
participant Controller as ManageAccountDashboardController
participant LabelCtrl as LabelController
participant Interactor as GetLabelSettingStateInteractor
participant Repo as ManageAccountRepository
participant DS as DataSource<br/>(SettingCacheManager)
UI->>Controller: setUpLabelVisibility()
activate Controller
Controller->>Interactor: execute(accountId)
activate Interactor
Interactor->>Repo: getLabelSettingState()
activate Repo
Repo->>DS: getLabelSettingState()
activate DS
DS-->>Repo: isEnabled: bool
deactivate DS
Repo-->>Interactor: isEnabled
deactivate Repo
Interactor-->>Controller: GetLabelSettingStateSuccess(isEnabled, accountId)
deactivate Interactor
Controller->>LabelCtrl: isLabelSettingEnabled.value = isEnabled
Controller->>LabelCtrl: checkLabelSettingState(accountId)
activate LabelCtrl
Note over LabelCtrl: Fetch & cache labels
LabelCtrl-->>Controller: (state updated)
deactivate LabelCtrl
Controller->>UI: Update isLabelSettingEnabled flag
deactivate Controller
Note over UI: Conditionally render<br/>labels in views based on<br/>isLabelCapabilitySupported &&<br/>isLabelSettingEnabled
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@dab246: I'll review the changes in this PR right away. ✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (19)
test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart (1)
451-455: Label setting stubs keep existing tests stable; consider centralizing setupStubbing
labelController.isLabelSettingEnabledandlabelstoRxBool(false)/RxList([])in each test correctly neutralizes the new label UI dependency so these thread‑behavior tests remain focused and stable. To reduce repetition and ease future changes, you could move this common stubbing into a small helper used by all affected tests.Also applies to: 529-533, 594-598, 656-660, 714-718
lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart (1)
883-885: Label setting refresh hooks are correctly guardedCalling
labelController.checkLabelSettingState(...)only whenisLabelCapabilitySupportedis true andaccountIdis non‑null is a clean way to refresh label visibility both after initial session setup and when returning from settings/vacation flows. The three call sites are consistent and null‑safe. If this pattern expands further, you might consider a tiny helper likerefreshLabelSettingStateIfSupported()to avoid duplication, but it’s fine as‑is.Also applies to: 2056-2063, 2135-2142
lib/features/search/email/presentation/search_email_view.dart (1)
15-15: Search email tiles now respect label capability/setting without side effectsThe per‑tile logic that derives
emailLabelsonly when both capability and label setting are enabled is correct and matches the pattern used in other views. This keeps the search UI consistent with global label visibility while keeping the tiles self‑contained. If you find yourself repeating this block further, you could extract a small helper (e.g. on the controller) to resolve labels for aPresentationEmail, but that’s optional.Also applies to: 731-759
lib/features/thread/presentation/thread_view.dart (1)
8-8: Thread list tiles correctly adopt gated label renderingThe new logic in
_buildEmailItemNotDraggablethat conditionally computesemailLabelsbased onisLabelCapabilitySupportedandlabelController.isLabelSettingEnabled.isTrueis consistent with other views and keeps label usage safely behind the new setting. The draggable feedback still omits labels, which is consistent with previous behavior; you might optionally extend the same label handling there later if you want identical visuals while dragging.Also applies to: 597-627
lib/features/manage_account/presentation/preferences/preferences_controller.dart (1)
10-10: Label preference integration and controller source switch look consistentThe new
PreferencesOptionType.labelbranch in_updateLocalPreferencesSettingreuses the existing pattern of constructing a config (hereLabelConfig) withisEnabled: !isEnabled, matching how the other local options are toggled. Switching from the old private_manageAccountDashBoardControllertoaccountDashboardControllerforaccountId/sessionCurrentalso preserves the previous behavior for server‑side updates, with the same null‑checks before invoking_updateServerSettingInteractor. If you want to make this more testable in the future, you could injectManageAccountDashBoardControllerthrough the constructor instead ofGet.find, but the current approach is consistent with the rest of the codebase.Also applies to: 51-52, 121-129, 142-164, 186-203
lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart (1)
1-1: Remove unnecessary import.The
dart:corelibrary is imported automatically by Dart.-import 'dart:core'; - import 'package:core/presentation/state/failure.dart';lib/features/manage_account/domain/usecases/get_label_setting_state_interactor.dart (1)
1-1: Remove unnecessary import.The
dart:corelibrary is imported automatically by Dart.-import 'dart:core'; - import 'package:core/presentation/state/failure.dart';lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart (1)
1-1: Remove unnecessary import.The
dart:corelibrary is imported automatically by Dart.-import 'dart:core'; - import 'package:core/presentation/state/failure.dart';lib/features/manage_account/data/local/setting_cache_manager.dart (1)
10-13: Consider removing reload() for better performance.Calling
reload()before every read forces a synchronous read from persistent storage. IfgetLabelVisibility()is called frequently (e.g., when rendering email lists or mailboxes), this could introduce unnecessary I/O overhead.SharedPreferences maintains an in-memory cache that is automatically updated after writes. Consider relying on the in-memory cache and only calling
reload()when you specifically need to refresh data that may have been modified by another isolate or process.Future<bool> getLabelVisibility() async { - await _sharedPreferences.reload(); return _sharedPreferences.getBool(_labelVisibilitySettingKey) ?? false; }lib/features/manage_account/presentation/preferences/preferences_view.dart (2)
54-76: Multi-click gating logic on the preferences header looks soundYou correctly disable the multi-click when either the label is already visible or the capability isn’t supported, and wire
enableLabelVisibilityonly in the allowed case. This mirrors the SettingsView behavior and avoids repeated or invalid activations.If this pattern will be reused elsewhere (and it already appears in SettingsView), consider extracting a small helper/extension that returns
disableMultiClickfrom the dashboard controller to keep the logic centralized.
80-101: Label option visibility driven byisLabelVisibilityExcluding
PreferencesOptionType.labelfrom the generic local options and then conditionally appending it whenisLabelVisibility.isTruecleanly ties the option’s presence to the feature state. The mix of.valuein the header and.isTruehere is technically fine for anRxBool, but you may want to standardize on one style for readability.lib/features/manage_account/domain/state/save_label_visibility_state.dart (1)
1-10: State definitions align with existing pattern
SavingLabelVisibility,SaveLabelVisibilitySuccess, andSaveLabelVisibilityFailurefollow the existing Loading/UI/Failure conventions and should drop in cleanly with the interactor. No issues spotted.If other state classes in this layer use
constconstructors, you could mirror that for minor perf/readability benefits.lib/features/manage_account/presentation/menu/settings/settings_view.dart (1)
32-62: Reactive app bar + multi-click wiring is correct, but duplicated with preferences headerWrapping
SettingAppBarin anObxand drivingonMultiClickActionfromlabelVisibility || !isLabelCapabilitySupportedgives the right behavior: the multi-click is only available when it can meaningfully enable labels, and it deactivates once visibility is turned on.Since the
disableMultiClickcomputation is identical to the one inPreferencesView, consider centralizing it (e.g., as a getter/extension on the dashboard controller) to avoid future divergence.lib/features/manage_account/domain/model/preferences/label_config.dart (1)
1-30: LabelConfig model is straightforward and consistent
LabelConfigcleanly extendsPreferencesConfigwith a singleisEnabledflag, JSON support,initial()factory, and acopyWithextension. Equality viapropsmatches the current field set.You might consider making the constructor and
initial()factoryconst(if that’s consistent with other configs) to allow compile-time instances.lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart (1)
11-45: Consider tying enable/setup flow to capability and interactor success before showing toastThe extension wiring is sound, but two aspects are worth tightening:
enableLabelVisibility()andsetUpLabelVisibility()don’t consultisLabelCapabilitySupported, so a misplaced call could toggle local state and fire interactors even if labels aren’t supported.- The success toast in
enableLabelVisibility()is shown unconditionally once the interactor is triggered, regardless of whether saving actually succeeds.If feasible, consider:
- Early‑returning when
!isLabelCapabilitySupported, and/or- Emitting the “label feature is now available” toast only from the success branch of the save interactor’s state handling, rather than immediately after
execute().This would keep UI feedback aligned with actual capability and persistence state.
lib/features/manage_account/data/repository/manage_account_repository_impl.dart (1)
29-42: Repository delegations for label visibility and setting state look correctThe three new methods cleanly delegate to the data source and keep the interface in sync. Given both
getLabelVisibility()andgetLabelSettingState()returnbool, a short doc comment in the interface clarifying how “visibility” (cached UI preference) differs from “setting state” (stored in preferences) could help future readers, but the implementation itself is fine.lib/features/manage_account/data/local/preferences_setting_manager.dart (1)
6-23: LabelConfig integration into preferences manager is consistent
_preferencesSettingLabelKeyand the newswitchbranch inloadPreferences()correctly deserialize stored label config asLabelConfig._getPreferencesConfigKey+ the refactoredsavePreferences()keep per‑type key selection in one place, which should reduce future branching.getLabelConfig()/updateLabel()follow the same pattern as the thread/spam/text-formatting helpers and safely default toLabelConfig.initial()when nothing is stored.No functional issues here; the additions fit cleanly with the existing preferences infrastructure.
Also applies to: 40-61, 63-82, 144-160
lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart (1)
6-27: Data source wiring for label visibility and setting state is coherent
- Injecting
SettingCacheManagerand branching onLabelConfigintoggleLocalSettingsState()is consistent with how other preference types are handled.getLabelVisibility()/saveLabelVisibility()delegate to the cache manager with exception handling, andgetLabelSettingState()readsLabelConfig.isEnabledviaPreferencesSettingManager, which cleanly separates persisted preference from quick visibility cache.You might consider:
- Using the same
.catchError(_exceptionThrower.throwException)style as other methods for consistency, and- Ensuring all DI bindings constructing
ManageAccountDataSourceImplare updated to pass the newSettingCacheManagerparameter.Functionally, though, this looks correct.
Also applies to: 37-59, 71-100
lib/features/manage_account/presentation/manage_account_dashboard_controller.dart (1)
77-77: Consider renaming for clarity.The field name
isLabelVisibilitycould be more explicit. ConsiderisLabelVisibilityEnabledorlabelVisibilityEnabledto better convey that it represents an enabled/disabled state rather than just "visibility".Apply this diff if you prefer a clearer name:
- final isLabelVisibility = RxBool(false); + final isLabelVisibilityEnabled = RxBool(false);Note: This would require updating references in the extension and any UI code that consumes this field.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (38)
lib/features/email/presentation/email_view.dart(2 hunks)lib/features/labels/presentation/label_controller.dart(5 hunks)lib/features/mailbox/presentation/base_mailbox_view.dart(2 hunks)lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart(3 hunks)lib/features/manage_account/data/datasource/manage_account_datasource.dart(1 hunks)lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart(4 hunks)lib/features/manage_account/data/local/preferences_setting_manager.dart(5 hunks)lib/features/manage_account/data/local/setting_cache_manager.dart(1 hunks)lib/features/manage_account/data/repository/manage_account_repository_impl.dart(1 hunks)lib/features/manage_account/domain/model/preferences/label_config.dart(1 hunks)lib/features/manage_account/domain/model/preferences/preferences_setting.dart(2 hunks)lib/features/manage_account/domain/repository/manage_account_repository.dart(1 hunks)lib/features/manage_account/domain/state/get_label_setting_state.dart(1 hunks)lib/features/manage_account/domain/state/get_label_visibility_state.dart(1 hunks)lib/features/manage_account/domain/state/save_label_visibility_state.dart(1 hunks)lib/features/manage_account/domain/usecases/get_label_setting_state_interactor.dart(1 hunks)lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart(1 hunks)lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart(1 hunks)lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart(2 hunks)lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart(1 hunks)lib/features/manage_account/presentation/manage_account_dashboard_controller.dart(4 hunks)lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart(3 hunks)lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart(3 hunks)lib/features/manage_account/presentation/menu/settings/settings_view.dart(2 hunks)lib/features/manage_account/presentation/model/preferences_option_type.dart(5 hunks)lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart(1 hunks)lib/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart(2 hunks)lib/features/manage_account/presentation/preferences/preferences_controller.dart(5 hunks)lib/features/manage_account/presentation/preferences/preferences_view.dart(3 hunks)lib/features/manage_account/presentation/widgets/setting_header_widget.dart(2 hunks)lib/features/search/email/presentation/search_email_view.dart(2 hunks)lib/features/thread/presentation/thread_view.dart(2 hunks)lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart(3 hunks)lib/features/thread_detail/presentation/thread_detail_view.dart(2 hunks)lib/l10n/intl_messages.arb(2 hunks)lib/main/bindings/local/local_bindings.dart(2 hunks)lib/main/localizations/app_localizations.dart(1 hunks)test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart(5 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-12-08T08:11:08.985Z
Learnt from: dab246
Repo: linagora/tmail-flutter PR: 4189
File: lib/features/login/presentation/extensions/handle_company_server_login_info_extension.dart:50-56
Timestamp: 2025-12-08T08:11:08.985Z
Learning: In the tmail-flutter codebase, prefer descriptive variable names that include full context rather than abbreviated names. For example, `removeLoginInfoInteractor` is preferred over shorter alternatives like `removeInteractor` or `interactor`, as it clearly conveys both the action (remove) and the specific data being operated on (loginInfo).
Applied to files:
lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dartlib/features/labels/presentation/label_controller.dart
🔇 Additional comments (28)
lib/main/bindings/local/local_bindings.dart (1)
39-39: LGTM!The
SettingCacheManagerregistration follows the established pattern used by other cache managers in this file (e.g.,LocalSortOrderManager,LanguageCacheManager), correctly injectingSharedPreferencesas its dependency.Also applies to: 98-98
lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart (1)
16-28: LGTM!The binding order is correct—registering
GetLocalSettingsInteractorandUpdateLocalSettingsInteractorbeforePreferencesControllerensures the dependencies are available when the controller resolves them viaGet.find().lib/features/thread_detail/presentation/thread_detail_view.dart (1)
103-115: LGTM!The conditional logic correctly gates label rendering behind both capability support and user setting enablement. The values are properly extracted inside the
Obxblock ensuring reactivity whenisLabelSettingEnabledorlabelschange.lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart (1)
49-51: LGTM!The label logic mirrors the existing pattern for
subject(line 56), where the last email's data is displayed on the first (collapsed) email in the thread detail view. The null-safe checklabels?.isNotEmpty == trueensures the force-unwrap onlabels!is safe.lib/features/labels/presentation/label_controller.dart (4)
41-50: LGTM!The
checkLabelSettingStatemethod follows the established pattern in this controller for handling optional interactors. The fallback behavior (disabling and clearing data) ensures a consistent state when the interactor is unavailable.
150-152: LGTM!The failure handler correctly disables the label setting and clears data, maintaining a consistent fallback state when the setting cannot be retrieved.
158-164: LGTM!The
onClosecleanup properly nullifies the new_getLabelSettingStateInteractorreference, following the established pattern for other interactors in this controller.
122-129: LGTM!The success handler correctly coordinates enabling the setting state, injecting bindings, and loading labels in sequence. The conditional
if (isEnabled)prevents unnecessary binding injection and label fetching when the feature is disabled.GetX's
lazyPutsafely guards against duplicate registrations by using service type as the key. WheninjectLabelsBindings()is called multiple times, theLabelInteractorBindings().dependencies()method will attempt to register services vialazyPut, but GetX's internal mechanism will skip re-registration for already-registered types, making this approach idempotent and safe.lib/features/mailbox/presentation/base_mailbox_view.dart (1)
344-413: Label bar/list gating logic is consistent and safeUsing both
isLabelCapabilitySupportedandlabelController.isLabelSettingEnabled.isTruebefore rendering the label bar and list cleanly encapsulates the new visibility rule and avoids unnecessary label computations when disabled. The two builders are aligned and side‑effect free.lib/features/manage_account/domain/model/preferences/preferences_setting.dart (1)
3-3: LabelConfig getter mirrors existing pattern and is safe
labelConfigfollows the samefirstWhereOrNull + initial()pattern as the other config getters, so callers always get a validLabelConfigeven when none is stored yet. No functional issues here.Also applies to: 52-60
lib/features/email/presentation/email_view.dart (1)
12-12: Subject labels are now properly gated behind capability + settingThe conditional computation of
emailLabelsbased onisLabelCapabilitySupportedandlabelController.isLabelSettingEnabled.isTrueis aligned with the new global label‑visibility rules, and avoids unnecessary work when labels are disabled. Passing the (possibly null) list intoEmailSubjectWidgetkeeps the widget side responsible for rendering or omitting label chips.Also applies to: 252-275
lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart (1)
7-7: LGTM! Clean dependency wiring.The new dependencies are properly integrated:
- SettingCacheManager correctly injected into the data source
- Three new interactors follow the established binding pattern
- Interactor names are descriptive and align with the learning about preferring full context over abbreviations
Also applies to: 10-12, 29-29, 36-46
lib/features/manage_account/domain/state/get_label_visibility_state.dart (1)
1-17: LGTM! State classes follow established patterns.The three state classes (loading, success with visibility flag, failure with exception) are well-structured and consistent with similar state flows in the codebase.
lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart (1)
9-23: LGTM! Clean interactor implementation.The execute method properly emits loading, success, and failure states with appropriate error handling. The default
visible = trueparameter is a reasonable choice for this save operation.lib/features/manage_account/data/datasource/manage_account_datasource.dart (1)
13-17: LGTM! Clean interface extension.The three new methods have clear, consistent signatures that align well with the existing data source interface pattern.
lib/features/manage_account/domain/repository/manage_account_repository.dart (1)
13-17: LGTM! Repository interface is consistent.The three new methods align well with the data source interface and maintain consistent naming and return types.
lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart (1)
9-23: LGTM! Clean and consistent implementation.The interactor follows the established pattern with proper state emission and error handling.
lib/features/manage_account/data/local/setting_cache_manager.dart (1)
3-18: LGTM! Clean cache manager implementation.The implementation provides a straightforward interface for persisting label visibility. The default value of
falseis a safe choice, and the key naming follows good conventions.lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart (1)
16-27: Multi-click callback is only effective for non-universal settings
onMultiClickActionis correctly threaded intoSettingFirstLevelAppBarwhile the universal path still ignores it. That fits a design where the “secret” multi-click only applies on first-level pages; just confirm that you don’t also need it onUniversalSettingAppBar.Also applies to: 39-45
lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart (1)
30-42: Clean integration of multi-click on titleThe
titleWidgetrefactor plus conditionalMultiClickWidgetwrapping is clear and keeps behavior unchanged whenonMultiClickActionis null. Center alignment and padding remain intact.Also applies to: 61-64
lib/features/manage_account/presentation/widgets/setting_header_widget.dart (1)
12-20: Header multi-click behavior is well-containedThe
titleWidgetextraction plus conditionalMultiClickWidgetwrapping integrates multi-click cleanly without affecting the explanation block or overall layout. Public API change (newonMultiClickAction) is minimal and backwards compatible.Also applies to: 26-44
lib/main/localizations/app_localizations.dart (1)
5531-5558: Label visibility localization getters look consistentThe four new getters follow the existing Intl.message pattern, match the ARB keys, and the copy is clear and concise. No issues spotted.
lib/features/manage_account/domain/state/get_label_setting_state.dart (1)
1-19: Label setting state classes align with existing state patternLoading/success/failure states are structured consistently with other UIState/FeatureFailure usages (props implemented, AccountId carried in success). Looks good.
lib/features/manage_account/presentation/model/preferences_option_type.dart (1)
7-78: Newlabelpreference option is integrated consistentlyThe new
labelenum value is correctly handled in all switch methods and pulls its enabled state frompreferencesSetting.labelConfig.isEnabled, matching the localization keys you introduced. No issues from this file’s side.lib/l10n/intl_messages.arb (1)
5215-5238: Label visibility ARB entries match localization usageThe four new ARB keys and their metadata blocks are well-formed, use the same identifiers as in
AppLocalizations, and require no placeholders. The updated@@last_modifiedis fine. Looks good.lib/features/manage_account/presentation/manage_account_dashboard_controller.dart (3)
25-25: LGTM! Imports follow existing patterns.The new imports for label visibility state, interactors, and extension are properly organized and consistent with the existing code structure.
Also applies to: 28-29, 34-34
109-110: LGTM! Success handling follows established patterns.The handling of
GetLabelVisibilitySuccessis consistent with other success state handlers in this method and properly delegates to the extension.
68-69: The interactors are properly initialized before use.SettingInteractorBindings().dependencies()is called inmanage_account_dashboard_bindings.dart(line 13) before the controller is instantiated, and both thesetUpLabelVisibility()andenableLabelVisibility()extension methods safely retrieve interactors usinggetBinding<>()with null checks before execution. Unlike vacation and quota interactors which useGet.find<>()with try-catch in injector methods, the label visibility pattern usesgetBinding<>()upfront in the extension, which is a valid alternative approach with explicit null safety.Likely an incorrect or invalid review comment.
lib/features/manage_account/domain/usecases/get_label_setting_state_interactor.dart
Outdated
Show resolved
Hide resolved
lib/features/manage_account/presentation/manage_account_dashboard_controller.dart
Show resolved
Hide resolved
...tures/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart
Show resolved
Hide resolved
|
This PR has been deployed to https://linagora.github.io/tmail-flutter/4194. |
lib/features/manage_account/presentation/manage_account_dashboard_controller.dart
Outdated
Show resolved
Hide resolved
|
@coderabbitai Please check and remove |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 33030 🏁 Script executed: Length of output: 16509 @dab246: I've reviewed all the nitpick comments on this PR. Here's my analysis of which ones could be considered unnecessary and resolved: Recommendations for Resolution:Definitely Unnecessary (Can Resolve):
Optional but Valid (Your Choice):
Would you like me to resolve the clearly unnecessary nitpick comments (dart:core imports and naming suggestions)? The rest are optional refactoring suggestions that you can address or dismiss based on your team's preferences. |
We don't use const here because the parent class itself doesn't have const, it will give an error when we add const |
e62723c to
64170da
Compare
Seriously? What added value do we, as human, bring? |
lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart
Outdated
Show resolved
Hide resolved
lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart
Show resolved
Hide resolved
lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart
Show resolved
Hide resolved
…arify label resolution logic
Issue
#4193
Resolved
demo-web.mov
demo-mobile.webm
Summary by CodeRabbit
New Features
Localization
✏️ Tip: You can customize this high-level summary in your review settings.