step 23 : fix check isTokenExpired > 3 menit refreshToken
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user