import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert'; class AccountCacheService { static const String _accountsKey = 'cached_accounts'; static const String _lastUpdatedKey = 'accounts_last_updated'; /// Simpan akun ke cache lokal static Future saveAccountsLocally( List> accounts) async { final prefs = await SharedPreferences.getInstance(); // Konversi akun ke JSON string final accountsJson = accounts.map((account) => json.encode(account)).toList(); await prefs.setStringList(_accountsKey, accountsJson); await prefs.setInt(_lastUpdatedKey, DateTime.now().millisecondsSinceEpoch); } /// Ambil akun dari cache lokal static Future>> getCachedAccounts() async { final prefs = await SharedPreferences.getInstance(); final accountsJsonList = prefs.getStringList(_accountsKey) ?? []; if (accountsJsonList.isEmpty) { return []; } return accountsJsonList .map((jsonString) => json.decode(jsonString) as Map) .toList(); } /// Periksa apakah cache akun masih valid (kurang dari 1 jam) static Future isCacheValid() async { final prefs = await SharedPreferences.getInstance(); final lastUpdated = prefs.getInt(_lastUpdatedKey) ?? 0; final now = DateTime.now().millisecondsSinceEpoch; // Cache valid selama 1 jam (360000 ms) return (now - lastUpdated) < 360000; } /// Hapus cache akun static Future clearCache() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove(_accountsKey); await prefs.remove(_lastUpdatedKey); } /// Update cache akun dari server static Future updateAccountsFromServer( List> accounts) async { await saveAccountsLocally(accounts); } /// Dapatkan akun dengan prioritas: cache valid > data server > fallback kosong static Future>> getAccountsWithFallback( Future>> Function() serverFetchFunction, ) async { // Coba ambil dari cache dulu if (await isCacheValid()) { final cachedAccounts = await getCachedAccounts(); if (cachedAccounts.isNotEmpty) { return cachedAccounts; } } // Jika cache tidak valid atau kosong, coba ambil dari server try { final serverAccounts = await serverFetchFunction(); if (serverAccounts.isNotEmpty) { // Simpan ke cache jika berhasil ambil dari server await updateAccountsFromServer(serverAccounts); return serverAccounts; } } catch (e) { print('Gagal mengambil akun dari server: $e'); } // Jika semua gagal, kembalikan cache terakhir (meskipun mungkin expired) return await getCachedAccounts(); } }