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 '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>(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user