diff --git a/images/logoapk.png b/images/logoapk.png new file mode 100644 index 0000000..e2620a3 Binary files /dev/null and b/images/logoapk.png differ diff --git a/lib/model/sukses_person_model.dart b/lib/model/sukses_person_model.dart new file mode 100644 index 0000000..45a92d1 --- /dev/null +++ b/lib/model/sukses_person_model.dart @@ -0,0 +1,45 @@ +class SuksesPersonModel { + final String personID; + final String personNIK; + final String personName; + final String personDob; + final String personSex; + final String personUrl; + final String m_sexname; + + SuksesPersonModel({ + required this.personID, + required this.personNIK, + required this.personName, + required this.personDob, + required this.personSex, + required this.personUrl, + required this.m_sexname, + }); + + // Convert JSON to Model + factory SuksesPersonModel.fromJson(Map json) { + return SuksesPersonModel( + personID: json['Person_ID'] ?? "", + personNIK: json['Person_NIK'] ?? "", + personName: json['Person_Name'] ?? "", + personDob: json['Person_Dob'] ?? DateTime.now(), + personSex: json['Person_Sex'] ?? "", + personUrl: json['Person_Url'] ?? "", + m_sexname: json['m_sexname'] ?? "", + ); + } + + // Convert Model to JSON + Map toJson() { + return { + 'Person_ID':personID, + 'Person_NIK': personNIK, + 'Person_Name': personName, + 'Person_Dob': personDob, + 'Person_Sex': personSex, + 'Person_Url': personUrl, + 'm_sexname':m_sexname, + }; + } +} diff --git a/lib/provider/scan_provider.dart b/lib/provider/scan_provider.dart index 15bce8a..057259c 100644 --- a/lib/provider/scan_provider.dart +++ b/lib/provider/scan_provider.dart @@ -3,6 +3,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:scanktpflutter/model/sex_model.dart'; import '../model/edit_person_model.dart'; +import '../model/person_ktp_model.dart'; + +// list scan +final listScanRwt = StateProvider>( + (ref) => List.empty( + growable: true, + ), +); final selectedPersonIdx = StateProvider((ref) => "0"); final selectedEdit = StateProvider( diff --git a/lib/repository/scan_repository.dart b/lib/repository/scan_repository.dart index d80bf66..4e1297d 100644 --- a/lib/repository/scan_repository.dart +++ b/lib/repository/scan_repository.dart @@ -1,6 +1,7 @@ import '../../model/sex_model.dart'; import '../model/person_ktp_model.dart'; +import '../model/sukses_person_model.dart'; import 'base_repository.dart'; class ScanRepository extends BaseRepository { @@ -23,7 +24,7 @@ class ScanRepository extends BaseRepository { return result; } - Future prosesScan({ + Future> prosesScan({ required String host, required String base64File, required String userId, @@ -34,13 +35,13 @@ class ScanRepository extends BaseRepository { "userId": userId, }, service: service); - if (resp['status'] == "OK") { - return "Sukses Upload File"; - } else { - resp['message']; - } + final result = List.empty(growable: true); + resp['data'].forEach((e) { + final model = SuksesPersonModel.fromJson(e); + result.add(model); + }); - return resp['message']; + return result; } // sex diff --git a/lib/screen/home/home_screen.dart b/lib/screen/home/home_screen.dart index 8a076ec..4cafc58 100644 --- a/lib/screen/home/home_screen.dart +++ b/lib/screen/home/home_screen.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import '../../model/person_ktp_model.dart'; +import '../../provider/scan_provider.dart'; import '../../screen/home/card_riwayat_scan.dart'; import '../../screen/home/list_riwayat_scan_provider.dart'; @@ -24,9 +24,7 @@ class HomeScreen extends HookConsumerWidget { // final username = currentUser?.model.username ?? "-"; final host = currentUser?.host ?? ""; final isLoading = useState(false); - final listScanArr = useState>( - List.empty(growable: true), - ); + final listScanArr = ref.watch(listScanRwt); final userId = currentUser?.model.userId ?? ""; useEffect(() { @@ -57,7 +55,6 @@ class HomeScreen extends HookConsumerWidget { ); } else if (next is ListRiwayatScanStateDone) { isLoading.value = false; - listScanArr.value = next.model; } }); @@ -212,7 +209,7 @@ class HomeScreen extends HookConsumerWidget { ), ) // belum ada riwayat - else if (listScanArr.value.isEmpty) + else if (listScanArr.isEmpty) Expanded( child: RefreshIndicator( color: Constant.bgButton, @@ -260,9 +257,9 @@ class HomeScreen extends HookConsumerWidget { child: ListView.builder( physics: AlwaysScrollableScrollPhysics(), shrinkWrap: true, - itemCount: listScanArr.value.length, + itemCount: listScanArr.length, itemBuilder: (context, i) { - final obj = listScanArr.value[i]; + final obj = listScanArr[i]; return Padding( padding: EdgeInsets.only( top: Constant.getActualYPhone( diff --git a/lib/screen/home/list_riwayat_scan_provider.dart b/lib/screen/home/list_riwayat_scan_provider.dart index 147c566..ea07824 100644 --- a/lib/screen/home/list_riwayat_scan_provider.dart +++ b/lib/screen/home/list_riwayat_scan_provider.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../provider/scan_provider.dart'; import '../../repository/scan_repository.dart'; import '../../model/person_ktp_model.dart'; @@ -24,13 +25,11 @@ class ListRiwayatScanNotifier extends StateNotifier { state = ListRiwayatScanStateLoading(); final resp = await ScanRepository( dio: ref.read(dioProvider), - ).listRiwayatScanRepo( - host: host, - userId:userId - ); + ).listRiwayatScanRepo(host: host, userId: userId); // print(resp); state = ListRiwayatScanStateDone(model: resp); + ref.read(listScanRwt.notifier).state = resp; } catch (e) { if (e is BaseRepositoryException) { state = ListRiwayatScanStateError(message: e.message); diff --git a/lib/screen/scan/edit_scan_screen.dart b/lib/screen/scan/edit_scan_screen.dart index 180175f..ba13cef 100644 --- a/lib/screen/scan/edit_scan_screen.dart +++ b/lib/screen/scan/edit_scan_screen.dart @@ -13,6 +13,7 @@ import '../../app/app_extension.dart'; import '../../app/constant.dart'; import '../../app/route.dart'; import '../../provider/current_user_provider.dart'; +import '../home/list_riwayat_scan_provider.dart'; class EditScanScreen extends HookConsumerWidget { const EditScanScreen({super.key}); @@ -167,6 +168,30 @@ class EditScanScreen extends HookConsumerWidget { } } + // listRiwayProvider + ref.listen(listRiwayatScanProvider, (prev, next) { + if (next is ListRiwayatScanStateLoading) { + // isLoading.value = true; + } else if (next is ListRiwayatScanStateError) { + // isLoading.value = false; + // errorMessage.value = next.message; + snackbarWidget( + context, + next.message, + snackbarType.error, + Duration(seconds: 3), + ); + } else if (next is ListRiwayatScanStateDone) { + // isLoading.value = false; + + Navigator.of(context).pop(); + Navigator.of(context).pushNamedAndRemoveUntil( + homeRoute, + (route) => false, + ); + } + }); + // proses edit ref.listen(editScanProvider, (prev, next) { if (next is EditScanStateLoading) { @@ -182,17 +207,10 @@ class EditScanScreen extends HookConsumerWidget { ); } else if (next is EditScanStateDone) { isLoading.value = false; - snackbarWidget( - context, - next.pesan, - snackbarType.success, - Duration(seconds: 3), - ); - Navigator.of(context).pushNamedAndRemoveUntil( - homeRoute, - (route) => false, - ); - return; + ref.read(listRiwayatScanProvider.notifier).listRiwayatScan( + host: host, + userId: userId, + ); } }); diff --git a/lib/screen/scan/scan_screen.dart b/lib/screen/scan/scan_screen.dart index de4e5c5..77c5884 100644 --- a/lib/screen/scan/scan_screen.dart +++ b/lib/screen/scan/scan_screen.dart @@ -9,8 +9,12 @@ import 'package:image/image.dart' as img; import '../../app/route.dart'; import '../../app/constant.dart'; +import '../../model/edit_person_model.dart'; +import '../../model/sex_model.dart'; import '../../provider/current_user_provider.dart'; +import '../../provider/scan_provider.dart'; import '../../widget/customsnackbarwidget.dart'; +import '../home/list_riwayat_scan_provider.dart'; import 'upload_scan_provider.dart'; class ScanScreen extends HookConsumerWidget { @@ -149,6 +153,29 @@ class ScanScreen extends HookConsumerWidget { } } + // listRiwayProvider + ref.listen(listRiwayatScanProvider, (prev, next) { + if (next is ListRiwayatScanStateLoading) { + // isLoading.value = true; + } else if (next is ListRiwayatScanStateError) { + // isLoading.value = false; + // errorMessage.value = next.message; + snackbarWidget( + context, + next.message, + snackbarType.error, + Duration(seconds: 3), + ); + } else if (next is ListRiwayatScanStateDone) { + // isLoading.value = false; + + Navigator.of(context).pop(); + Navigator.of(context).pushNamed( + editScanRoute, + ); + } + }); + // proses upload ref.listen(uploadScanProvider, (prev, next) { if (next is UploadScanStateLoading) { @@ -165,27 +192,41 @@ class ScanScreen extends HookConsumerWidget { ); } else if (next is UploadScanStateDone) { isLoadingUpload.value = false; - snackbarWidget( - context, - next.pesan, - snackbarType.success, - Duration(seconds: 3), + ref.read(selectedPersonIdx.notifier).state = next.model[0].personID; + + // set SEX + ref.read(eSexSelected.notifier).state = SexModel( + M_SexID: next.model[0].personSex, + M_SexCode: "", + m_sexname: next.model[0].m_sexname, + M_SexNameLang: ""); + + ref.read(selectedEdit.notifier).state = EditPersonModel( + personID: next.model[0].personID, + personNIK: next.model[0].personNIK, + personName: next.model[0].personName, + m_sexname: next.model[0].m_sexname, + personDob: next.model[0].personDob, + personSex: next.model[0].personSex, + personUrl: next.model[0].personUrl, ); - Navigator.of(context) - .pushNamedAndRemoveUntil(homeRoute, (route) => false); + + ref.read(listRiwayatScanProvider.notifier).listRiwayatScan( + host: host, + userId: userId, + ); } }); // loading proses upload useEffect useEffect(() { - WidgetsBinding.instance.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((timestamp) { if (isLoadingUpload.value == true) { snackbarWidget( context, 'Sedang Upload Foto...', snackbarType.warning, - // Duration(seconds: 3), - Duration(days: 1), + Duration(seconds: 3), ); } }); diff --git a/lib/screen/scan/upload_scan_provider.dart b/lib/screen/scan/upload_scan_provider.dart index 2c28a60..d29971b 100644 --- a/lib/screen/scan/upload_scan_provider.dart +++ b/lib/screen/scan/upload_scan_provider.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../model/sukses_person_model.dart'; import '../../repository/scan_repository.dart'; import '../../provider/dio_provider.dart'; @@ -29,7 +30,7 @@ class UploadScanNotifier extends StateNotifier { ); // print(resp); - state = UploadScanStateDone(pesan: resp); + state = UploadScanStateDone(model: resp); } catch (e) { if (e is BaseRepositoryException) { state = UploadScanStateError(message: e.message); @@ -64,8 +65,8 @@ class UploadScanStateError extends UploadScanState { } class UploadScanStateDone extends UploadScanState { - final String pesan; + final List model; UploadScanStateDone({ - required this.pesan, + required this.model, }) : super(DateTime.now()); }