step 22 : no_login -> login dan list riwayat pake JWT done, masih belum done di refreshToken karena check waktu expired salah

This commit is contained in:
sindhu
2025-02-26 19:28:02 +07:00
parent 113da748fa
commit a28830deb0
14 changed files with 1897 additions and 3 deletions

View File

@@ -1,5 +1,59 @@
import 'package:jiffy/jiffy.dart';
import 'package:shared_preferences/shared_preferences.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");
print("📌 Expire Date dari SharedPreferences: $expireDateStr");
if (expireDateStr == null) {
print("❌ Expire date tidak ditemukan, dianggap expired.");
return true;
}
DateTime? expireDateTime;
try {
expireDateTime = DateTime.parse(expireDateStr);
} catch (e) {
print("❌ Format expire_date tidak valid: $expireDateStr, Error: $e");
return true;
}
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

@@ -1,4 +1,7 @@
import 'package:flutter/material.dart';
import '../screen/no-login-home/no_login_home_screen.dart';
import '../screen/no-login-splash/no_login_splash_screen.dart';
import '../screen/no-login/no_login_screen.dart';
import '../screen/home/home_screen.dart';
import '../screen/login/login_screen.dart';
@@ -12,6 +15,12 @@ const homeRoute = "/homeRoute";
const scanRoute = "/scanRoute";
const editScanRoute = "/editScanRoute";
const noLoginSplashRoute = "/noLoginSplashRoute";
const noLoginRoute = "/noLoginRoute";
const noLoginHomeRoute = "/noLoginHomeRoute";
const noLoginScanRoute = "/noLoginScanRoute";
const noLoginEditScanRoute = "/noLoginEditScanRoute";
class AppRoute {
static Route<dynamic> generateRoute(RouteSettings settings) {
// splash screen
@@ -25,6 +34,16 @@ class AppRoute {
});
}
if (settings.name == noLoginSplashRoute) {
return MaterialPageRoute(builder: (context) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaler: TextScaler.linear(1.0), padding: EdgeInsets.all(0)),
child: NoLoginSplashScreen(),
);
});
}
// login screen
if (settings.name == loginRoute) {
return MaterialPageRoute(builder: (context) {
@@ -36,6 +55,16 @@ class AppRoute {
});
}
if (settings.name == noLoginRoute) {
return MaterialPageRoute(builder: (context) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaler: TextScaler.linear(1.0), padding: EdgeInsets.all(0)),
child: NoLoginScreen(),
);
});
}
// home screen
if (settings.name == homeRoute) {
return MaterialPageRoute(builder: (context) {
@@ -47,6 +76,16 @@ class AppRoute {
});
}
if (settings.name == noLoginHomeRoute) {
return MaterialPageRoute(builder: (context) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaler: TextScaler.linear(1.0), padding: EdgeInsets.all(0)),
child: NoLoginHomeScreen(),
);
});
}
// scan screen
if (settings.name == scanRoute) {
return MaterialPageRoute(builder: (context) {
@@ -74,7 +113,7 @@ class AppRoute {
data: MediaQuery.of(context).copyWith(
padding: const EdgeInsets.all(0),
textScaler: TextScaler.linear(1.0)),
child: SplashScreen(),
child: NoLoginSplashScreen(),
);
});
}