141 lines
3.8 KiB
Dart
141 lines
3.8 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:didvan/models/ai/bots_model.dart';
|
|
import 'package:didvan/models/ai/chats_model.dart';
|
|
import 'package:didvan/models/enums.dart';
|
|
import 'package:didvan/models/view/alert_data.dart';
|
|
import 'package:didvan/providers/core.dart';
|
|
import 'package:didvan/services/ai/ai_api_service.dart';
|
|
import 'package:didvan/services/network/request.dart';
|
|
import 'package:didvan/services/network/request_helper.dart';
|
|
import 'package:didvan/utils/action_sheet.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class AiChatState extends CoreProvier {
|
|
Stream<String> messageOnstream = const Stream.empty();
|
|
List<Prompts> messages = [];
|
|
ValueNotifier<bool> onResponsing = ValueNotifier(false);
|
|
ValueNotifier<bool> loading = ValueNotifier(false);
|
|
final ScrollController scrollController = ScrollController();
|
|
int? chatId;
|
|
|
|
Future<void> _scrolledEnd() async {
|
|
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
|
await scrollController.animateTo(
|
|
scrollController.position.minScrollExtent,
|
|
duration: const Duration(milliseconds: 600),
|
|
curve: Curves.easeInOut,
|
|
);
|
|
});
|
|
}
|
|
|
|
Future<void> _onError(e) async {
|
|
onResponsing.value = false;
|
|
messages.removeLast();
|
|
messages.removeLast();
|
|
messageOnstream = const Stream.empty();
|
|
|
|
await ActionSheetUtils.showAlert(AlertData(
|
|
message: 'خطا در برقراری ارتباط', aLertType: ALertType.error));
|
|
|
|
update();
|
|
}
|
|
|
|
Future<RequestService> getChatId() async {
|
|
final service = RequestService(
|
|
RequestHelper.aiChatId(),
|
|
);
|
|
await service.httpGet();
|
|
if (service.isSuccess) {
|
|
final id = service.result['id'];
|
|
chatId = id;
|
|
}
|
|
return service;
|
|
}
|
|
|
|
Future<void> getAllMessages(int chatId) async {
|
|
loading.value = true;
|
|
onResponsing.value = true;
|
|
final service = RequestService(
|
|
RequestHelper.aiAChat(chatId),
|
|
);
|
|
await service.httpGet();
|
|
if (service.isSuccess) {
|
|
messages.clear();
|
|
final allMessages = service.result['prompts'];
|
|
for (var i = 0; i < allMessages.length; i++) {
|
|
messages.add(Prompts.fromJson(allMessages[i]));
|
|
// chats.add("chats: $chats");
|
|
}
|
|
appState = AppState.idle;
|
|
loading.value = false;
|
|
onResponsing.value = false;
|
|
|
|
// Add this code to scroll to maxScrollExtent after the ListView is built
|
|
update();
|
|
|
|
return;
|
|
}
|
|
appState = AppState.failed;
|
|
loading.value = false;
|
|
onResponsing.value = false;
|
|
|
|
update();
|
|
}
|
|
|
|
Future<void> postMessage(BotsModel bot) async {
|
|
onResponsing.value = true;
|
|
|
|
update();
|
|
await _scrolledEnd();
|
|
String message = messages.last.text!;
|
|
|
|
messages.add(Prompts(
|
|
finished: false,
|
|
text: '...',
|
|
role: 'bot',
|
|
createdAt: DateTime.now()
|
|
.subtract(const Duration(minutes: 210))
|
|
.toIso8601String()));
|
|
final req = await AiApiService.initial(
|
|
url: '/${bot.id}/${bot.name}'.toLowerCase(),
|
|
message: message,
|
|
chatId: chatId);
|
|
final res = await AiApiService.getResponse(req).catchError((e) {
|
|
_onError(e);
|
|
throw e;
|
|
});
|
|
String responseMessgae = '';
|
|
var r = res.listen((value) async {
|
|
var str = utf8.decode(value);
|
|
responseMessgae += str;
|
|
messageOnstream = Stream.value(responseMessgae);
|
|
|
|
update();
|
|
_scrolledEnd();
|
|
});
|
|
|
|
r.onDone(() async {
|
|
if (chatId == null) {
|
|
final service = await getChatId();
|
|
if (!service.isSuccess) {
|
|
_onError(null);
|
|
return;
|
|
}
|
|
}
|
|
onResponsing.value = false;
|
|
messages.last = messages.last.copyWith(
|
|
finished: true,
|
|
text: responseMessgae,
|
|
);
|
|
messageOnstream = const Stream.empty();
|
|
|
|
update();
|
|
_scrolledEnd();
|
|
});
|
|
|
|
r.onError(_onError);
|
|
}
|
|
}
|