step 23 : fix check isTokenExpired > 3 menit refreshToken

This commit is contained in:
sindhu
2025-02-27 01:25:19 +07:00
parent a28830deb0
commit b723dc4596
4 changed files with 62 additions and 125 deletions

View File

@@ -1,59 +1,45 @@
import 'dart:convert';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'constant.dart';
String formatDateJiffy(String serverDate) { String formatDateJiffy(String serverDate) {
return Jiffy.parse(serverDate).format(pattern: 'dd-MM-yyyy'); return Jiffy.parse(serverDate).format(pattern: 'dd-MM-yyyy');
} }
// Future<bool> isTokenExpired() async {
// final prefs = await SharedPreferences.getInstance();
// final String? expireDateStr = prefs.getString("expire_date");
// if (expireDateStr == null) return true;
// final DateTime expireDateTime = DateTime.parse(expireDateStr);
// final DateTime now = DateTime.now();
// print('expireDateTime : '+expireDateTime.toString());
// print('now : '+now.toString());
// // return DateTime.now().isAfter(expireDateTime);
// // Jika token kurang dari 1 menit lagi akan kedaluwarsa,
// // atau lebih dari = 2 menit, maka harus refresh
// return (expireDateTime.difference(now).inMinutes == 1) || (expireDateTime.difference(now).inMinutes >= 2);
// }
Future<bool> isTokenExpired() async { Future<bool> isTokenExpired() async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
final String? expireDateStr = prefs.getString("expire_date"); final bearerString = prefs.getString(Constant.bearerName);
print("📌 Expire Date dari SharedPreferences: $expireDateStr"); if (bearerString == null || bearerString == "null") {
print("BEARER STRING NULL");
if (expireDateStr == null) {
print("❌ Expire date tidak ditemukan, dianggap expired.");
return true; return true;
} }
DateTime? expireDateTime; final xmodel = jsonDecode(bearerString);
if (xmodel == null) return true;
final String? expireDateStr = xmodel['expire_date'];
print("EXPIRE DATE $expireDateStr");
if (expireDateStr == null || expireDateStr.isEmpty) {
print("Token EXPIRED (Tidak Ada Tanggal Expire)");
return true; // Anggap expired jika tidak ada data
}
try { try {
expireDateTime = DateTime.parse(expireDateStr); DateTime expiredDate = DateTime.parse(expireDateStr);
DateTime batasExpired = expiredDate.subtract(Duration(minutes: 3));
DateTime now = DateTime.now();
final bool expired = now.isAfter(batasExpired);
print(expired ? "Token EXPIRED (Perlu Refresh)" : "Token MASIH AKTIF");
return expired;
} catch (e) { } catch (e) {
print("❌ Format expire_date tidak valid: $expireDateStr, Error: $e"); print("Token EXPIRED (Format Salah)");
return true; return true; // Anggap expired jika terjadi error parsing
} }
final DateTime now = DateTime.now();
final int diffInMinutes = expireDateTime.difference(now).inMinutes;
print("🕒 Expire date: $expireDateTime");
print("🕒 Waktu sekarang: $now");
print("⏳ Selisih waktu dalam menit: $diffInMinutes");
// Jika sudah lewat atau kurang dari 4 menit, anggap expired agar bisa di-refresh sebelum benar-benar habis
final bool expired = now.isAfter(expireDateTime) || diffInMinutes <= 4;
print(expired ? "🔴 Token EXPIRED (Perlu Refresh)" : "🟢 Token MASIH AKTIF");
// final bool expired = now.isAfter(expireDateTime);
return expired;
} }

View File

