Fix flickering issues due to reconnecting loop
This commit is contained in:
@@ -6,7 +6,6 @@ import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
|
||||
import '../../models/office.dart';
|
||||
import '../../models/profile.dart';
|
||||
import '../../models/task.dart';
|
||||
import '../../models/ticket.dart';
|
||||
import '../../models/ticket_message.dart';
|
||||
import '../../providers/notifications_provider.dart';
|
||||
@@ -57,12 +56,13 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final ticket = _findTicket(ref, widget.ticketId);
|
||||
// Use per-item providers to avoid rebuilding when unrelated tickets/tasks
|
||||
// change. Only the specific ticket for this screen triggers rebuilds.
|
||||
final ticket = ref.watch(ticketByIdProvider(widget.ticketId));
|
||||
final messagesAsync = ref.watch(ticketMessagesProvider(widget.ticketId));
|
||||
final profilesAsync = ref.watch(profilesProvider);
|
||||
final officesAsync = ref.watch(officesProvider);
|
||||
final currentProfileAsync = ref.watch(currentProfileProvider);
|
||||
final tasksAsync = ref.watch(tasksProvider);
|
||||
final typingState = ref.watch(typingIndicatorProvider(widget.ticketId));
|
||||
final canPromote = currentProfileAsync.maybeWhen(
|
||||
data: (profile) => profile != null && _canPromote(profile.role),
|
||||
@@ -76,7 +76,7 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
|
||||
final showAssign = canAssign && ticket?.status != 'closed';
|
||||
final taskForTicket = ticket == null
|
||||
? null
|
||||
: _findTaskForTicket(tasksAsync, ticket.id);
|
||||
: ref.watch(taskByTicketIdProvider(ticket.id));
|
||||
final hasStaffMessage = _hasStaffMessage(
|
||||
messagesAsync.valueOrNull ?? const [],
|
||||
profilesAsync.valueOrNull ?? const [],
|
||||
@@ -477,15 +477,6 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
|
||||
return 'Filed by: $name';
|
||||
}
|
||||
|
||||
Ticket? _findTicket(WidgetRef ref, String ticketId) {
|
||||
final ticketsAsync = ref.watch(ticketsProvider);
|
||||
return ticketsAsync.maybeWhen(
|
||||
data: (tickets) =>
|
||||
tickets.where((ticket) => ticket.id == ticketId).firstOrNull,
|
||||
orElse: () => null,
|
||||
);
|
||||
}
|
||||
|
||||
bool _hasStaffMessage(List<TicketMessage> messages, List<Profile> profiles) {
|
||||
if (messages.isEmpty || profiles.isEmpty) {
|
||||
return false;
|
||||
@@ -508,14 +499,6 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
Task? _findTaskForTicket(AsyncValue<List<Task>> tasksAsync, String ticketId) {
|
||||
return tasksAsync.maybeWhen(
|
||||
data: (tasks) =>
|
||||
tasks.where((task) => task.ticketId == ticketId).firstOrNull,
|
||||
orElse: () => null,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _handleSendMessage(
|
||||
WidgetRef ref,
|
||||
List<Profile> profiles,
|
||||
|
||||
Reference in New Issue
Block a user