Auto Task Assignment

This commit is contained in:
2026-02-18 23:14:50 +08:00
parent 372928d8e7
commit 5ec57a1cec
12 changed files with 1109 additions and 138 deletions
+17 -3
View File
@@ -482,7 +482,9 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
if (!canSendMessages) return;
final content = _messageController.text.trim();
if (content.isEmpty) return;
ref.read(typingIndicatorProvider(widget.ticketId).notifier).stopTyping();
_maybeTypingController(widget.ticketId)?.stopTyping();
final message = await ref
.read(ticketsControllerProvider)
.sendTicketMessage(ticketId: widget.ticketId, content: content);
@@ -533,11 +535,11 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
bool canSendMessages,
) {
if (!canSendMessages) {
ref.read(typingIndicatorProvider(widget.ticketId).notifier).stopTyping();
_maybeTypingController(widget.ticketId)?.stopTyping();
_clearMentions();
return;
}
ref.read(typingIndicatorProvider(widget.ticketId).notifier).userTyping();
_maybeTypingController(widget.ticketId)?.userTyping();
final text = _messageController.text;
final cursor = _messageController.selection.baseOffset;
if (cursor < 0) {
@@ -585,6 +587,18 @@ class _TicketDetailScreenState extends ConsumerState<TicketDetailScreen> {
});
}
// Safely obtain the typing controller for [ticketId].
TypingIndicatorController? _maybeTypingController(String ticketId) {
try {
final controller = ref.read(typingIndicatorProvider(ticketId).notifier);
return controller.mounted ? controller : null;
} on StateError {
return null;
} catch (_) {
return null;
}
}
bool _isWhitespace(String char) {
return char.trim().isEmpty;
}
+2 -2
View File
@@ -193,7 +193,7 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
),
),
TasQColumn<Ticket>(
header: 'Assigned Agent',
header: 'Filed by',
cellBuilder: (context, ticket) =>
Text(_assignedAgent(profileById, ticket.creatorId)),
),
@@ -232,7 +232,7 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
children: [
Text(officeName),
const SizedBox(height: 2),
Text('Assigned: $assigned'),
Text('Filed by: $assigned'),
const SizedBox(height: 4),
MonoText('ID ${ticket.id}'),
const SizedBox(height: 2),