diff --git a/lib/repository/voice_to_text_repository.dart b/lib/repository/voice_to_text_repository.dart index 250d6c0..292d5e0 100644 --- a/lib/repository/voice_to_text_repository.dart +++ b/lib/repository/voice_to_text_repository.dart @@ -14,7 +14,7 @@ class VoiceToTextRepository extends BaseRepository { }) async { // final service = "${Constant.baseUrl}xauth/login"; final service = - "http://${host}/one-api/scan-ktp/Voicetotext/listRiwayatRekaman"; + "http://${host}/one-api/voice_2text/Voicetotext/listRiwayatRekaman"; final resp = await post(param: {"userId": userId}, service: service); final result = List.empty(growable: true); @@ -34,7 +34,8 @@ class VoiceToTextRepository extends BaseRepository { required String qrCodeStr, }) async { // final service = "${Constant.baseUrl}xauth/login"; - final service = "http://${host}/one-api/scan-ktp/Voicetotext/uploadRekaman"; + final service = + "http://${host}/one-api/voice_2text/Voicetotext/uploadRekaman"; FormData formData = FormData.fromMap({ "audio": await MultipartFile.fromFile( @@ -42,7 +43,7 @@ class VoiceToTextRepository extends BaseRepository { filename: "rekaman.mp3", ), "userId": userId, - "qrCodeStr":qrCodeStr, + "qrCodeStr": qrCodeStr, }); final resp = await postAudio( @@ -58,4 +59,30 @@ class VoiceToTextRepository extends BaseRepository { return result; } + + // edit + Future prosesEdit({ + required String host, + required String Voice2text_ID, + required String Voice2text_Note, + required String Voice2text_Text, + }) async { + final service = "http://${host}/one-api/voice_2text/Voicetotext/editRekaman"; + final resp = await post( + param: { + "Voice2text_ID": Voice2text_ID, + "Voice2text_Note": Voice2text_Note, + "Voice2text_Text": Voice2text_Text, + }, + service: service, + ); + + if (resp['status'] == "OK") { + return "Sukses Update Data"; + } else { + resp['message']; + } + + return resp['message']; + } } diff --git a/lib/screen/rekaman/edit_rekam_provider.dart b/lib/screen/rekaman/edit_rekam_provider.dart new file mode 100644 index 0000000..23fe8e5 --- /dev/null +++ b/lib/screen/rekaman/edit_rekam_provider.dart @@ -0,0 +1,75 @@ +import 'package:dio/dio.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:fluttervoice2text/model/voice_to_text_model.dart'; +import 'package:fluttervoice2text/repository/voice_to_text_repository.dart'; + +import '../../provider/dio_provider.dart'; +import '../../repository/base_repository.dart'; + +// 3. state provider +final editRekamProvider = StateNotifierProvider( + (ref) => EditRekamNotifier(ref: ref)); + +// 2. notifier +class EditRekamNotifier extends StateNotifier { + final Ref ref; + EditRekamNotifier({required this.ref}) : super(EditRekamStateInit()); + void editRekam({ + required String host, + required String Voice2text_ID, + required String Voice2text_Note, + required String Voice2text_Text, + }) async { + try { + state = EditRekamStateLoading(); + final resp = await VoiceToTextRepository( + dio: ref.read(dioProvider), + ).prosesEdit( + host: host, + Voice2text_Note: Voice2text_Note, + Voice2text_ID: Voice2text_ID, + Voice2text_Text:Voice2text_Text, + ); + + // print(resp); + state = EditRekamStateDone(pesan: resp); + } catch (e) { + if (e is BaseRepositoryException) { + state = EditRekamStateError(message: e.message); + } else { + state = EditRekamStateError(message: e.toString()); + } + } + } +} + +// 1. state +abstract class EditRekamState extends Equatable { + final DateTime date; + const EditRekamState(this.date); + @override + List get props => [date]; +} + +class EditRekamStateInit extends EditRekamState { + EditRekamStateInit() : super(DateTime.now()); +} + +class EditRekamStateLoading extends EditRekamState { + EditRekamStateLoading() : super(DateTime.now()); +} + +class EditRekamStateError extends EditRekamState { + final String message; + EditRekamStateError({ + required this.message, + }) : super(DateTime.now()); +} + +class EditRekamStateDone extends EditRekamState { + final String pesan; + EditRekamStateDone({ + required this.pesan, + }) : super(DateTime.now()); +} \ No newline at end of file diff --git a/lib/screen/rekaman/edit_rekam_screen.dart b/lib/screen/rekaman/edit_rekam_screen.dart index 6f8e21a..0156b9f 100644 --- a/lib/screen/rekaman/edit_rekam_screen.dart +++ b/lib/screen/rekaman/edit_rekam_screen.dart @@ -6,8 +6,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:toastification/toastification.dart'; import '../../app/constant.dart'; +import '../../app/route.dart'; import '../../provider/current_user_provider.dart'; import '../../provider/voice_to_text_provider.dart'; +import '../home/list_riwayat_rekaman_provider.dart'; +import 'edit_rekam_provider.dart'; class EditRekamScreen extends HookConsumerWidget { const EditRekamScreen({super.key}); @@ -28,6 +31,7 @@ class EditRekamScreen extends HookConsumerWidget { final player = useState(AudioPlayer()); final urlRekaman = baseUrl + editData.Voice2text_Url; final isPlaying = useState(false); + final isLoading = useState(false); useEffect(() { WidgetsBinding.instance.addPostFrameCallback((timestamp) { @@ -84,10 +88,10 @@ class EditRekamScreen extends HookConsumerWidget { if (urlRekaman.isNotEmpty) { try { if (isPlaying.value) { - await player.value.pause(); // Pause jika sedang diputar + await player.value.stop(); // Jika sedang diputar, maka stop } else { await player.value.setSourceUrl(urlRekaman); - await player.value.resume(); // Putar jika tidak sedang diputar + await player.value.resume(); // Jika tidak diputar, mulai pemutaran } isPlaying.value = !isPlaying.value; } catch (e) { @@ -110,6 +114,52 @@ class EditRekamScreen extends HookConsumerWidget { } } + // list Riwayat Rekam + ref.listen(listRiwayatRekamanProvider, (prev, next) { + if (next is ListRiwayatRekamanStateLoading) { + // isLoading.value = true; + } else if (next is ListRiwayatRekamanStateError) { + // isLoading.value = false; + // errorMessage.value = next.message; + showLongToast( + 'Error', + next.message, + 'error', + Duration(seconds: 3), + ); + } else if (next is ListRiwayatRekamanStateDone) { + // isLoading.value = false; + + Navigator.of(context).pop(); + Navigator.of(context).pushNamedAndRemoveUntil( + homeRoute, + (route) => false, + ); + } + }); + + // proses edit + ref.listen(editRekamProvider, (prev, next) { + if (next is EditRekamStateLoading) { + isLoading.value = true; + } else if (next is EditRekamStateError) { + isLoading.value = false; + // errorMessage.value = next.message; + showLongToast( + 'Error', + next.message, + 'error', + Duration(seconds: 3), + ); + } else if (next is EditRekamStateDone) { + isLoading.value = false; + ref.read(listRiwayatRekamanProvider.notifier).listRiwayatRekaman( + host: host, + userId: userId, + ); + } + }); + return GestureDetector( onTap: () { FocusManager.instance.primaryFocus!.unfocus(); @@ -144,7 +194,17 @@ class EditRekamScreen extends HookConsumerWidget { ), const Spacer(), ElevatedButton( - onPressed: playRekaman, + onPressed: isLoading.value + ? null + : () async { + isLoading.value = true; + ref.read(editRekamProvider.notifier).editRekam( + host: host, + Voice2text_ID: editData.Voice2text_ID, + Voice2text_Note: ref.read(noteCtr).text, + Voice2text_Text: ref.read(textCtr).text, + ); + }, style: ElevatedButton.styleFrom( backgroundColor: Constant.bgButton, shape: RoundedRectangleBorder( @@ -155,19 +215,28 @@ class EditRekamScreen extends HookConsumerWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - 'SAVE', - style: Constant.titleButton500(context: context).copyWith( - color: Constant.textWhite, - ), - ), + isLoading.value + ? Text( + 'LOADING', + style: Constant.titleButton500(context: context) + .copyWith( + color: Constant.textWhite, + ), + ) + : Text( + 'SAVE', + style: Constant.titleButton500(context: context) + .copyWith( + color: Constant.textWhite, + ), + ), ], ), ), ], ), ), - body: Column( + body: ListView( children: [ // atas Image.asset( diff --git a/lib/screen/rekaman/rekam_screen.dart b/lib/screen/rekaman/rekam_screen.dart index 7c94991..e9a4e49 100644 --- a/lib/screen/rekaman/rekam_screen.dart +++ b/lib/screen/rekaman/rekam_screen.dart @@ -373,7 +373,7 @@ class RekamScreen extends HookConsumerWidget { ), body: Padding( padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( + child: ListView( children: [ if (awalan.value == "Info :") SizedBox(