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;
}