import 'dart:convert'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:marco/controller/project_controller.dart'; import 'package:marco/helpers/services/auth_service.dart'; import 'package:marco/helpers/services/localizations/language.dart'; import 'package:marco/helpers/theme/theme_customizer.dart'; import 'package:marco/model/employee_info.dart'; import 'package:marco/model/user_permission.dart'; class LocalStorage { static const String _loggedInUserKey = "user"; static const String _themeCustomizerKey = "theme_customizer"; static const String _languageKey = "lang_code"; static const String _jwtTokenKey = "jwt_token"; static const String _refreshTokenKey = "refresh_token"; static const String _userPermissionsKey = "user_permissions"; static const String _employeeInfoKey = "employee_info"; static const String _mpinTokenKey = "mpinToken"; static const String _isMpinKey = "isMpin"; static const String _fcmTokenKey = 'fcm_token'; static SharedPreferences? _preferencesInstance; static SharedPreferences get preferences { if (_preferencesInstance == null) { throw ("Call LocalStorage.init() before using it"); } return _preferencesInstance!; } /// Initialization static Future init() async { _preferencesInstance = await SharedPreferences.getInstance(); await initData(); } static Future initData() async { AuthService.isLoggedIn = preferences.getBool(_loggedInUserKey) ?? false; ThemeCustomizer.fromJSON( preferences.getString(_themeCustomizerKey)); } /// ================== User Permissions ================== static Future setUserPermissions( List permissions) async { final jsonList = permissions.map((e) => e.toJson()).toList(); return preferences.setString( _userPermissionsKey, jsonEncode(jsonList)); } static List getUserPermissions() { final storedJson = preferences.getString(_userPermissionsKey); if (storedJson == null) return []; return (jsonDecode(storedJson) as List) .map((e) => UserPermission.fromJson( e as Map)) .toList(); } static Future removeUserPermissions() => preferences.remove(_userPermissionsKey); /// ================== Employee Info ================== static Future setEmployeeInfo(EmployeeInfo employeeInfo) => preferences.setString( _employeeInfoKey, jsonEncode(employeeInfo.toJson())); static EmployeeInfo? getEmployeeInfo() { final storedJson = preferences.getString(_employeeInfoKey); return storedJson == null ? null : EmployeeInfo.fromJson(jsonDecode(storedJson)); } static Future removeEmployeeInfo() => preferences.remove(_employeeInfoKey); /// ================== Login / Logout ================== static Future setLoggedInUser(bool loggedIn) => preferences.setBool(_loggedInUserKey, loggedIn); static Future removeLoggedInUser() => preferences.remove(_loggedInUserKey); static Future logout() async { await removeLoggedInUser(); await removeToken(_jwtTokenKey); await removeToken(_refreshTokenKey); await removeUserPermissions(); await removeEmployeeInfo(); await removeMpinToken(); await removeIsMpin(); await preferences.remove("mpin_verified"); await preferences.remove(_languageKey); await preferences.remove(_themeCustomizerKey); await preferences.remove('selectedProjectId'); if (Get.isRegistered()) { Get.find().clearProjects(); } Get.offAllNamed('/auth/login-option'); } /// ================== Theme & Language ================== static Future setCustomizer( ThemeCustomizer themeCustomizer) => preferences.setString( _themeCustomizerKey, themeCustomizer.toJSON()); static Future setLanguage(Language language) => preferences.setString( _languageKey, language.locale.languageCode); static String? getLanguage() => preferences.getString(_languageKey); /// ================== Tokens ================== static Future setToken(String key, String token) => preferences.setString(key, token); static String? getToken(String key) => preferences.getString(key); static Future removeToken(String key) => preferences.remove(key); static Future setJwtToken(String jwtToken) => setToken(_jwtTokenKey, jwtToken); static Future setRefreshToken(String refreshToken) => setToken(_refreshTokenKey, refreshToken); static String? getJwtToken() => getToken(_jwtTokenKey); static String? getRefreshToken() => getToken(_refreshTokenKey); /// ================== FCM Token ================== static Future setFcmToken(String token) => preferences.setString(_fcmTokenKey, token); static String? getFcmToken() => preferences.getString(_fcmTokenKey); /// ================== MPIN ================== static Future setMpinToken(String token) => preferences.setString(_mpinTokenKey, token); static String? getMpinToken() => preferences.getString(_mpinTokenKey); static Future removeMpinToken() => preferences.remove(_mpinTokenKey); static Future setIsMpin(bool value) => preferences.setBool(_isMpinKey, value); static bool getIsMpin() => preferences.getBool(_isMpinKey) ?? false; static Future removeIsMpin() => preferences.remove(_isMpinKey); /// ================== Generic Set/Get ================== static Future setBool(String key, bool value) => preferences.setBool(key, value); static bool? getBool(String key) => preferences.getBool(key); static String? getString(String key) => preferences.getString(key); static Future saveString(String key, String value) => preferences.setString(key, value); }