step 20 : load list riwayat ketika proses sukses, display duration scan 3 detik

This commit is contained in:
sindhu
2025-02-19 13:18:52 +07:00
parent 952934ed67
commit 8018bd89c6
9 changed files with 153 additions and 43 deletions

BIN
images/logoapk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -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<String, dynamic> 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<String, dynamic> toJson() {
return {
'Person_ID':personID,
'Person_NIK': personNIK,
'Person_Name': personName,
'Person_Dob': personDob,
'Person_Sex': personSex,
'Person_Url': personUrl,
'm_sexname':m_sexname,
};
}
}

View File

@@ -3,6 +3,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:scanktpflutter/model/sex_model.dart'; import 'package:scanktpflutter/model/sex_model.dart';
import '../model/edit_person_model.dart'; import '../model/edit_person_model.dart';
import '../model/person_ktp_model.dart';
// list scan
final listScanRwt = StateProvider<List<PersonKtp>>(
(ref) => List.empty(
growable: true,
),
);
final selectedPersonIdx = StateProvider<String>((ref) => "0"); final selectedPersonIdx = StateProvider<String>((ref) => "0");
final selectedEdit = StateProvider<EditPersonModel>( final selectedEdit = StateProvider<EditPersonModel>(

View File

@@ -1,6 +1,7 @@
import '../../model/sex_model.dart'; import '../../model/sex_model.dart';
import '../model/person_ktp_model.dart'; import '../model/person_ktp_model.dart';
import '../model/sukses_person_model.dart';
import 'base_repository.dart'; import 'base_repository.dart';
class ScanRepository extends BaseRepository { class ScanRepository extends BaseRepository {
@@ -23,7 +24,7 @@ class ScanRepository extends BaseRepository {
return result; return result;
} }
Future<String> prosesScan({ Future<List<SuksesPersonModel>> prosesScan({
required String host, required String host,
required String base64File, required String base64File,
required String userId, required String userId,
@@ -34,13 +35,13 @@ class ScanRepository extends BaseRepository {
"userId": userId, "userId": userId,
}, service: service); }, service: service);
if (resp['status'] == "OK") { final result = List<SuksesPersonModel>.empty(growable: true);
return "Sukses Upload File"; resp['data'].forEach((e) {
} else { final model = SuksesPersonModel.fromJson(e);
resp['message']; result.add(model);
} });
return resp['message']; return result;
} }
// sex // sex

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.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/card_riwayat_scan.dart';
import '../../screen/home/list_riwayat_scan_provider.dart'; import '../../screen/home/list_riwayat_scan_provider.dart';
@@ -24,9 +24,7 @@ class HomeScreen extends HookConsumerWidget {
// final username = currentUser?.model.username ?? "-"; // final username = currentUser?.model.username ?? "-";
final host = currentUser?.host ?? ""; final host = currentUser?.host ?? "";
final isLoading = useState<bool>(false); final isLoading = useState<bool>(false);
final listScanArr = useState<List<PersonKtp>>( final listScanArr = ref.watch(listScanRwt);
List.empty(growable: true),
);
final userId = currentUser?.model.userId ?? ""; final userId = currentUser?.model.userId ?? "";
useEffect(() { useEffect(() {
@@ -57,7 +55,6 @@ class HomeScreen extends HookConsumerWidget {
); );
} else if (next is ListRiwayatScanStateDone) { } else if (next is ListRiwayatScanStateDone) {
isLoading.value = false; isLoading.value = false;
listScanArr.value = next.model;
} }
}); });
@@ -212,7 +209,7 @@ class HomeScreen extends HookConsumerWidget {
), ),
) )
// belum ada riwayat // belum ada riwayat
else if (listScanArr.value.isEmpty) else if (listScanArr.isEmpty)
Expanded( Expanded(
child: RefreshIndicator( child: RefreshIndicator(
color: Constant.bgButton, color: Constant.bgButton,
@@ -260,9 +257,9 @@ class HomeScreen extends HookConsumerWidget {
child: ListView.builder( child: ListView.builder(
physics: AlwaysScrollableScrollPhysics(), physics: AlwaysScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemCount: listScanArr.value.length, itemCount: listScanArr.length,
itemBuilder: (context, i) { itemBuilder: (context, i) {
final obj = listScanArr.value[i]; final obj = listScanArr[i];
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: Constant.getActualYPhone( top: Constant.getActualYPhone(

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../provider/scan_provider.dart';
import '../../repository/scan_repository.dart'; import '../../repository/scan_repository.dart';
import '../../model/person_ktp_model.dart'; import '../../model/person_ktp_model.dart';
@@ -24,13 +25,11 @@ class ListRiwayatScanNotifier extends StateNotifier<ListRiwayatScanState> {
state = ListRiwayatScanStateLoading(); state = ListRiwayatScanStateLoading();
final resp = await ScanRepository( final resp = await ScanRepository(
dio: ref.read(dioProvider), dio: ref.read(dioProvider),
).listRiwayatScanRepo( ).listRiwayatScanRepo(host: host, userId: userId);
host: host,
userId:userId
);
// print(resp); // print(resp);
state = ListRiwayatScanStateDone(model: resp); state = ListRiwayatScanStateDone(model: resp);
ref.read(listScanRwt.notifier).state = resp;
} catch (e) { } catch (e) {
if (e is BaseRepositoryException) { if (e is BaseRepositoryException) {
state = ListRiwayatScanStateError(message: e.message); state = ListRiwayatScanStateError(message: e.message);

View File

@@ -13,6 +13,7 @@ import '../../app/app_extension.dart';
import '../../app/constant.dart'; import '../../app/constant.dart';
import '../../app/route.dart'; import '../../app/route.dart';
import '../../provider/current_user_provider.dart'; import '../../provider/current_user_provider.dart';
import '../home/list_riwayat_scan_provider.dart';
class EditScanScreen extends HookConsumerWidget { class EditScanScreen extends HookConsumerWidget {
const EditScanScreen({super.key}); 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 // proses edit
ref.listen(editScanProvider, (prev, next) { ref.listen(editScanProvider, (prev, next) {
if (next is EditScanStateLoading) { if (next is EditScanStateLoading) {
@@ -182,17 +207,10 @@ class EditScanScreen extends HookConsumerWidget {
); );
} else if (next is EditScanStateDone) { } else if (next is EditScanStateDone) {
isLoading.value = false; isLoading.value = false;
snackbarWidget( ref.read(listRiwayatScanProvider.notifier).listRiwayatScan(
context, host: host,
next.pesan, userId: userId,
snackbarType.success, );
Duration(seconds: 3),
);
Navigator.of(context).pushNamedAndRemoveUntil(
homeRoute,
(route) => false,
);
return;
} }
}); });

View File

@@ -9,8 +9,12 @@ import 'package:image/image.dart' as img;
import '../../app/route.dart'; import '../../app/route.dart';
import '../../app/constant.dart'; import '../../app/constant.dart';
import '../../model/edit_person_model.dart';
import '../../model/sex_model.dart';
import '../../provider/current_user_provider.dart'; import '../../provider/current_user_provider.dart';
import '../../provider/scan_provider.dart';
import '../../widget/customsnackbarwidget.dart'; import '../../widget/customsnackbarwidget.dart';
import '../home/list_riwayat_scan_provider.dart';
import 'upload_scan_provider.dart'; import 'upload_scan_provider.dart';
class ScanScreen extends HookConsumerWidget { 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 // proses upload
ref.listen(uploadScanProvider, (prev, next) { ref.listen(uploadScanProvider, (prev, next) {
if (next is UploadScanStateLoading) { if (next is UploadScanStateLoading) {
@@ -165,27 +192,41 @@ class ScanScreen extends HookConsumerWidget {
); );
} else if (next is UploadScanStateDone) { } else if (next is UploadScanStateDone) {
isLoadingUpload.value = false; isLoadingUpload.value = false;
snackbarWidget( ref.read(selectedPersonIdx.notifier).state = next.model[0].personID;
context,
next.pesan, // set SEX
snackbarType.success, ref.read(eSexSelected.notifier).state = SexModel(
Duration(seconds: 3), 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 // loading proses upload useEffect
useEffect(() { useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((timestamp) {
if (isLoadingUpload.value == true) { if (isLoadingUpload.value == true) {
snackbarWidget( snackbarWidget(
context, context,
'Sedang Upload Foto...', 'Sedang Upload Foto...',
snackbarType.warning, snackbarType.warning,
// Duration(seconds: 3), Duration(seconds: 3),
Duration(days: 1),
); );
} }
}); });

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../model/sukses_person_model.dart';
import '../../repository/scan_repository.dart'; import '../../repository/scan_repository.dart';
import '../../provider/dio_provider.dart'; import '../../provider/dio_provider.dart';
@@ -29,7 +30,7 @@ class UploadScanNotifier extends StateNotifier<UploadScanState> {
); );
// print(resp); // print(resp);
state = UploadScanStateDone(pesan: resp); state = UploadScanStateDone(model: resp);
} catch (e) { } catch (e) {
if (e is BaseRepositoryException) { if (e is BaseRepositoryException) {
state = UploadScanStateError(message: e.message); state = UploadScanStateError(message: e.message);
@@ -64,8 +65,8 @@ class UploadScanStateError extends UploadScanState {
} }
class UploadScanStateDone extends UploadScanState { class UploadScanStateDone extends UploadScanState {
final String pesan; final List<SuksesPersonModel> model;
UploadScanStateDone({ UploadScanStateDone({
required this.pesan, required this.model,
}) : super(DateTime.now()); }) : super(DateTime.now());
} }