@tyrads.com/tyrads-sdk 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -95,7 +95,7 @@ dependencies {
95
95
  //noinspection GradleDynamicVersion
96
96
  implementation "com.facebook.react:react-native:+"
97
97
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
98
- implementation ("com.github.tyrads-com:tyrads-sdk-android:rnp-1.1.0")
98
+ implementation ("com.github.tyrads-com:tyrads-sdk-android:rnp-1.1.5")
99
99
 
100
100
  }
101
101
 
@@ -0,0 +1,31 @@
1
+ //
2
+ // AcmoConfig.swift
3
+ // TyradsSdk
4
+ //
5
+ // Created by ibnShamas on 8/13/24.
6
+ //
7
+
8
+ import Foundation
9
+ import UIKit
10
+
11
+ struct AcmoConfig {
12
+ static let API_VERSION = "1.1"
13
+ static let BUILD_VERSION = "2"
14
+ static let SDK_VERSION = "\(API_VERSION).\(BUILD_VERSION)"
15
+ static let SDK_PLATFORM = "React Native"
16
+ static let BASE_URL = "https://api.tyrads.com/v\(API_VERSION)/"
17
+ static let TAG = "TyrAds SDK"
18
+
19
+ static let PRIMARY_COLOR = UIColor(red: 0/255, green: 36/255, blue: 51/255, alpha: 1)
20
+ static let PRIMARY_COLOR_LIGHT = UIColor(red: 153/255, green: 145/255, blue: 145/255, alpha: 1)
21
+ static let PRIMARY_COLOR_DARK = UIColor.black
22
+
23
+ static let SECONDARY_COLOR = UIColor(red: 44/255, green: 179/255, blue: 136/255, alpha: 1)
24
+ static let SECONDARY_COLOR_LIGHT = UIColor(red: 203/255, green: 235/255, blue: 207/255, alpha: 1)
25
+ static let SIDEBAR_BACKGROUND_COLOR_LIGHT = UIColor(white: 1, alpha: 0.54)
26
+ static let SIDEBAR_BACKGROUND_COLOR_DARK = UIColor(red: 17/255, green: 45/255, blue: 30/255, alpha: 1)
27
+ static let APPBAR_BG = UIColor(red: 0/255, green: 33/255, blue: 48/255, alpha: 1)
28
+
29
+ // Note: ThemeMode.light doesn't have a direct equivalent in iOS
30
+ // You would typically handle this in your app's theme configuration
31
+ }
@@ -0,0 +1,46 @@
1
+ //
2
+ // InitModel.swift
3
+ // TyradsSdk
4
+ //
5
+ // Created by ibnShamas on 8/13/24.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ struct AcmoInitModel: Codable {
11
+ let data: Data
12
+ }
13
+
14
+ struct Data: Codable {
15
+ let newRegisteredUser: Bool
16
+ let user: User
17
+ let publisherApp: PublisherApp
18
+
19
+ enum CodingKeys: String, CodingKey {
20
+ case newRegisteredUser = "newRegisteredUser"
21
+ case user
22
+ case publisherApp
23
+ }
24
+
25
+ init(from decoder: Decoder) throws {
26
+ let container = try decoder.container(keyedBy: CodingKeys.self)
27
+ newRegisteredUser = try container.decodeIfPresent(Bool.self, forKey: .newRegisteredUser) ?? false
28
+ user = try container.decode(User.self, forKey: .user)
29
+ publisherApp = try container.decode(PublisherApp.self, forKey: .publisherApp)
30
+ }
31
+ }
32
+
33
+ struct User: Codable {
34
+ let publisherUserId: String
35
+ }
36
+
37
+ struct PublisherApp: Codable {
38
+ let headerColor: String
39
+ let mainColor: String
40
+
41
+ init(from decoder: Decoder) throws {
42
+ let container = try decoder.container(keyedBy: CodingKeys.self)
43
+ headerColor = try container.decodeIfPresent(String.self, forKey: .headerColor) ?? ""
44
+ mainColor = try container.decodeIfPresent(String.self, forKey: .mainColor) ?? ""
45
+ }
46
+ }
@@ -0,0 +1,151 @@
1
+ import Foundation
2
+ import UIKit
3
+ import AppTrackingTransparency
4
+ import AdSupport
5
+
6
+
7
+
8
+ /// The TyradsSdk class provides methods for configuring the SDK and displaying offers.
9
+ public class Tyrads {
10
+ /// Shared instance of the TyradsSdk.
11
+ public static let instance = Tyrads()
12
+
13
+ private var apiKey: String = ""
14
+ private var apiSecret: String = ""
15
+ private var publisherUserID: String = ""
16
+ private var newUser: Bool = false
17
+ private var loginData: AcmoInitModel?
18
+ var initializationWait = DispatchSemaphore(value: 0)
19
+ private var debugMode: Bool = false
20
+
21
+ private func log(_ message: String) {
22
+ if debugMode {
23
+ NSLog(message)
24
+ }
25
+ }
26
+
27
+ /// Configures the Tyrads SDK with the provided API key and secret key.
28
+ ///
29
+ /// - Parameters:
30
+ /// - apiKey: The API key provided by Tyrads.
31
+ /// - secretKey: The secret key provided by Tyrads.
32
+ @objc public func configure( apiKey: String, secretKey: String, debugMode: Bool = false) {
33
+ self.apiKey = apiKey
34
+ self.apiSecret = secretKey
35
+ self.debugMode = debugMode
36
+ }
37
+
38
+ /// Logs in the user with the provided user ID or retrieves the user ID from UserDefaults.
39
+ ///
40
+ /// - Parameter userID: Optional. The user ID to log in with. If nil, the SDK will attempt to retrieve the user ID from UserDefaults.
41
+ @objc public func loginUser(_ userID: String? = nil) {
42
+ do {
43
+ let userId = userID ?? UserDefaults.standard.string(forKey: "acmo-tyrads-sdk-user-id") ?? ""
44
+
45
+ let identifierType = "IDFA"
46
+ var advertisingId = ""
47
+ if #available(iOS 14, *) {
48
+ log("Requesting tracking authorization for iOS 14+")
49
+ ATTrackingManager.requestTrackingAuthorization { status in
50
+ switch status {
51
+ case .authorized:
52
+ advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
53
+ self.log("Tracking authorized. Advertising ID: \(advertisingId)")
54
+ case .denied:
55
+ advertisingId = ""
56
+ self.log("Tracking denied")
57
+ case .restricted:
58
+ advertisingId = ""
59
+ self.log("Tracking restricted")
60
+ case .notDetermined:
61
+ advertisingId = ""
62
+ self.log("Tracking not determined")
63
+ @unknown default:
64
+ self.log("Unknown tracking status")
65
+ }
66
+ }
67
+ } else {
68
+ advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
69
+ log("iOS version < 14. Advertising ID: \(advertisingId)")
70
+ }
71
+ let fd: [String: Any] = [
72
+ "publisherUserId": userId,
73
+ "platform": "iOS",
74
+ "identifierType": identifierType,
75
+ "identifier": advertisingId
76
+ ]
77
+
78
+ log("Initializing with data: \(fd)")
79
+
80
+ guard let url = URL(string: AcmoConfig.BASE_URL + "initialize") else {
81
+ log("Failed to create URL")
82
+ return
83
+ }
84
+
85
+ var request = URLRequest(url: url)
86
+ request.httpMethod = "POST"
87
+ request.setValue(AcmoConfig.SDK_PLATFORM, forHTTPHeaderField: "X-SDK-Platform")
88
+ request.setValue(AcmoConfig.SDK_VERSION, forHTTPHeaderField: "X-SDK-Version")
89
+ request.setValue("application/json", forHTTPHeaderField: "Content-Type")
90
+ request.setValue(self.apiKey, forHTTPHeaderField: "X-API-Key")
91
+ request.setValue(self.apiSecret, forHTTPHeaderField: "X-API-Secret")
92
+
93
+ do {
94
+ request.httpBody = try JSONSerialization.data(withJSONObject: fd)
95
+ } catch {
96
+ log("Failed to serialize request body: \(error)")
97
+ return
98
+ }
99
+
100
+ let task = URLSession.shared.dataTask(with: request) { data, response, error in
101
+
102
+ if let error = error {
103
+ self.log("Network request failed: \(error)")
104
+ return
105
+ }
106
+
107
+ guard let data = data else {
108
+ self.log("No data received from the server")
109
+ return
110
+ }
111
+
112
+ if let responseString = String(data: data, encoding: .utf8) {
113
+ self.log("Received response: \(responseString)")
114
+
115
+ let jsonData = responseString.data(using: .utf8)!
116
+ let decoder = JSONDecoder()
117
+ guard let acmoInitModel = try? decoder.decode(AcmoInitModel.self, from: jsonData) else {
118
+ self.log("Failed to decode response")
119
+ return
120
+ }
121
+ self.loginData = acmoInitModel
122
+ self.publisherUserID = self.loginData?.data.user.publisherUserId ?? ""
123
+ self.newUser = self.loginData?.data.newRegisteredUser ?? false
124
+ self.log("Login successful. Publisher User ID: \(self.publisherUserID), New User: \(self.newUser)")
125
+ self.initializationWait.signal()
126
+ }
127
+
128
+
129
+ }
130
+
131
+ task.resume()
132
+ log("Network request started")
133
+
134
+
135
+ } catch {
136
+ log("An error occurred: \(error)")
137
+ }
138
+ }
139
+
140
+
141
+
142
+ /// Shows the Tyrads offer wall.
143
+ @objc public func showOffers() {
144
+ self.initializationWait.wait()
145
+ let urlString: String = "https://websdk.tyrads.com/?apiKey=\(Tyrads.instance.apiKey)&apiSecret=\(Tyrads.instance.apiSecret)&userID=\(Tyrads.instance.publisherUserID)&newUser=\(Tyrads.instance.newUser)&platform=\(AcmoConfig.SDK_PLATFORM)&hc=\(Tyrads.instance.loginData?.data.publisherApp.headerColor ?? "")&mc=\(Tyrads.instance.loginData?.data.publisherApp.mainColor ?? "")";
146
+
147
+ if let url = URL(string: urlString) {
148
+ UIApplication.shared.open(url, options: [:], completionHandler: { _ in })
149
+ }
150
+ }
151
+ }
@@ -8,19 +8,19 @@ class TyradsSdk: NSObject {
8
8
  @objc
9
9
  func `init`(_ apiKey: String, secretKey: String) {
10
10
  NSLog("TyradsModule: init called with apiKey: \(apiKey) and secretKey: \(secretKey)")
11
+ Tyrads.instance.configure(apiKey: apiKey, secretKey: secretKey)
11
12
  }
12
13
 
13
14
  @objc
14
15
  func loginUser(_ userId: String) {
15
16
  NSLog("TyradsModule: loginUser called with userId: \(userId)")
17
+ Tyrads.instance.loginUser(userId)
16
18
  // Implement your login logic here
17
19
  }
18
20
 
19
21
  @objc
20
22
  func showOffers() {
21
23
  NSLog("TyradsModule: showOffers called")
22
- if let url = URL(string: "https://example.com") {
23
- UIApplication.shared.open(url, options: [:], completionHandler: { _ in })
24
- }
24
+ Tyrads.instance.showOffers()
25
25
  }
26
26
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyrads.com/tyrads-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Tyrads SDK for React Native ",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",