Fix flickering issues due to reconnecting loop
This commit is contained in:
@@ -192,15 +192,24 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final tasksAsync = ref.watch(tasksProvider);
|
||||
final ticketsAsync = ref.watch(ticketsProvider);
|
||||
// Use per-item providers to avoid rebuilding when unrelated tasks/tickets
|
||||
// change. Only the specific task/ticket for this screen triggers rebuilds.
|
||||
final task = ref.watch(taskByIdProvider(widget.taskId));
|
||||
final officesAsync = ref.watch(officesProvider);
|
||||
final profileAsync = ref.watch(currentProfileProvider);
|
||||
final assignmentsAsync = ref.watch(taskAssignmentsProvider);
|
||||
final taskMessagesAsync = ref.watch(taskMessagesProvider(widget.taskId));
|
||||
final profilesAsync = ref.watch(profilesProvider);
|
||||
|
||||
final task = _findTask(tasksAsync, widget.taskId);
|
||||
// Loading state: use .select() so we only rebuild when the loading flag
|
||||
// itself changes, not when list data changes.
|
||||
final isTasksLoading = ref.watch(
|
||||
tasksProvider.select((a) => !a.hasValue && a.isLoading),
|
||||
);
|
||||
final isTicketsLoading = ref.watch(
|
||||
ticketsProvider.select((a) => !a.hasValue && a.isLoading),
|
||||
);
|
||||
|
||||
if (task == null) {
|
||||
return const ResponsiveBody(
|
||||
child: Center(child: Text('Task not found.')),
|
||||
@@ -210,7 +219,7 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
|
||||
final typingChannelId = task.id;
|
||||
final ticket = ticketId == null
|
||||
? null
|
||||
: _findTicket(ticketsAsync, ticketId);
|
||||
: ref.watch(ticketByIdProvider(ticketId));
|
||||
final officeById = {
|
||||
for (final office in officesAsync.valueOrNull ?? []) office.id: office,
|
||||
};
|
||||
@@ -255,8 +264,8 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
|
||||
final isRetrieving =
|
||||
realtime.isChannelRecovering('tasks') ||
|
||||
realtime.isChannelRecovering('task_assignments') ||
|
||||
(!tasksAsync.hasValue && tasksAsync.isLoading) ||
|
||||
(!ticketsAsync.hasValue && ticketsAsync.isLoading) ||
|
||||
isTasksLoading ||
|
||||
isTicketsLoading ||
|
||||
(!officesAsync.hasValue && officesAsync.isLoading) ||
|
||||
(!profileAsync.hasValue && profileAsync.isLoading) ||
|
||||
(!assignmentsAsync.hasValue && assignmentsAsync.isLoading) ||
|
||||
@@ -3464,21 +3473,6 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
|
||||
);
|
||||
}
|
||||
|
||||
Task? _findTask(AsyncValue<List<Task>> tasksAsync, String taskId) {
|
||||
return tasksAsync.maybeWhen(
|
||||
data: (tasks) => tasks.where((task) => task.id == taskId).firstOrNull,
|
||||
orElse: () => null,
|
||||
);
|
||||
}
|
||||
|
||||
Ticket? _findTicket(AsyncValue<List<Ticket>> ticketsAsync, String ticketId) {
|
||||
return ticketsAsync.maybeWhen(
|
||||
data: (tickets) =>
|
||||
tickets.where((ticket) => ticket.id == ticketId).firstOrNull,
|
||||
orElse: () => null,
|
||||
);
|
||||
}
|
||||
|
||||
bool _canAssignStaff(String role) {
|
||||
return role == 'admin' || role == 'dispatcher' || role == 'it_staff';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user