step 25 : upload ktp, qrcode string, edit data,

check token expired 10 menit dari expired_date
This commit is contained in:
sindhu
2025-02-28 05:21:17 +07:00
parent 464f747892
commit 29c38b011a
23 changed files with 1342 additions and 609 deletions

View File

@@ -7,15 +7,17 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image/image.dart' as img;
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:scanktpflutter/model/no-login/no_login_edit_person_ktp_model.dart';
import 'package:scanktpflutter/model/no-login/no_login_sex_model.dart';
import '../../app/app_extension.dart';
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/no-login-scan/no_login_scan_provider.dart';
import '../../provider/no-login/no_login_current_user_provider.dart';
import '../../widget/customsnackbarwidget.dart';
import '../home/list_riwayat_scan_provider.dart';
import '../no-login-home/no_login_riwayat_scan_provider.dart';
import '../no-login/no_login_refresh_token_provider.dart';
import 'no_login_upload_scan_provider.dart';
class NoLoginScanScreen extends HookConsumerWidget {
@@ -43,11 +45,40 @@ class NoLoginScanScreen extends HookConsumerWidget {
final croppedImage = useState<File?>(null);
final isLoading = useState<bool>(false);
final isLoadingUpload = useState<bool>(false);
final currentUser = ref.watch(currentUserProvider);
// auth
final currentUser = ref.watch(noLoginCurrentUserProvider);
final host = currentUser?.host ?? "";
final userId = currentUser?.model.userId ?? "";
final client_id = currentUser?.client_id ?? "";
final expire_date = currentUser?.expire_date ?? "";
final token = currentUser?.token ?? "";
final selectedResolution =
useState<ResolutionPreset>(ResolutionPreset.medium);
final readProsesAksi = ref.watch(noLoginprosesAksi);
final base64Post = useState("");
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
if (client_id == "0" || token == "") {
// not logged in and doesn't have token
Navigator.of(context)
.pushNamedAndRemoveUntil(noLoginRoute, (route) => false);
return;
}
if (token != "") {
if (await isTokenExpired() == true) {
print("Token expired, refreshing...");
ref.read(noLoginRefreshTokenProvider.notifier).refreshToken(
client_id: client_id,
host: host,
expire_date: expire_date,
);
}
}
});
return () {};
}, [currentUser]);
Future<void> initializeCamera() async {
try {
@@ -85,13 +116,13 @@ class NoLoginScanScreen extends HookConsumerWidget {
if (loadingScreen.value) {
return Scaffold(
appBar: AppBar(
title: (cameraOn.value == false)
title: (judulTombol.value == "SCAN")
? Text(
judulAppBar.value,
judulPosisiHp.value,
style: Constant.titlePosisiHP(context: context),
)
: Text(
judulPosisiHp.value,
judulAppBar.value,
style: Constant.titlePosisiHP(context: context),
),
automaticallyImplyLeading: false,
@@ -204,6 +235,54 @@ class NoLoginScanScreen extends HookConsumerWidget {
return () {};
}, []);
// void getRiwayat
void getRiwayat() async {
if (await isTokenExpired() == true) {
ref.read(noLoginprosesAksi.notifier).state = Constant.getRiwayat;
print("Token expired, refreshing...");
ref.read(noLoginRefreshTokenProvider.notifier).refreshToken(
client_id: client_id,
host: host,
expire_date: expire_date,
);
} else {
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
host: host,
client_id: client_id,
token: token,
expire_date: expire_date,
);
}
}
// void prosesUpload
void prosesUpload() async {
print("Token expired, refreshing...");
print("client_id : $client_id");
print("host : $host");
print("expire_date : $expire_date");
print("token : $token");
print("qrCodeStr.value : ${qrCodeStr.value}");
if (await isTokenExpired() == true) {
ref.read(noLoginprosesAksi.notifier).state = Constant.postUploadFoto;
print("Token expired, refreshing...");
ref.read(noLoginRefreshTokenProvider.notifier).refreshToken(
client_id: client_id,
host: host,
expire_date: expire_date,
);
} else {
ref.read(noLoginUploadScanProvider.notifier).uploadScan(
host: host,
base64File: base64Post.value,
client_id: client_id,
qr_code: qrCodeStr.value,
token: token,
);
}
}
Future<void> initializeCameraAfterChangeResolution() async {
final cameras = await availableCameras();
cameraController.value = CameraController(
@@ -290,11 +369,8 @@ class NoLoginScanScreen extends HookConsumerWidget {
// post ke BE
Uint8List finalBytes = await croppedImage.value!.readAsBytes();
String base64String = base64Encode(finalBytes);
ref.read(noLoginUploadScanProvider.notifier).uploadScan(
host: host,
base64File: base64String,
userId: userId,
);
base64Post.value = base64String;
prosesUpload();
} catch (e) {
print("Error capturing image: $e");
} finally {
@@ -302,12 +378,12 @@ class NoLoginScanScreen extends HookConsumerWidget {
}
}
// listRiwayProvider
ref.listen(listRiwayatScanProvider, (prev, next) {
if (next is ListRiwayatScanStateLoading) {
// isLoading.value = true;
} else if (next is ListRiwayatScanStateError) {
// isLoading.value = false;
// refreshToken Provider
ref.listen(noLoginRefreshTokenProvider, (prev, next) async {
if (next is NoLoginRefreshTokenStateLoading) {
isLoading.value = true;
} else if (next is NoLoginRefreshTokenStateError) {
isLoading.value = false;
// errorMessage.value = next.message;
snackbarWidget(
context,
@@ -315,12 +391,47 @@ class NoLoginScanScreen extends HookConsumerWidget {
snackbarType.error,
Duration(seconds: 3),
);
} else if (next is ListRiwayatScanStateDone) {
// isLoading.value = false;
} else if (next is NoLoginRefreshTokenStateDone) {
isLoading.value = false;
// check proses aksi yg berlangsung
if (readProsesAksi == Constant.getRiwayat) {
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
host: host,
client_id: client_id,
token: token,
expire_date: expire_date,
);
} else if (readProsesAksi == Constant.postUploadFoto) {
ref.read(noLoginUploadScanProvider.notifier).uploadScan(
host: host,
base64File: base64Post.value,
client_id: client_id,
qr_code: qrCodeStr.value,
token: token,
);
}
}
});
// listRiwayProvider
ref.listen(noLoginRiwayatScanProvider, (prev, next) async {
if (next is NoLoginRiwayatScanStateLoading) {
isLoading.value = true;
} else if (next is NoLoginRiwayatScanStateError) {
isLoading.value = false;
// errorMessage.value = next.message;
snackbarWidget(
context,
next.message,
snackbarType.error,
Duration(seconds: 3),
);
} else if (next is NoLoginRiwayatScanStateDone) {
// isLoading.value = false;
Navigator.of(context).pop();
Navigator.of(context).pushNamed(
editScanRoute,
noLoginEditScanRoute,
);
}
});
@@ -344,13 +455,13 @@ class NoLoginScanScreen extends HookConsumerWidget {
ref.read(selectedPersonIdx.notifier).state = next.model[0].personID;
// set SEX
ref.read(eSexSelected.notifier).state = SexModel(
ref.read(eSexSelected.notifier).state = NoLoginSexModel(
M_SexID: next.model[0].personSex,
M_SexCode: "",
m_sexname: next.model[0].m_sexname,
M_SexNameLang: "");
ref.read(selectedEdit.notifier).state = EditPersonModel(
ref.read(selectedEdit.notifier).state = NoLoginEditPersonKtpModel(
personID: next.model[0].personID,
personNIK: next.model[0].personNIK,
personName: next.model[0].personName,
@@ -358,12 +469,9 @@ class NoLoginScanScreen extends HookConsumerWidget {
personDob: next.model[0].personDob,
personSex: next.model[0].personSex,
personUrl: next.model[0].personUrl,
personQrCode: next.model[0].personQrCode,
);
ref.read(listRiwayatScanProvider.notifier).listRiwayatScan(
host: host,
userId: userId,
);
getRiwayat();
}
});
@@ -384,7 +492,7 @@ class NoLoginScanScreen extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: (cameraOn.value == false)
title: (cameraOrScanner.value == "SCAN")
? Text(
judulAppBar.value,
style: Constant.titlePosisiHP(context: context),