didvan-app/lib/pages/home/direct/direct_state.dart

121 lines
3.2 KiB
Dart

import 'dart:io';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/message_data/message_data.dart';
import 'package:didvan/models/message_data/radar_attachment.dart';
import 'package:didvan/providers/core_provider.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_vibrate/flutter_vibrate.dart';
import 'package:just_waveform/just_waveform.dart';
import 'package:record/record.dart';
class DirectState extends CoreProvier {
final _recorder = Record();
final List<MessageData> messages = [];
late final int typeId;
final Map<String, List<int>> dailyMessages = {};
String? text;
RadarAttachment? replyRadar;
File? recordedFile;
Waveform? waveform;
bool isRecording = false;
Future<void> getMessages() async {
appState = AppState.busy;
final RequestService service = RequestService(RequestHelper.direct(typeId));
await service.httpGet();
if (service.isSuccess) {
final messageDatas = service.result['messages'];
for (var i = 0; i < messageDatas.length; i++) {
messages.add(MessageData.fromJson(messageDatas[i]));
_addToDailyGrouped();
}
appState = AppState.idle;
return;
}
appState = AppState.failed;
}
void deleteRecordedFile() {
recordedFile!.delete();
recordedFile = null;
notifyListeners();
}
Future<void> startRecording() async {
await _recorder.hasPermission();
if (!kIsWeb) {
Vibrate.feedback(FeedbackType.medium);
}
isRecording = true;
_recorder.start();
notifyListeners();
}
Future<void> stopRecording({required bool sendImidiately}) async {
final path = await _recorder.stop();
isRecording = false;
if (path == null) {
notifyListeners();
return;
}
if (kIsWeb) {
final uri = Uri.file(path);
recordedFile = File.fromUri(uri);
} else {
recordedFile = File(path);
}
if (sendImidiately) {
await sendMessage();
} else {
notifyListeners();
}
}
void _addToDailyGrouped() {
final createdAt = messages.last.createdAt.split('T').first;
if (!dailyMessages.containsKey(createdAt)) {
dailyMessages.addAll({
createdAt: [messages.last.id]
});
} else {
dailyMessages[createdAt]!.add(messages.last.id);
}
}
Future<void> sendMessage() async {
if (text == null || text!.isEmpty && recordedFile == null) return;
final body = {};
if (text != null) {
body.addAll({'text': text});
messages.add(
MessageData(
id: 0,
writedByAdmin: false,
readed: false,
createdAt: DateTime.now().toString(),
text: text,
audio: null,
audioFile: recordedFile,
radar: replyRadar,
waveform: waveform,
),
);
}
_addToDailyGrouped();
if (replyRadar != null) {
body.addAll({'radarId': replyRadar!.id});
}
text = null;
recordedFile = null;
notifyListeners();
final service =
RequestService(RequestHelper.sendDirectMessage(typeId), body: body);
await service.post();
}
}