diff --git a/lib/app/app_extension.dart b/lib/app/app_extension.dart index 78c4298..07477b1 100644 --- a/lib/app/app_extension.dart +++ b/lib/app/app_extension.dart @@ -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 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 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; } diff --git a/lib/screen/no-login-home/no_login_home_screen.dart b/lib/screen/no-login-home/no_login_home_screen.dart index 5277a3c..fa5aaef 100644 --- a/lib/screen/no-login-home/no_login_home_screen.dart +++ b/lib/screen/no-login-home/no_login_home_screen.dart @@ -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, diff --git a/lib/screen/no-login/no_login_provider.dart b/lib/screen/no-login/no_login_provider.dart index 6bb9cb3..598c31c 100644 --- a/lib/screen/no-login/no_login_provider.dart +++ b/lib/screen/no-login/no_login_provider.dart @@ -121,7 +121,6 @@ class NoLoginNotifier extends StateNotifier { 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 { // 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()); - } - } } } diff --git a/lib/screen/no-login/no_login_refresh_token_provider.dart b/lib/screen/no-login/no_login_refresh_token_provider.dart index 4d402e4..e9f970e 100644 --- a/lib/screen/no-login/no_login_refresh_token_provider.dart +++ b/lib/screen/no-login/no_login_refresh_token_provider.dart @@ -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) {