@@ -88,23 +88,30 @@ class NoLoginHomeScreen extends HookConsumerWidget {
final userId = currentUser?.client_id ?? ""; final userId = currentUser?.client_id ?? "";
final expireDate = currentUser?.expire_date ?? ""; final expireDate = currentUser?.expire_date ?? "";
if (await isTokenExpired()) { if (await isTokenExpired() == true) {
print("Token expired, refreshing..."); print("Token expired, refreshing...");
ref.read(noLoginRefreshTokenProvider.notifier).refreshToken( ref.read(noLoginRefreshTokenProvider.notifier).refreshToken(
client_id: userId, client_id: userId,
host: host, host: host,
expire_date: expireDate, expire_date: expireDate,
); );
}
// Ambil data riwayat scan setelah token diperbarui ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan( host: host,
host: host, userId: userId,
userId: userId, token: ref.read(noLoginCurrentUserProvider)?.token ?? "",
token: ref.read(noLoginCurrentUserProvider)?.token ?? "", expire_date:
expire_date: ref.read(noLoginCurrentUserProvider)?.expire_date ?? "",
ref.read(noLoginCurrentUserProvider)?.expire_date ?? "", );
); } else {
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
host: host,
userId: userId,
token: ref.read(noLoginCurrentUserProvider)?.token ?? "",
expire_date:
ref.read(noLoginCurrentUserProvider)?.expire_date ?? "",
);
}
} }
return GestureDetector( return GestureDetector(
@@ -212,20 +219,20 @@ class NoLoginHomeScreen extends HookConsumerWidget {
child: Column( child: Column(
children: [ children: [
// DEBUG // DEBUG
Text(currentUser?.token ?? ""), // Text(currentUser?.token ?? ""),
SizedBox( // SizedBox(
height: Constant.getActualYPhone( // height: Constant.getActualYPhone(
context: context, // context: context,
y: 24, // y: 24,
), // ),
), // ),
Text(currentUser?.expire_date ?? ""), // Text(currentUser?.expire_date ?? ""),
SizedBox( // SizedBox(
height: Constant.getActualYPhone( // height: Constant.getActualYPhone(
context: context, // context: context,
y: 24, // y: 24,
), // ),
), // ),
// DEBUG // DEBUG
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,

View File

@@ -121,7 +121,6 @@ class NoLoginNotifier extends StateNotifier<NoLoginState> {
required String host, required String host,
required String password, required String password,
}) async { }) async {
try {
state = NoLoginStateLoading(); state = NoLoginStateLoading();
final resp = await NoLoginAuthRepository( final resp = await NoLoginAuthRepository(
dio: ref.read(dioProvider), dio: ref.read(dioProvider),
@@ -135,43 +134,19 @@ class NoLoginNotifier extends StateNotifier<NoLoginState> {
// Simpan ke SharedPreferences // Simpan ke SharedPreferences
final shared = await SharedPreferences.getInstance(); final shared = await SharedPreferences.getInstance();
String expireDateStr = resp.expire_date;
// Pastikan format ISO 8601 dengan "T"
if (!expireDateStr.contains("T")) {
expireDateStr = expireDateStr.replaceFirst(" ", "T");
}
// Cek apakah expire_date valid
try {
DateTime.parse(expireDateStr);
} catch (e) {
print(
"❌ Format expire_date tidak valid: $expireDateStr, menggunakan waktu default.");
expireDateStr = DateTime.now().toIso8601String();
}
// Simpan token dalam format JSON // Simpan token dalam format JSON
final token = jsonEncode({ final token = jsonEncode({
"expire_date": resp.expire_date,
"host": host, "host": host,
"date": DateTime.now().toIso8601String(), "date": DateTime.now().toIso8601String(),
"token": resp.token, "token": resp.token,
"client_id": resp.client_id, "client_id": resp.client_id,
"expire_date": expireDateStr,
"isLogin": resp.isLogin, "isLogin": resp.isLogin,
}); });
await shared.setString(Constant.bearerName, token); await shared.setString(Constant.bearerName, token);
ref.read(noLoginCurrentUserProvider.notifier).state = resp; ref.read(noLoginCurrentUserProvider.notifier).state = resp;
print("✅ Token berhasil disimpan ke SharedPreferences!");
} catch (e) {
if (e is BaseRepositoryException) {
state = NoLoginStateError(message: e.message);
} else {
state = NoLoginStateError(message: e.toString());
}
}
} }
} }

View File

@@ -141,50 +141,19 @@ class NoLoginRefreshTokenNotifier
expire_date: expire_date, expire_date: expire_date,
); );
print("📌 Token diperbarui: ${resp.token}");
print("📌 Expire date dari API: ${resp.expire_date}");
// Cek apakah expire_date dari API null atau kosong
if (resp.expire_date == null || resp.expire_date.isEmpty) {
print("❌ Error: expire_date dari API kosong!");
return;
}
// Konversi format expire_date ke ISO 8601
String expireDateStr = resp.expire_date.replaceFirst(" ", "T");
// Validasi apakah expire_date dapat dikonversi ke DateTime
try {
DateTime parsedExpireDate = DateTime.parse(expireDateStr);
print("✅ expire_date berhasil dikonversi: $parsedExpireDate");
} catch (e) {
print("❌ Error parsing expire_date: $e");
return;
}
// Simpan token ke SharedPreferences // Simpan token ke SharedPreferences
final shared = await SharedPreferences.getInstance(); final shared = await SharedPreferences.getInstance();
// await shared.setString("expire_date", expireDateStr);
print("✅ expire_date berhasil disimpan: $expireDateStr");
final tokenData = jsonEncode({ final tokenData = jsonEncode({
"expire_date": resp.expire_date,
"host": host, "host": host,
"date": DateTime.now().toString(), "date": DateTime.now().toString(),
"token": resp.token, "token": resp.token,
"client_id": resp.client_id, "client_id": resp.client_id,
"expire_date": expireDateStr,
"isLogin": resp.isLogin, "isLogin": resp.isLogin,
}); });
await shared.setString(Constant.bearerName, tokenData); await shared.setString(Constant.bearerName, tokenData);
print("✅ Token data berhasil diperbarui: $tokenData");
// Cek ulang apakah expire_date berhasil disimpan dengan benar
String? cekExpireDate = shared.getString("expire_date");
print(
"📌 expire_date yang tersimpan di SharedPreferences: $cekExpireDate");
ref.read(noLoginCurrentUserProvider.notifier).state = resp; ref.read(noLoginCurrentUserProvider.notifier).state = resp;
state = NoLoginRefreshTokenStateDone(model: resp); state = NoLoginRefreshTokenStateDone(model: resp);
} catch (e) { } catch (e) {