From 5671a5941c4c0a9d584b6204ed6ef3469405f4e9 Mon Sep 17 00:00:00 2001
From: Mustafa Merza <mustafa.merza95@gmail.com>
Date: Wed, 17 Jul 2024 14:55:47 +0300
Subject: [PATCH] - Added user defaults manager to be handle user defaults
 values.

---
 MiniScanner.xcodeproj/project.pbxproj         | 16 ++++
 .../UserDefaults/UserDefaultsKeys.swift       | 14 ++++
 .../UserDefaults/UserDefaultsManager.swift    | 77 +++++++++++++++++++
 3 files changed, 107 insertions(+)
 create mode 100644 MiniScanner/Managers/UserDefaults/UserDefaultsKeys.swift
 create mode 100644 MiniScanner/Managers/UserDefaults/UserDefaultsManager.swift

diff --git a/MiniScanner.xcodeproj/project.pbxproj b/MiniScanner.xcodeproj/project.pbxproj
index 1acca28..72c2b10 100644
--- a/MiniScanner.xcodeproj/project.pbxproj
+++ b/MiniScanner.xcodeproj/project.pbxproj
@@ -176,6 +176,8 @@
 		672C46642C47C74800497EF0 /* Provide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46632C47C74800497EF0 /* Provide.swift */; };
 		672C46662C47C74C00497EF0 /* Inject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46652C47C74C00497EF0 /* Inject.swift */; };
 		672C46682C47C75100497EF0 /* Clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46672C47C75100497EF0 /* Clear.swift */; };
+		672C468F2C47CB2000497EF0 /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C468E2C47CB2000497EF0 /* UserDefaultsManager.swift */; };
+		672C46912C47CB5D00497EF0 /* UserDefaultsKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46902C47CB5D00497EF0 /* UserDefaultsKeys.swift */; };
 		B827E5196CC419E773B843E1 /* Pods_MiniScanner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */; };
 		EC0CF1FE254D8BBF00888722 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FD254D8BBF00888722 /* AppDelegate.swift */; };
 		EC0CF200254D8BBF00888722 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FF254D8BBF00888722 /* SceneDelegate.swift */; };
@@ -402,6 +404,8 @@
 		672C46632C47C74800497EF0 /* Provide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Provide.swift; sourceTree = "<group>"; };
 		672C46652C47C74C00497EF0 /* Inject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Inject.swift; sourceTree = "<group>"; };
 		672C46672C47C75100497EF0 /* Clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clear.swift; sourceTree = "<group>"; };
+		672C468E2C47CB2000497EF0 /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = "<group>"; };
+		672C46902C47CB5D00497EF0 /* UserDefaultsKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsKeys.swift; sourceTree = "<group>"; };
 		E8AF4FB39674DF589D719DCF /* Pods-MiniScanner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiniScanner.release.xcconfig"; path = "Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig"; sourceTree = "<group>"; };
 		E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiniScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		EC0CF1FA254D8BBF00888722 /* MiniScanner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MiniScanner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -941,6 +945,15 @@
 			path = DependencyInjection;
 			sourceTree = "<group>";
 		};
+		672C468D2C47CB0D00497EF0 /* UserDefaults */ = {
+			isa = PBXGroup;
+			children = (
+				672C468E2C47CB2000497EF0 /* UserDefaultsManager.swift */,
+				672C46902C47CB5D00497EF0 /* UserDefaultsKeys.swift */,
+			);
+			path = UserDefaults;
+			sourceTree = "<group>";
+		};
 		98E49D3F46C8E62718825860 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
