TF-3479 Rename & separate function to make it readable and understand more about the case.

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-03-03 14:30:44 +07:00
committed by Dat H. Pham
parent 295dc8e49f
commit a7edd3a7c6
3 changed files with 135 additions and 127 deletions
@@ -39,7 +39,7 @@ extension UpdateScreenDisplayModeExtension on ComposerController {
final composerManager = mailboxDashBoardController.composerManager; final composerManager = mailboxDashBoardController.composerManager;
final screenWidth = responsiveUtils.getSizeScreenWidth(currentContext!); final screenWidth = responsiveUtils.getSizeScreenWidth(currentContext!);
composerManager.syncComposerStateWhenComposerDisplayModeChanged( composerManager.arrangeComposerWhenComposerDisplayModeChanged(
screenWidth: screenWidth, screenWidth: screenWidth,
updatedComposerId: composerId!, updatedComposerId: composerId!,
newDisplayMode: newDisplayMode, newDisplayMode: newDisplayMode,
@@ -1,6 +1,7 @@
import 'dart:collection'; import 'dart:collection';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
@@ -25,7 +26,7 @@ class ComposerManager extends GetxController {
composers[id] = ComposerView(key: Key(id), composerId: id); composers[id] = ComposerView(key: Key(id), composerId: id);
composerIdsQueue.add(id); composerIdsQueue.add(id);
_syncQueueIfNeeded(); _arrangeComposerIfNeeded();
} }
void removeComposer(String id) { void removeComposer(String id) {
@@ -35,47 +36,23 @@ class ComposerManager extends GetxController {
composers.remove(id); composers.remove(id);
ComposerBindings(composerId: id).dispose(); ComposerBindings(composerId: id).dispose();
_syncQueueIfNeeded(); _arrangeComposerIfNeeded();
} }
void _syncQueueIfNeeded() { void _arrangeComposerIfNeeded() {
if (currentContext != null && composerIdsQueue.isNotEmpty) { if (currentContext != null && composerIdsQueue.isNotEmpty) {
syncComposerStateWhenComposerQueueChanged( arrangeComposerWhenComposerQueueChanged(
screenWidth: _responsiveUtils.getSizeScreenWidth(currentContext!), screenWidth: _responsiveUtils.getSizeScreenWidth(currentContext!),
); );
} }
} }
({
String? previousTargetId,
String? targetId,
String? nextTargetId,
}) findSurroundingComposerIds(String targetId) {
var ids = composerIdsQueue.toList(),
index = ids.indexOf(targetId);
return index == -1
? (previousTargetId: null, targetId: null, nextTargetId: null)
: (
previousTargetId: index > 0 ? ids[index - 1] : null,
targetId: ids[index],
nextTargetId: index < ids.length - 1 ? ids[index + 1] : null
);
}
String? findFirstNormalComposerIdInQueue() {
return composerIdsQueue
.toList()
.reversed
.firstWhereOrNull((id) => getComposerView(id).controller.isNormalScreen);
}
( (
double availableWidth, double availableScreenWidth,
double totalWidth, double totalOpenedComposersWidth,
Map<String, ComposerController> composerControllers Map<String, ComposerController> composerControllers
) _setUpDataToSyncComposerQueue({required double screenWidth}) { ) _getSizeToArrangeComposer({required double screenWidth}) {
double totalWidth = 0; double totalOpenedComposersWidth = 0;
double countDisplayedComposer = 0; double countDisplayedComposer = 0;
final composerControllers = <String, ComposerController>{}; final composerControllers = <String, ComposerController>{};
@@ -86,39 +63,44 @@ class ComposerManager extends GetxController {
countDisplayedComposer++; countDisplayedComposer++;
} }
composerControllers[id] = controller; composerControllers[id] = controller;
totalWidth += composerWidth; totalOpenedComposersWidth += composerWidth;
} }
final availableWidth = screenWidth final availableScreenWidth = screenWidth
- ComposerStyle.composerExpandMoreButtonMaxWidth - ComposerStyle.composerExpandMoreButtonMaxWidth
- ComposerStyle.padding * 3 - ComposerStyle.padding * 2
- (countDisplayedComposer - 1) * ComposerStyle.space; - (countDisplayedComposer - 1) * ComposerStyle.space;
log('ComposerManager::_getSizeToArrangeComposers:screenWidth = $screenWidth | availableScreenWidth = $availableScreenWidth | totalOpenedComposersWidth = $totalOpenedComposersWidth');
return ( return (
availableWidth, availableScreenWidth,
totalWidth, totalOpenedComposersWidth,
composerControllers, composerControllers,
); );
} }
void syncComposerStateWhenComposerQueueChanged({required double screenWidth}) { void _showMinimizedComposersIfOverflow({
var (availableWidth, totalWidth, composerControllers) = required double availableScreenWidth,
_setUpDataToSyncComposerQueue(screenWidth: screenWidth); required double totalOpenedComposersWidth,
required Map<String, ComposerController> composerControllers,
if (totalWidth < availableWidth) { }) {
final currentHiddenComposerIds = hiddenComposerIds; final currentHiddenComposerIds = hiddenComposerIds;
if (currentHiddenComposerIds.isEmpty) return; if (currentHiddenComposerIds.isEmpty) return;
for (var index = currentHiddenComposerIds.length - 1; index >= 0; index--) { for (var index = currentHiddenComposerIds.length - 1; index >= 0; index--) {
final newTotalWidth = totalWidth + ComposerStyle.minimizeWidth; final newTotalWidth = totalOpenedComposersWidth + ComposerStyle.minimizeWidth;
if (newTotalWidth > availableWidth) break; if (newTotalWidth > availableScreenWidth) break;
final id = currentHiddenComposerIds.elementAt(index); final id = currentHiddenComposerIds.elementAt(index);
final controller = composerControllers[id]!; composerControllers[id]!.setScreenDisplayMode(ScreenDisplayMode.minimize);
controller.setScreenDisplayMode(ScreenDisplayMode.minimize); totalOpenedComposersWidth = newTotalWidth;
totalWidth = newTotalWidth;
} }
} else if (totalWidth > availableWidth) { }
void _hideComposersIfFit({
required double availableScreenWidth,
required double totalOpenedComposersWidth,
required Map<String, ComposerController> composerControllers,
}) {
final currentDisplayedComposerIds = displayedComposerIds; final currentDisplayedComposerIds = displayedComposerIds;
if (currentDisplayedComposerIds.isEmpty) return; if (currentDisplayedComposerIds.isEmpty) return;
@@ -126,82 +108,108 @@ class ComposerManager extends GetxController {
final controller = composerControllers[id]!; final controller = composerControllers[id]!;
if (controller.isNormalScreen) { if (controller.isNormalScreen) {
var newTotalWidth = totalWidth - (ComposerStyle.normalWidth - ComposerStyle.minimizeWidth); var newTotalWidth = totalOpenedComposersWidth - (ComposerStyle.normalWidth - ComposerStyle.minimizeWidth);
var newDisplayMode = ScreenDisplayMode.minimize; var newDisplayMode = ScreenDisplayMode.minimize;
if (newTotalWidth > availableWidth) { if (newTotalWidth > availableScreenWidth) {
newTotalWidth = totalWidth - ComposerStyle.normalWidth; newTotalWidth = totalOpenedComposersWidth - ComposerStyle.normalWidth;
newDisplayMode = ScreenDisplayMode.hidden; newDisplayMode = ScreenDisplayMode.hidden;
} }
controller.setScreenDisplayMode(newDisplayMode); controller.setScreenDisplayMode(newDisplayMode);
totalWidth = newTotalWidth; totalOpenedComposersWidth = newTotalWidth;
} else if (controller.isMinimizeScreen) { } else if (controller.isMinimizeScreen) {
final newTotalWidth = totalWidth - ComposerStyle.minimizeWidth; final newTotalWidth = totalOpenedComposersWidth - ComposerStyle.minimizeWidth;
controller.setScreenDisplayMode(ScreenDisplayMode.hidden); controller.setScreenDisplayMode(ScreenDisplayMode.hidden);
totalWidth = newTotalWidth; totalOpenedComposersWidth = newTotalWidth;
} }
if (totalWidth <= availableWidth) break; if (totalOpenedComposersWidth <= availableScreenWidth) break;
}
} }
} }
void syncComposerStateWhenComposerDisplayModeChanged({ void arrangeComposerWhenComposerQueueChanged({required double screenWidth}) {
required double screenWidth, var (availableScreenWidth, totalOpenedComposersWidth, composerControllers) =
_getSizeToArrangeComposer(screenWidth: screenWidth);
if (totalOpenedComposersWidth < availableScreenWidth) {
_showMinimizedComposersIfOverflow(
availableScreenWidth: availableScreenWidth,
totalOpenedComposersWidth: totalOpenedComposersWidth,
composerControllers: composerControllers,
);
} else if (totalOpenedComposersWidth > availableScreenWidth) {
_hideComposersIfFit(
availableScreenWidth: availableScreenWidth,
totalOpenedComposersWidth: totalOpenedComposersWidth,
composerControllers: composerControllers,
);
}
}
void _hideComposersPreferringMinimizedIfFit({
required String updatedComposerId, required String updatedComposerId,
required ScreenDisplayMode newDisplayMode, required double availableScreenWidth,
required double totalOpenedComposersWidth,
required Map<String, ComposerController> composerControllers,
}) { }) {
if (composerIdsQueue.isEmpty) return;
var (availableWidth, totalWidth, composerControllers) =
_setUpDataToSyncComposerQueue(screenWidth: screenWidth);
if (totalWidth < availableWidth) {
final currentHiddenComposerIds = hiddenComposerIds;
if (currentHiddenComposerIds.isEmpty) return;
for (var index = currentHiddenComposerIds.length - 1; index >= 0; index--) {
final newTotalWidth = totalWidth + ComposerStyle.minimizeWidth;
if (newTotalWidth > availableWidth) break;
final id = currentHiddenComposerIds.elementAt(index);
composerControllers[id]!.setScreenDisplayMode(ScreenDisplayMode.minimize);
totalWidth = newTotalWidth;
}
} else if (totalWidth > availableWidth) {
for (var id in minimizeComposerIds) { for (var id in minimizeComposerIds) {
if (id == updatedComposerId) continue; if (id == updatedComposerId) continue;
composerControllers[id]!.setScreenDisplayMode(ScreenDisplayMode.hidden); composerControllers[id]!.setScreenDisplayMode(ScreenDisplayMode.hidden);
totalWidth -= ComposerStyle.minimizeWidth; totalOpenedComposersWidth -= ComposerStyle.minimizeWidth;
if (totalWidth <= availableWidth) return; if (totalOpenedComposersWidth <= availableScreenWidth) return;
} }
for (var id in normalComposerIds) { for (var id in normalComposerIds) {
if (id == updatedComposerId) continue; if (id == updatedComposerId) continue;
final controller = composerControllers[id]!; final controller = composerControllers[id]!;
var newTotalWidth = totalWidth - (ComposerStyle.normalWidth - ComposerStyle.minimizeWidth); var newTotalWidth = totalOpenedComposersWidth - (ComposerStyle.normalWidth - ComposerStyle.minimizeWidth);
if (newTotalWidth <= availableWidth) { if (newTotalWidth <= availableScreenWidth) {
controller.setScreenDisplayMode(ScreenDisplayMode.minimize); controller.setScreenDisplayMode(ScreenDisplayMode.minimize);
return; return;
} }
newTotalWidth = totalWidth - ComposerStyle.normalWidth; newTotalWidth = totalOpenedComposersWidth - ComposerStyle.normalWidth;
if (newTotalWidth <= availableWidth) { if (newTotalWidth <= availableScreenWidth) {
controller.setScreenDisplayMode(ScreenDisplayMode.hidden); controller.setScreenDisplayMode(ScreenDisplayMode.hidden);
return; return;
} }
totalWidth = newTotalWidth; totalOpenedComposersWidth = newTotalWidth;
}
} }
} }
void syncComposerStateWhenResponsiveChanged({required double screenWidth}) => void arrangeComposerWhenComposerDisplayModeChanged({
syncComposerStateWhenComposerQueueChanged(screenWidth: screenWidth); required double screenWidth,
required String updatedComposerId,
required ScreenDisplayMode newDisplayMode,
}) {
if (composerIdsQueue.isEmpty) return;
var (availableScreenWidth, totalOpenedComposersWidth, composerControllers) =
_getSizeToArrangeComposer(screenWidth: screenWidth);
if (totalOpenedComposersWidth < availableScreenWidth) {
_showMinimizedComposersIfOverflow(
availableScreenWidth: availableScreenWidth,
totalOpenedComposersWidth: totalOpenedComposersWidth,
composerControllers: composerControllers,
);
} else if (totalOpenedComposersWidth > availableScreenWidth) {
_hideComposersPreferringMinimizedIfFit(
updatedComposerId: updatedComposerId,
availableScreenWidth: availableScreenWidth,
totalOpenedComposersWidth: totalOpenedComposersWidth,
composerControllers: composerControllers,
);
}
}
void arrangeComposerWhenResponsiveChanged({required double screenWidth}) =>
arrangeComposerWhenComposerQueueChanged(screenWidth: screenWidth);
bool get hasComposer => composerIdsQueue.isNotEmpty; bool get hasComposer => composerIdsQueue.isNotEmpty;
@@ -267,7 +275,7 @@ class ComposerManager extends GetxController {
composerIdsQueue.add(composerId); composerIdsQueue.add(composerId);
final composerView = getComposerView(composerId); final composerView = getComposerView(composerId);
composerView.controller.setScreenDisplayMode(ScreenDisplayMode.normal); composerView.controller.setScreenDisplayMode(ScreenDisplayMode.normal);
_syncQueueIfNeeded(); _arrangeComposerIfNeeded();
} }
ComposerView getComposerView(String id) => composers[id]!; ComposerView getComposerView(String id) => composers[id]!;
@@ -18,7 +18,7 @@ class ComposerOverlayView extends StatelessWidget {
final screenWidth = MediaQuery.sizeOf(context).width; final screenWidth = MediaQuery.sizeOf(context).width;
if (_composerManager.composers.isNotEmpty) { if (_composerManager.composers.isNotEmpty) {
_composerManager.syncComposerStateWhenResponsiveChanged(screenWidth: screenWidth); _composerManager.arrangeComposerWhenResponsiveChanged(screenWidth: screenWidth);
} }
return Obx(() { return Obx(() {