MIF_E31231313/Android/flutter_app/lib/providers/consultation_provider.dart

127 lines
3.3 KiB
Dart

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:s_gizi/models/chat_message_model.dart';
import 'package:s_gizi/models/child_chat_detail_model.dart';
import 'package:s_gizi/models/consultation_model.dart';
import 'package:s_gizi/services/consultation_service.dart';
class ConsultationProvider extends ChangeNotifier {
ConsultationProvider({ConsultationService? service})
: _service = service ?? ConsultationService();
final ConsultationService _service;
Timer? _debounce;
bool isLoading = false;
bool isSending = false;
String? errorMessage;
String searchQuery = '';
String selectedFilter = 'all';
List<ConsultationModel> consultations = const [];
List<ChatMessageModel> messages = const [];
ChildChatDetailModel? childDetail;
Future<void> fetchConsultations() async {
isLoading = true;
errorMessage = null;
notifyListeners();
try {
consultations = await _service.getConsultations(
search: searchQuery,
filter: selectedFilter,
);
} catch (e) {
errorMessage = e.toString().replaceFirst('Exception: ', '');
} finally {
isLoading = false;
notifyListeners();
}
}
void setSearchQuery(String value) {
searchQuery = value;
_debounce?.cancel();
_debounce = Timer(const Duration(milliseconds: 450), fetchConsultations);
}
void setFilter(String value) {
selectedFilter = value;
fetchConsultations();
}
Future<void> fetchMessages(int consultationId) async {
isLoading = true;
errorMessage = null;
notifyListeners();
try {
messages = await _service.getChatMessages(consultationId);
childDetail = await _service.getChildDetailFromChat(consultationId);
} catch (e) {
errorMessage = e.toString().replaceFirst('Exception: ', '');
} finally {
isLoading = false;
notifyListeners();
}
}
Future<bool> sendMessage(int consultationId, String message) async {
if (message.trim().isEmpty) return false;
isSending = true;
errorMessage = null;
notifyListeners();
try {
await _service.sendMessage(
consultationId: consultationId,
message: message.trim(),
);
messages = await _service.getChatMessages(consultationId);
return true;
} catch (e) {
errorMessage = e.toString().replaceFirst('Exception: ', '');
return false;
} finally {
isSending = false;
notifyListeners();
}
}
Future<bool> closeConsultation(int consultationId) async {
try {
await _service.closeConsultation(consultationId);
return true;
} catch (e) {
errorMessage = e.toString().replaceFirst('Exception: ', '');
notifyListeners();
return false;
}
}
Future<bool> saveNote({
required int consultationId,
required String category,
required String note,
}) async {
try {
await _service.saveNote(
consultationId: consultationId,
category: category,
note: note,
);
childDetail = await _service.getChildDetailFromChat(consultationId);
notifyListeners();
return true;
} catch (e) {
errorMessage = e.toString().replaceFirst('Exception: ', '');
notifyListeners();
return false;
}
}
@override
void dispose() {
_debounce?.cancel();
super.dispose();
}
}