TF-3698 Thread Detail Real time update
TF-3698 Thread Detail update reset RefreshThreadDetailAction position TF-3698 Thread Detail refactor initializeThreadDetailEmails TF-3698 Thread Detail refactor handleRefreshThreadDetailAction TF-3698 Thread Detail create listThreadIds in ListEmailExtension
This commit is contained in:
@@ -25,8 +25,9 @@ class ThreadDetailRepositoryImpl implements ThreadDetailRepository {
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
MailboxId sentMailboxId,
|
||||
String ownEmailAddress,
|
||||
) async {
|
||||
String ownEmailAddress, {
|
||||
required EmailId? selectedEmailId,
|
||||
}) async {
|
||||
final originalEmailIds = await threadDetailDataSource[DataSourceType.network]!
|
||||
.getThreadById(threadId, accountId);
|
||||
|
||||
@@ -43,6 +44,7 @@ class ThreadDetailRepositoryImpl implements ThreadDetailRepository {
|
||||
emailIds,
|
||||
sentMailboxId,
|
||||
ownEmailAddress,
|
||||
selectedEmailId: selectedEmailId,
|
||||
))
|
||||
);
|
||||
|
||||
@@ -60,8 +62,9 @@ class ThreadDetailRepositoryImpl implements ThreadDetailRepository {
|
||||
AccountId accountId,
|
||||
List<EmailId> emailIds,
|
||||
MailboxId sentMailboxId,
|
||||
String ownEmailAddress,
|
||||
) async {
|
||||
String ownEmailAddress, {
|
||||
required EmailId? selectedEmailId,
|
||||
}) async {
|
||||
int retry = 3;
|
||||
while (retry > 0) {
|
||||
try {
|
||||
@@ -85,6 +88,7 @@ class ThreadDetailRepositoryImpl implements ThreadDetailRepository {
|
||||
email,
|
||||
sentMailboxId,
|
||||
ownEmailAddress,
|
||||
selectedEmailId: selectedEmailId,
|
||||
))
|
||||
.toList();
|
||||
} catch (e) {
|
||||
@@ -99,12 +103,14 @@ class ThreadDetailRepositoryImpl implements ThreadDetailRepository {
|
||||
bool checkEmailValidForThreadDetail(
|
||||
Email email,
|
||||
MailboxId sentMailboxId,
|
||||
String ownEmailAddress,
|
||||
) {
|
||||
String ownEmailAddress, {
|
||||
required EmailId? selectedEmailId
|
||||
}) {
|
||||
return email.id != null && (
|
||||
!email.inSentMailbox(sentMailboxId)
|
||||
|| !email.fromMe(ownEmailAddress)
|
||||
|| !email.recipientsHasMe(ownEmailAddress)
|
||||
|| email.id == selectedEmailId
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,9 @@ abstract class ThreadDetailRepository {
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
MailboxId sentMailboxId,
|
||||
String ownEmailAddress,
|
||||
);
|
||||
String ownEmailAddress, {
|
||||
required EmailId? selectedEmailId,
|
||||
});
|
||||
|
||||
Future<List<Email>> getEmailsByIds(
|
||||
Session session,
|
||||
|
||||
@@ -12,14 +12,27 @@ class GettingEmailsByIds extends LoadingState {
|
||||
}
|
||||
|
||||
class GetEmailsByIdsSuccess extends UIState {
|
||||
GetEmailsByIdsSuccess(this.presentationEmails);
|
||||
GetEmailsByIdsSuccess(
|
||||
this.presentationEmails, {
|
||||
this.updateCurrentThreadDetail = false,
|
||||
});
|
||||
|
||||
final List<PresentationEmail> presentationEmails;
|
||||
final bool updateCurrentThreadDetail;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [presentationEmails];
|
||||
List<Object?> get props => [presentationEmails, updateCurrentThreadDetail];
|
||||
}
|
||||
|
||||
class GetEmailsByIdsFailure extends FeatureFailure {
|
||||
GetEmailsByIdsFailure({super.exception, super.onRetry});
|
||||
GetEmailsByIdsFailure({
|
||||
super.exception,
|
||||
super.onRetry,
|
||||
required this.updateCurrentThreadDetail,
|
||||
});
|
||||
|
||||
final bool updateCurrentThreadDetail;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [...super.props, updateCurrentThreadDetail];
|
||||
}
|
||||
@@ -2,17 +2,34 @@ import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
|
||||
class GettingThreadById extends LoadingState {}
|
||||
class GettingThreadById extends LoadingState {
|
||||
final bool updateCurrentThreadDetail;
|
||||
|
||||
GettingThreadById({this.updateCurrentThreadDetail = false});
|
||||
|
||||
@override
|
||||
List<Object> get props => [updateCurrentThreadDetail];
|
||||
}
|
||||
|
||||
class GetThreadByIdSuccess extends UIState {
|
||||
final List<EmailId> emailIds;
|
||||
final bool updateCurrentThreadDetail;
|
||||
|
||||
GetThreadByIdSuccess(this.emailIds);
|
||||
GetThreadByIdSuccess(this.emailIds, {this.updateCurrentThreadDetail = false});
|
||||
|
||||
@override
|
||||
List<Object> get props => [emailIds];
|
||||
List<Object> get props => [emailIds, updateCurrentThreadDetail];
|
||||
}
|
||||
|
||||
class GetThreadByIdFailure extends FeatureFailure {
|
||||
GetThreadByIdFailure({super.exception, super.onRetry});
|
||||
GetThreadByIdFailure({
|
||||
super.exception,
|
||||
super.onRetry,
|
||||
required this.updateCurrentThreadDetail,
|
||||
});
|
||||
|
||||
final bool updateCurrentThreadDetail;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [...super.props, updateCurrentThreadDetail];
|
||||
}
|
||||
@@ -23,6 +23,7 @@ class GetEmailsByIdsInteractor {
|
||||
List<EmailId> emailIds, {
|
||||
Properties? properties,
|
||||
int? loadMoreIndex,
|
||||
bool updateCurrentThreadDetail = false,
|
||||
}) async* {
|
||||
try {
|
||||
if (emailIds.length > 1 && (
|
||||
@@ -41,12 +42,14 @@ class GetEmailsByIdsInteractor {
|
||||
);
|
||||
yield Right(GetEmailsByIdsSuccess(
|
||||
result.map((e) => e.toPresentationEmail()).toList(),
|
||||
updateCurrentThreadDetail: updateCurrentThreadDetail,
|
||||
));
|
||||
} catch (e) {
|
||||
logError('GetEmailsByIdsInteractor::execute(): Exception: $e');
|
||||
yield Left(GetEmailsByIdsFailure(
|
||||
exception: e,
|
||||
onRetry: execute(session, accountId, emailIds, properties: properties),
|
||||
updateCurrentThreadDetail: updateCurrentThreadDetail,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,19 +19,27 @@ class GetThreadByIdInteractor {
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
MailboxId sentMailboxId,
|
||||
String ownEmailAddress,
|
||||
) async* {
|
||||
String ownEmailAddress, {
|
||||
required EmailId? selectedEmailId,
|
||||
bool updateCurrentThreadDetail = false,
|
||||
}) async* {
|
||||
try {
|
||||
yield Right(GettingThreadById());
|
||||
yield Right(GettingThreadById(
|
||||
updateCurrentThreadDetail: updateCurrentThreadDetail,
|
||||
));
|
||||
final result = await _threadDetailRepository.getThreadById(
|
||||
threadId,
|
||||
session,
|
||||
accountId,
|
||||
sentMailboxId,
|
||||
ownEmailAddress,
|
||||
selectedEmailId: selectedEmailId,
|
||||
);
|
||||
|
||||
yield Right(GetThreadByIdSuccess(result));
|
||||
yield Right(GetThreadByIdSuccess(
|
||||
result,
|
||||
updateCurrentThreadDetail: updateCurrentThreadDetail,
|
||||
));
|
||||
} catch (e) {
|
||||
logError('GetEmailIdsByThreadIdInteractor::execute(): Exception: $e');
|
||||
yield Left(GetThreadByIdFailure(
|
||||
@@ -42,7 +50,9 @@ class GetThreadByIdInteractor {
|
||||
accountId,
|
||||
sentMailboxId,
|
||||
ownEmailAddress,
|
||||
selectedEmailId: selectedEmailId,
|
||||
),
|
||||
updateCurrentThreadDetail: updateCurrentThreadDetail,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
+1
-5
@@ -1,16 +1,12 @@
|
||||
import 'package:core/presentation/views/loading/cupertino_loading_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
|
||||
extension GetThreadDetailLoadingView on ThreadDetailController {
|
||||
Widget getThreadDetailLoadingView({
|
||||
required bool isResponsiveDesktop,
|
||||
required bool isLoading,
|
||||
}) {
|
||||
final isLoading = viewState.value.fold(
|
||||
(failure) => false,
|
||||
(success) => success is GettingThreadById
|
||||
);
|
||||
if (!isLoading) return const SizedBox.shrink();
|
||||
|
||||
return Expanded(
|
||||
|
||||
+21
-3
@@ -1,3 +1,4 @@
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
|
||||
@@ -5,10 +6,27 @@ extension HandleGetEmailIdsByThreadIdSuccess on ThreadDetailController {
|
||||
void handleGetEmailIdsByThreadIdSuccess(
|
||||
GetThreadByIdSuccess success,
|
||||
) {
|
||||
final newEmailsInThreadDetail = <EmailId>[];
|
||||
if (success.emailIds.isNotEmpty) {
|
||||
emailIdsPresentation.value = Map.fromEntries(success.emailIds.map(
|
||||
(emailId) => MapEntry(emailId, null),
|
||||
));
|
||||
if (success.updateCurrentThreadDetail) {
|
||||
newEmailsInThreadDetail.addAll(success
|
||||
.emailIds
|
||||
.where(
|
||||
(emailId) => !emailIdsPresentation.keys.contains(emailId),
|
||||
)
|
||||
);
|
||||
emailIdsPresentation
|
||||
..removeWhere(
|
||||
(key, value) => !success.emailIds.contains(key),
|
||||
)
|
||||
..addAll(Map.fromEntries(
|
||||
newEmailsInThreadDetail.map((emailId) => MapEntry(emailId, null)),
|
||||
));
|
||||
} else {
|
||||
emailIdsPresentation.value = Map.fromEntries(success.emailIds.map(
|
||||
(emailId) => MapEntry(emailId, null),
|
||||
));
|
||||
}
|
||||
} else if (mailboxDashBoardController.selectedEmail.value?.id != null) {
|
||||
emailIdsPresentation.value = {
|
||||
mailboxDashBoardController.selectedEmail.value!.id!: null,
|
||||
|
||||
+9
@@ -18,6 +18,15 @@ extension HandleGetEmailsByIdsSuccess on ThreadDetailController {
|
||||
|
||||
for (var presentationEmail in success.presentationEmails) {
|
||||
if (presentationEmail.id == null) continue;
|
||||
|
||||
if (success.updateCurrentThreadDetail) {
|
||||
emailIdsPresentation[presentationEmail.id!] = presentationEmail.copyWith(
|
||||
emailInThreadStatus: emailIdsPresentation[presentationEmail.id!]
|
||||
?.emailInThreadStatus ?? EmailInThreadStatus.collapsed,
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (presentationEmail.id == selectedEmailId) {
|
||||
EmailBindings(currentEmailId: presentationEmail.id).dependencies();
|
||||
currentExpandedEmailId.value = presentationEmail.id;
|
||||
|
||||
@@ -5,6 +5,8 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_
|
||||
|
||||
extension HandleGetThreadByIdFailure on ThreadDetailController {
|
||||
void handleGetThreadByIdFailure(GetThreadByIdFailure failure) {
|
||||
if (failure.updateCurrentThreadDetail) return;
|
||||
|
||||
final selectedEmail = mailboxDashBoardController.selectedEmail.value;
|
||||
if (selectedEmail != null) {
|
||||
consumeState(Stream.value(Right(GetEmailsByIdsSuccess([selectedEmail]))));
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:model/extensions/list_email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_by_id_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
|
||||
extension HandleRefreshThreadDetailAction on ThreadDetailController {
|
||||
void handleRefreshThreadDetailAction(
|
||||
RefreshThreadDetailAction action,
|
||||
GetThreadByIdInteractor getThreadByIdInteractor,
|
||||
) {
|
||||
if (!isThreadDetailEnabled) {
|
||||
final currentEmailId = mailboxDashBoardController.selectedEmail.value?.id;
|
||||
if (currentEmailId == null) return;
|
||||
|
||||
final updatedEmailIds = action
|
||||
.emailChangeResponse
|
||||
.updated
|
||||
?.listEmailIds ?? [];
|
||||
|
||||
if (updatedEmailIds.contains(currentEmailId)) {
|
||||
consumeState(Stream.value(Right(GetThreadByIdSuccess(
|
||||
[currentEmailId],
|
||||
updateCurrentThreadDetail: true,
|
||||
))));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
final currentThreadId = mailboxDashBoardController.selectedEmail.value?.threadId;
|
||||
final threadIdsEmailCreated = action
|
||||
.emailChangeResponse
|
||||
.created
|
||||
?.listThreadIds ?? [];
|
||||
final threadIdsEmailUpdated = action
|
||||
.emailChangeResponse
|
||||
.updated
|
||||
?.listThreadIds ?? [];
|
||||
final updatedThreadIds = threadIdsEmailCreated + threadIdsEmailUpdated;
|
||||
final destroyedEmailIds = action.emailChangeResponse.destroyed ?? [];
|
||||
|
||||
if (session != null &&
|
||||
accountId != null &&
|
||||
sentMailboxId != null &&
|
||||
ownEmailAddress != null &&
|
||||
currentThreadId != null && (
|
||||
updatedThreadIds.contains(currentThreadId) ||
|
||||
emailIdsPresentation.keys.any(destroyedEmailIds.contains))) {
|
||||
consumeState(getThreadByIdInteractor.execute(
|
||||
currentThreadId,
|
||||
session!,
|
||||
accountId!,
|
||||
sentMailboxId!,
|
||||
ownEmailAddress!,
|
||||
updateCurrentThreadDetail: true,
|
||||
selectedEmailId: mailboxDashBoardController.selectedEmail.value?.id,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
+27
-6
@@ -1,27 +1,47 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_emails_by_ids_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/utils/thread_detail_presentation_utils.dart';
|
||||
|
||||
extension InitializeThreadDetailEmails on ThreadDetailController {
|
||||
void initializeThreadDetailEmails() {
|
||||
void initializeThreadDetailEmails(GetThreadByIdSuccess success) {
|
||||
final threadDetailEnabled = isThreadDetailEnabled;
|
||||
final selectedEmail = mailboxDashBoardController.selectedEmail.value;
|
||||
if (!threadDetailEnabled && selectedEmail != null) {
|
||||
if (!threadDetailEnabled &&
|
||||
selectedEmail != null &&
|
||||
!success.updateCurrentThreadDetail) {
|
||||
consumeState(Stream.value(Right(GetEmailsByIdsSuccess([selectedEmail]))));
|
||||
return;
|
||||
}
|
||||
|
||||
final emailIdsToLoadMetaData = ThreadDetailPresentationUtils.getFirstLoadEmailIds(
|
||||
emailIdsPresentation.keys.toList(),
|
||||
selectedEmailId: mailboxDashBoardController.selectedEmail.value?.id,
|
||||
);
|
||||
final existingEmailIds = emailIdsPresentation.keys.toList();
|
||||
final selectedEmailId = mailboxDashBoardController.selectedEmail.value?.id;
|
||||
|
||||
List<EmailId> emailIdsToLoadMetaData = [];
|
||||
if (success.updateCurrentThreadDetail) {
|
||||
final nonNullEmailIds = emailIdsPresentation.entries
|
||||
.where((entry) => entry.value != null)
|
||||
.map((entry) => entry.key)
|
||||
.toList();
|
||||
final newEmailIds = success.emailIds.where(
|
||||
(emailId) => !existingEmailIds.contains(emailId),
|
||||
);
|
||||
emailIdsToLoadMetaData = [...nonNullEmailIds, ...newEmailIds];
|
||||
} else {
|
||||
emailIdsToLoadMetaData = ThreadDetailPresentationUtils.getFirstLoadEmailIds(
|
||||
existingEmailIds,
|
||||
selectedEmailId: selectedEmailId,
|
||||
);
|
||||
}
|
||||
|
||||
if (accountId == null || session == null) {
|
||||
consumeState(Stream.value(Left(GetEmailsByIdsFailure(
|
||||
exception: NotFoundSessionException(),
|
||||
updateCurrentThreadDetail: false,
|
||||
))));
|
||||
return;
|
||||
}
|
||||
@@ -33,6 +53,7 @@ extension InitializeThreadDetailEmails on ThreadDetailController {
|
||||
session!,
|
||||
accountId!,
|
||||
).union(additionalProperties),
|
||||
updateCurrentThreadDetail: success.updateCurrentThreadDetail,
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ extension LoadMoreThreadDetailEmails on ThreadDetailController {
|
||||
if (accountId == null || session == null) {
|
||||
consumeState(Stream.value(Left(GetEmailsByIdsFailure(
|
||||
exception: NotFoundSessionException(),
|
||||
updateCurrentThreadDetail: false,
|
||||
))));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import 'package:model/extensions/keyword_identifier_extension.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||
@@ -43,6 +44,7 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/extension/clos
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_email_ids_by_thread_id_success.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_emails_by_ids_success.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_thread_by_id_failure.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/initialize_thread_detail_emails.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/model/thread_detail_setting_status.dart';
|
||||
@@ -164,6 +166,7 @@ class ThreadDetailController extends BaseController {
|
||||
accountId!,
|
||||
sentMailboxId!,
|
||||
ownEmailAddress!,
|
||||
selectedEmailId: presentationEmail.id,
|
||||
));
|
||||
}
|
||||
});
|
||||
@@ -188,6 +191,15 @@ class ThreadDetailController extends BaseController {
|
||||
);
|
||||
}
|
||||
});
|
||||
ever(mailboxDashBoardController.emailUIAction, (action) {
|
||||
if (action is RefreshThreadDetailAction) {
|
||||
mailboxDashBoardController.dispatchEmailUIAction(EmailUIAction());
|
||||
handleRefreshThreadDetailAction(
|
||||
action,
|
||||
_getEmailIdsByThreadIdInteractor,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void reset() {
|
||||
@@ -202,7 +214,7 @@ class ThreadDetailController extends BaseController {
|
||||
void handleSuccessViewState(success) {
|
||||
if (success is GetThreadByIdSuccess) {
|
||||
handleGetEmailIdsByThreadIdSuccess(success);
|
||||
initializeThreadDetailEmails();
|
||||
initializeThreadDetailEmails(success);
|
||||
} else if (success is GetEmailsByIdsSuccess) {
|
||||
handleGetEmailsByIdsSuccess(success);
|
||||
} else if (success is MarkAsEmailReadSuccess) {
|
||||
@@ -231,6 +243,7 @@ class ThreadDetailController extends BaseController {
|
||||
handleGetThreadByIdFailure(failure);
|
||||
}
|
||||
if (failure is GetEmailsByIdsFailure) {
|
||||
if (failure.updateCurrentThreadDetail) return;
|
||||
showRetryToast(failure);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
@@ -27,8 +29,7 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
child: Column(
|
||||
children: [
|
||||
Obx(() {
|
||||
final currentViewState = controller.viewState.value.fold(id, id);
|
||||
if (currentViewState is GettingThreadById) {
|
||||
if (showLoadingView(controller.viewState.value)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
@@ -68,40 +69,35 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
}),
|
||||
Obx(() => controller.getThreadDetailLoadingView(
|
||||
isResponsiveDesktop: controller.responsiveUtils.isDesktop(context),
|
||||
isLoading: showLoadingView(controller.viewState.value),
|
||||
)),
|
||||
Obx(() {
|
||||
return controller.viewState.value.fold(
|
||||
(failure) => const SizedBox.shrink(),
|
||||
(success) {
|
||||
if (success is GettingThreadById) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
if (showLoadingView(controller.viewState.value)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
return Expanded(
|
||||
child: Padding(
|
||||
padding: _padding(context),
|
||||
child: Stack(
|
||||
children: [
|
||||
const Positioned.fill(
|
||||
child: ColoredBox(color: Colors.white),
|
||||
),
|
||||
SingleChildScrollView(
|
||||
controller: controller.scrollController,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: controller.getThreadDetailEmailViews()
|
||||
),
|
||||
),
|
||||
],
|
||||
return Expanded(
|
||||
child: Padding(
|
||||
padding: _padding(context),
|
||||
child: Stack(
|
||||
children: [
|
||||
const Positioned.fill(
|
||||
child: ColoredBox(color: Colors.white),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
SingleChildScrollView(
|
||||
controller: controller.scrollController,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: controller.getThreadDetailEmailViews()
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
Obx(() {
|
||||
final currentViewState = controller.viewState.value.fold(id, id);
|
||||
if (currentViewState is GettingThreadById) {
|
||||
if (showLoadingView(controller.viewState.value)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
@@ -166,10 +162,12 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
));
|
||||
|
||||
return Obx(() {
|
||||
final currentViewState = controller.viewState.value.fold(id, id);
|
||||
if (currentViewState is GettingThreadById &&
|
||||
if (showLoadingView(controller.viewState.value) &&
|
||||
controller.responsiveUtils.isTabletLarge(context)) {
|
||||
return controller.getThreadDetailLoadingView(isResponsiveDesktop: false);
|
||||
return controller.getThreadDetailLoadingView(
|
||||
isResponsiveDesktop: false,
|
||||
isLoading: true,
|
||||
);
|
||||
}
|
||||
|
||||
if (controller.emailIdsPresentation.length == 1 &&
|
||||
@@ -215,4 +213,10 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
bool showLoadingView(Either<Failure, Success> viewState) {
|
||||
final viewStateValue = viewState.fold(id, id);
|
||||
return viewStateValue is GettingThreadById &&
|
||||
!viewStateValue.updateCurrentThreadDetail;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user