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:shared_preferences/shared_preferences.dart';
import 'constant.dart';
String formatDateJiffy(String serverDate) {
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 {
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 (expireDateStr == null) {
print("❌ Expire date tidak ditemukan, dianggap expired.");
if (bearerString == null || bearerString == "null") {
print("BEARER STRING NULL");
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 {
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) {
print("❌ Format expire_date tidak valid: $expireDateStr, Error: $e");
return true;
print("Token EXPIRED (Format Salah)");
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 expireDate = currentUser?.expire_date ?? "";
if (await isTokenExpired()) {
if (await isTokenExpired() == true) {
print("Token expired, refreshing...");
ref.read(noLoginRefreshTokenProvider.notifier).refreshToken(
client_id: userId,
host: host,
expire_date: expireDate,
);
}
// Ambil data riwayat scan setelah token diperbarui
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
host: host,
userId: userId,
token: ref.read(noLoginCurrentUserProvider)?.token ?? "",
expire_date:
ref.read(noLoginCurrentUserProvider)?.expire_date ?? "",
);
ref.read(noLoginRiwayatScanProvider.notifier).noLoginRiwayatScan(
host: host,
userId: userId,
token: ref.read(noLoginCurrentUserProvider)?.token ?? "",
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(
@@ -212,20 +219,20 @@ class NoLoginHomeScreen extends HookConsumerWidget {
child: Column(
children: [
// DEBUG
Text(currentUser?.token ?? ""),
SizedBox(
height: Constant.getActualYPhone(
context: context,
y: 24,
),
),
Text(currentUser?.expire_date ?? ""),
SizedBox(
height: Constant.getActualYPhone(
context: context,
y: 24,
),
),
// Text(currentUser?.token ?? ""),
// SizedBox(
// height: Constant.getActualYPhone(
// context: context,
// y: 24,
// ),
// ),
// Text(currentUser?.expire_date ?? ""),
// SizedBox(
// height: Constant.getActualYPhone(
// context: context,
// y: 24,
// ),
// ),
// DEBUG
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,

View File

@@ -121,7 +121,6 @@ class NoLoginNotifier extends StateNotifier<NoLoginState> {
required String host,
required String password,
}) async {
try {
state = NoLoginStateLoading();
final resp = await NoLoginAuthRepository(
dio: ref.read(dioProvider),
@@ -135,43 +134,19 @@ class NoLoginNotifier extends StateNotifier<NoLoginState> {
// Simpan ke SharedPreferences
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
final token = jsonEncode({
"expire_date": resp.expire_date,
"host": host,
"date": DateTime.now().toIso8601String(),
"token": resp.token,
"client_id": resp.client_id,
"expire_date": expireDateStr,
"isLogin": resp.isLogin,
});
await shared.setString(Constant.bearerName, token);
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,
);
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
final shared = await SharedPreferences.getInstance();
// await shared.setString("expire_date", expireDateStr);
print("✅ expire_date berhasil disimpan: $expireDateStr");
final tokenData = jsonEncode({
"expire_date": resp.expire_date,
"host": host,
"date": DateTime.now().toString(),
"token": resp.token,
"client_id": resp.client_id,
"expire_date": expireDateStr,
"isLogin": resp.isLogin,
});
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;
state = NoLoginRefreshTokenStateDone(model: resp);
} catch (e) {