@@ -997,6 +1010,7 @@
 		EC702548254E1F9F00BE1958 /* Managers */ = {
 			isa = PBXGroup;
 			children = (
+				672C468D2C47CB0D00497EF0 /* UserDefaults */,
 				EC8A9B0F254DC6DD00F9AF99 /* PDFManager.swift */,
 				EC8A9B13254DC9D300F9AF99 /* LocalFileManager.swift */,
 				ECD43ED525A7BA9500B5A3F2 /* ThemeManager.swift */,
@@ -1303,6 +1317,7 @@
 				539996832C27130000671340 /* ConstraintMakerPriortizable.swift in Sources */,
 				5399969E2C27130000671340 /* Debugging.swift in Sources */,
 				672C46682C47C75100497EF0 /* Clear.swift in Sources */,
+				672C46912C47CB5D00497EF0 /* UserDefaultsKeys.swift in Sources */,
 				5399968E2C27130000671340 /* ConstraintMakerRelatable+Extensions.swift in Sources */,
 				539996512C26E86700671340 /* DefaultValues.m in Sources */,
 				53014FA42C11A8E80071CE39 /* EditScanViewController.swift in Sources */,
@@ -1341,6 +1356,7 @@
 				ECE9BBAA254E295900D45E43 /* Date+Extensions.swift in Sources */,
 				53014FA92C11A8E80071CE39 /* QuadrilateralView.swift in Sources */,
 				539996802C27130000671340 /* ConstraintMultiplierTarget.swift in Sources */,
+				672C468F2C47CB2000497EF0 /* UserDefaultsManager.swift in Sources */,
 				672C46642C47C74800497EF0 /* Provide.swift in Sources */,
 				53CD5F562C1503150010424B /* BMViewController.swift in Sources */,
 				539996822C27130000671340 /* ConstraintDescription.swift in Sources */,
diff --git a/MiniScanner/Managers/UserDefaults/UserDefaultsKeys.swift b/MiniScanner/Managers/UserDefaults/UserDefaultsKeys.swift
new file mode 100644
index 0000000..55662fb
--- /dev/null
+++ b/MiniScanner/Managers/UserDefaults/UserDefaultsKeys.swift
@@ -0,0 +1,14 @@
+//
+//  UserDefaultsKeys.swift
+//  MiniScanner
+//
+//  Created by Mustafa Merza on 7/17/24.
+//  Copyright © 2024 AppsNectar. All rights reserved.
+//
+
+import Foundation
+
+enum UserDefaultsKeys: String {
+    
+    case appLanguage = "app_language"
+}
diff --git a/MiniScanner/Managers/UserDefaults/UserDefaultsManager.swift b/MiniScanner/Managers/UserDefaults/UserDefaultsManager.swift
new file mode 100644
index 0000000..9976792
--- /dev/null
+++ b/MiniScanner/Managers/UserDefaults/UserDefaultsManager.swift
@@ -0,0 +1,77 @@
+//
+//  UserDefaultsManager.swift
+//  MiniScanner
+//
+//  Created by Mustafa Merza on 7/17/24.
+//  Copyright © 2024 AppsNectar. All rights reserved.
+//
+
+import Foundation
+
+protocol UserDefaultsManagerProtocol {
+    
+    func string(key: UserDefaultsKeys) -> String?
+    func bool(key: UserDefaultsKeys) -> Bool
+    func get<T: Codable>(key: UserDefaultsKeys) -> T?
+    
+    func set(value: String, key: UserDefaultsKeys)
+    func set(value: Bool, key: UserDefaultsKeys)
+    func set<T: Codable>(value: T?, key: UserDefaultsKeys)
+    
+    func clear(key: UserDefaultsKeys)
+}
+
+class UserDefaultsManager: UserDefaultsManagerProtocol {
+    
+    private let userDefaults: UserDefaults = .standard
+    
+    func string(key: UserDefaultsKeys) -> String? {
+        userDefaults.string(forKey: key.rawValue)
+    }
+    
+    func bool(key: UserDefaultsKeys) -> Bool {
+        userDefaults.bool(forKey: key.rawValue)
+    }
+    
+    func set(value: String, key: UserDefaultsKeys) {
+        set(value: value as Any?, key: key)
+    }
+    
+    func set(value: Bool, key: UserDefaultsKeys) {
+        set(value: value as Any?, key: key)
+    }
+    
+    func get<T: Codable>(key: UserDefaultsKeys) -> T? {
+        var value: T? = nil
+        
+        if let data = get(key: key) as? Data {
+            value = try? JSONDecoder().decode(T.self, from: data)
+        }
+        
+        return value
+    }
+    
+    func set<T: Codable>(value: T?, key: UserDefaultsKeys) {
+        if let value {
+            
+            let data = try? JSONEncoder().encode(value)
+            set(value: data as Any?, key: key)
+        }
+        else {
+            set(value: value as Any?, key: key)
+        }
+    }
+    
+    func clear(key: UserDefaultsKeys) {
+        userDefaults.removeObject(forKey: key.rawValue)
+    }
+    
+    private func get(key: UserDefaultsKeys) -> Any? {
+        userDefaults.object(forKey: key.rawValue)
+    }
+    
+    private func set(value: Any?, key: UserDefaultsKeys) {
+        userDefaults.set(value, forKey: key.rawValue)
+        userDefaults.synchronize()
+    }
+}
-- 
GitLab