๐Ÿ“ฆ manideepk90 / react-native-hyperswitch-sdk

๐Ÿ“„ OTAServices.swift ยท 114 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114//
//  OTAServices.swift
//  hyperswitch
//
//  Created by Kuntimaddi Manideep on 24/01/25.
//

import Foundation
import HyperOTA

private func getHyperOTAPlist(_ key: String) -> String? {
    guard let path = Bundle(for: RNViewManager.self).path(forResource: "HyperOTA", ofType: "plist"),
          let dict = NSDictionary(contentsOfFile: path),
          let value = dict[key] as? String, !value.isEmpty else {
        return nil
    }
    return value
}

internal class EventLogger: NSObject, HPJPLoggerDelegate {
    private func isJSONSerializable(_ value: Any) -> Bool {
        return JSONSerialization.isValidJSONObject(["key": value])
    }
    internal func addLog(eventData: [String: Any], logLevel : String, key: String?){
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: eventData, options: [])
            guard let jsonString = String(data: jsonData, encoding: .utf8) else {
                print("Error: JSON data encoding failed.")
                return
            }
            var log = LogBuilder()
                .setLogType(logLevel)
                .setValue(jsonString)
            
            switch key {
            case "init_with_local_config_versions":
                log = log.setEventName(.HYPER_OTA_INIT)
                break
            case "init":
                log = log.setEventName(.HYPER_OTA_INIT)
                break
            case "update_end":
                log = log.setEventName(.HYPER_OTA_FINISH)
            case "end":
                log = log.setEventName(.HYPER_OTA_FINISH)
                break
            default:
                log = log.setEventName(.HYPER_OTA_EVENT)
            }
            LogManager.addLog(log.build())
            
        } catch {
            print("Error serializing event data: \(error.localizedDescription)")
        }
    }
    func trackEvent(
        withLevel logLevel: String,
        label eventLabel: String,
        key eventKey: String? = nil,
        value eventValue: Any,
        category eventCategory: String,
        subcategory eventSubcategory: String
    ) {
        let eventData: [String: Any] = [
            "label": eventLabel,
            "value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
            "key" : eventKey ?? "",
            "category": eventCategory,
            "subcategory": eventSubcategory
        ]
        addLog(eventData: eventData, logLevel: logLevel, key : eventKey)
    }
    func trackEvent(
        withLevel logLevel: String,
        label eventLabel: String,
        value eventValue: Any,
        category eventCategory: String,
        subcategory eventSubcategory: String
    ) {
        let eventData: [String: Any] = [
            "label": eventLabel,
            "value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
            "category": eventCategory,
            "subcategory": eventSubcategory
        ]
        addLog(eventData: eventData, logLevel: logLevel, key : eventLabel)
        
    }
}

public final class OTAServices {
    public static var shared = OTAServices()
    public var otaServices : HyperOTAServices? = nil
    let logger = EventLogger()
    public func initialize(publishableKey : String) {
        if(self.otaServices == nil) {
            let environment = SDKEnvironment.getEnvironment(publishableKey)
            let configKey = (environment == .SANDBOX) ? "sandBoxReleaseConfigURL" : "releaseConfigURL" 
            let payload = [
                "clientId": getHyperOTAPlist("clientId") ?? "" ,
                "namespace": getHyperOTAPlist("namespace") ?? "",
                "forceUpdate": true,
                "localAssets": (getHyperOTAPlist(configKey) ?? "releaseConfigURL") == "releaseConfigURL",
                "fileName": getHyperOTAPlist("fileName") ?? "" ,
                "releaseConfigURL": (getHyperOTAPlist(configKey) ?? "") +  "/mobile-ota/ios/" + SDKVersion.current + "/config.json",
            ] as [String: Any]
            self.otaServices = HyperOTAServices(payload: payload, loggerDelegate: logger, baseBundle: Bundle(for: OTAServices.self))
        }
    }
    public  func getBundleURL() -> URL? {
        return otaServices?.bundleURL() ?? Bundle(for: OTAServices.self).url(forResource: "hyperswitch", withExtension: "bundle")
    }
}