126 lines
3.3 KiB
Dart
126 lines
3.3 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.insert(
|
|
0,
|
|
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);
|
|
if (recordedFile == null) {
|
|
await service.post();
|
|
} else {
|
|
await service.multipart(recordedFile, 'POST');
|
|
}
|
|
}
|
|
}
|