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 '../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 selectedEdit = StateProvider<EditPersonModel>(

View File

@@ -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<String> prosesScan({
Future<List<SuksesPersonModel>> 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<SuksesPersonModel>.empty(growable: true);
resp['data'].forEach((e) {
final model = SuksesPersonModel.fromJson(e);
result.add(model);
});
return resp['message'];
return result;
}
// sex

View File

@@ -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<bool>(false);
final listScanArr = useState<List<PersonKtp>>(
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(

View File

@@ -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<ListRiwayatScanState> {
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);

View File

@@ -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,
);
}
});

View File

@@ -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),
);
}
});

View File

@@ -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<UploadScanState> {
);
// 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<SuksesPersonModel> model;
UploadScanStateDone({
required this.pesan,
required this.model,
}) : super(DateTime.now());
}