step 20 : load list riwayat ketika proses sukses, display duration scan 3 detik
This commit is contained in:
BIN
images/logoapk.png
Normal file
BIN
images/logoapk.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
45
lib/model/sukses_person_model.dart
Normal file
45
lib/model/sukses_person_model.dart
Normal 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,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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>(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user