import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:http/http.dart'; import 'package:local_auth/local_auth.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import '../settings/app_settings.dart'; class SettingProvider extends ChangeNotifier { // Check if settings are loaded or not bool isLoaded = false; // Contain saved user data User? user; // AssetGroup AssetGroup? _assetGroup; String? _host; String? _language; String? _theme; String? _speechToText; // Other settings bool rememberMe = false; String username = ""; String password = ""; bool isLocalAuthEnable = false; bool get isUserFlowMedical => _assetGroup?.id == 1; bool get isUserFMS => _assetGroup?.id == 2; bool get engineerCanCreateCM => isUserFMS; bool get showPriority => !(isUserFMS && user?.type == UsersTypes.normal_user); // Local authentication instance final LocalAuthentication auth = LocalAuthentication(); SettingProvider() { loadSharedPreferences(); } Future resetSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); user = null; _assetGroup = null; prefs.remove(ASettings.user); prefs.remove(ASettings.localAuth); prefs.remove(ASettings.assetGroup); notifyListeners(); } Future setUser(User user) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.user, json.encode(user.toJson())); this.user = user; notifyListeners(); selectAssetGroup(user); } Future setRememberMe(String username, String password, bool rememberMe) async { this.rememberMe = rememberMe; SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setBool(ASettings.rememberMe, rememberMe); await prefs.setString(ASettings.userName, username); await prefs.setString(ASettings.password, password); this.username = username; this.password = password; } void selectAssetGroup(User user) { if (user.assetGroups == null) return; if (user.selectedAssetGroup != null) { _assetGroup = user.selectedAssetGroup; } else if (user.assetGroups!.length == 1) { _assetGroup = user.assetGroups!.first; } else { int fmIndex = user.assetGroups!.indexWhere((element) => element.id == 1); if (fmIndex < 0) { _assetGroup = user.assetGroups!.first; } else { _assetGroup = user.assetGroups![fmIndex]; } } setAssetGroup(_assetGroup); } void setAssetGroup(AssetGroup? assetGroup) { _assetGroup = assetGroup; ApiManager.instance.assetGroup = _assetGroup!; notifyListeners(); } String? get host => _host; Future setHost(String host) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.host, host); _host = host; notifyListeners(); } String? get language => _language; AssetGroup? get assetGroup => _assetGroup; String? get theme => _theme; bool get localAuth => isLocalAuthEnable; Future setLanguage(String currentLanguage) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.language, currentLanguage); _language = currentLanguage; notifyListeners(); } Future setAuth(bool status) async { SharedPreferences prefs = await SharedPreferences.getInstance(); isLocalAuthEnable = status; prefs.setBool(ASettings.localAuth, isLocalAuthEnable); notifyListeners(); } String? get speechToText => _speechToText; Future setSpeechToText(String currentLanguage) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.speechToText, currentLanguage); _speechToText = currentLanguage; notifyListeners(); } Future setDarkTheme(bool value) async { SharedPreferences prefs = await SharedPreferences.getInstance(); _theme = value ? "dark" : "light"; prefs.setString(ASettings.theme, _theme!); notifyListeners(); } // Get app setting Future loadSharedPreferences() async { SharedPreferences prefs = await SharedPreferences.getInstance(); _language = prefs.getString(ASettings.language) ?? 'en'; _theme = prefs.getString(ASettings.theme) ?? 'light'; isLocalAuthEnable = prefs.getBool(ASettings.localAuth) ?? false; _speechToText = prefs.getString(ASettings.speechToText) ?? 'ar'; if (prefs.containsKey(ASettings.user)) { String userJson = prefs.getString(ASettings.user)!; user = await User.fromJson(json.decode(userJson)); selectAssetGroup(user!); } rememberMe = prefs.getBool(ASettings.rememberMe) ?? false; username = prefs.getString(ASettings.userName) ?? ""; password = prefs.getString(ASettings.password) ?? ""; _host = prefs.getString(ASettings.host) ?? URLs.host1; SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( statusBarColor: Colors.transparent, systemNavigationBarColor: _theme == "light" ? Colors.white : AppColor.neutral60, systemNavigationBarIconBrightness: _theme == "light" ? Brightness.dark : Brightness.light, )); isLoaded = true; notifyListeners(); } Future checkUserTokenValidation(String token) async { try { final response = await ApiManager.instance.post( "${URLs.checkLoginValidation}?token=$token", body: {}, ); return response.statusCode >= 200 && response.statusCode < 300; } catch (error) { return false; } } Future checkIsEnabledFaceId({required bool status}) async { try { final response = await ApiManager.instance.post( URLs.enableFaceId, showToast: false, body: { 'isEnabled': status, }, ); return response.statusCode >= 200 && response.statusCode < 300; } catch (error) { return false; } } Future checkAppUpdate(String buildNumber, String osType) async { Response response; bool isValid = false; try { Map body = {"buildNumber": buildNumber, "osType": osType}; response = await ApiManager.instance.post(URLs.checkAppVersion, body: body); if (response.statusCode >= 200 && response.statusCode < 300) { isValid = (jsonDecode(response.body)["data"]); } return isValid; } catch (error) { return isValid; } } }