|
5 | 5 | import Foundation
|
6 | 6 | import UIKit
|
7 | 7 |
|
8 |
| -public struct ResolvedMessage: Equatable { |
9 |
| - public let title: String? |
10 |
| - public let description: String? |
11 |
| - public var image: UIImage? |
12 |
| - public var imageAccessibilityLabel: String? |
13 |
| - public let buttonText: String? |
14 |
| - public let buttonTwoText: String? |
15 |
| - public let message: IterableEmbeddedMessage |
16 |
| - |
17 |
| - init(title: String?, |
18 |
| - description: String?, |
19 |
| - image: UIImage?, |
20 |
| - imageAccessibilityLabel: String?, |
21 |
| - buttonText: String?, |
22 |
| - buttonTwoText: String?, |
23 |
| - message: IterableEmbeddedMessage) { |
24 |
| - self.title = title |
25 |
| - self.description = description |
26 |
| - self.image = image |
27 |
| - self.imageAccessibilityLabel = imageAccessibilityLabel |
28 |
| - self.buttonText = buttonText |
29 |
| - self.buttonTwoText = buttonTwoText |
30 |
| - self.message = message |
31 |
| - } |
32 |
| - |
33 |
| - public static func ==(lhs: ResolvedMessage, rhs: ResolvedMessage) -> Bool { |
34 |
| - return lhs.title == rhs.title && |
35 |
| - lhs.description == rhs.description && |
36 |
| - lhs.image == rhs.image && |
37 |
| - lhs.buttonText == rhs.buttonText && |
38 |
| - lhs.buttonTwoText == rhs.buttonTwoText && |
39 |
| - lhs.message == rhs.message |
40 |
| - } |
| 8 | +protocol IterableInternalEmbeddedManagerProtocol: IterableEmbeddedManagerProtocol, EmbeddedNotifiable { |
| 9 | + // we can add the internal delegate methods here |
41 | 10 | }
|
42 | 11 |
|
43 |
| -class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol { |
| 12 | +class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol { |
44 | 13 | init(apiClient: ApiClientProtocol,
|
45 | 14 | urlDelegate: IterableURLDelegate?,
|
46 | 15 | customActionDelegate: IterableCustomActionDelegate?,
|
@@ -76,86 +45,13 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
|
76 | 45 | return messages[placementId] ?? []
|
77 | 46 | }
|
78 | 47 |
|
79 |
| - public func resolveMessages(_ messages: [IterableEmbeddedMessage], completion: @escaping ([ResolvedMessage]) -> Void) { |
80 |
| - var resolvedMessages: [Int: ResolvedMessage] = [:] |
81 |
| - |
82 |
| - let group = DispatchGroup() |
83 |
| - |
84 |
| - for (index, message) in messages.enumerated() { |
85 |
| - group.enter() |
86 |
| - |
87 |
| - let title = message.elements?.title |
88 |
| - let description = message.elements?.body |
89 |
| - let imageUrl = message.elements?.mediaUrl |
90 |
| - let imageAccessiblityLabel = message.elements?.mediaUrlCaption |
91 |
| - let buttonText = message.elements?.buttons?.first?.title |
92 |
| - let buttonTwoText = message.elements?.buttons?.count ?? 0 > 1 ? message.elements?.buttons?[1].title : nil |
93 |
| - |
94 |
| - DispatchQueue.global().async { |
95 |
| - if let imageUrl = imageUrl, let url = URL(string: imageUrl) { |
96 |
| - var request = URLRequest(url: url) |
97 |
| - request.setValue("Mozilla/5.0 (iPhone; CPU iPhone OS 16_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1", forHTTPHeaderField: "User-Agent") |
98 |
| - |
99 |
| - let config = URLSessionConfiguration.default |
100 |
| - config.httpAdditionalHeaders = request.allHTTPHeaderFields |
101 |
| - |
102 |
| - let session = URLSession(configuration: config) |
103 |
| - |
104 |
| - session.dataTask(with: request) { (data, _, _) in |
105 |
| - defer { group.leave() } |
106 |
| - |
107 |
| - guard let imageData = data else { |
108 |
| - print("Unable to load image data") |
109 |
| - return |
110 |
| - } |
111 |
| - |
112 |
| - let resolvedMessage = ResolvedMessage(title: title, |
113 |
| - description: description, |
114 |
| - image: UIImage(data: imageData), |
115 |
| - imageAccessibilityLabel: imageAccessiblityLabel, |
116 |
| - buttonText: buttonText, |
117 |
| - buttonTwoText: buttonTwoText, |
118 |
| - message: message) |
119 |
| - |
120 |
| - DispatchQueue.main.async { |
121 |
| - resolvedMessages[index] = resolvedMessage |
122 |
| - } |
123 |
| - |
124 |
| - }.resume() |
125 |
| - } else { |
126 |
| - let resolvedMessage = ResolvedMessage(title: title, |
127 |
| - description: description, |
128 |
| - image: nil, |
129 |
| - imageAccessibilityLabel: nil, |
130 |
| - buttonText: buttonText, |
131 |
| - buttonTwoText: buttonTwoText, |
132 |
| - message: message) |
133 |
| - DispatchQueue.main.async { |
134 |
| - resolvedMessages[index] = resolvedMessage |
135 |
| - group.leave() |
136 |
| - } |
137 |
| - } |
138 |
| - } |
139 |
| - |
140 |
| - } |
141 |
| - |
142 |
| - group.notify(queue: .main) { |
143 |
| - let sortedResolvedMessages = resolvedMessages.sorted { $0.key < $1.key }.map { $0.value } |
144 |
| - completion(sortedResolvedMessages) |
145 |
| - } |
146 |
| - } |
147 |
| - |
148 | 48 | public func addUpdateListener(_ listener: IterableEmbeddedUpdateDelegate) {
|
149 | 49 | listeners.add(listener)
|
150 | 50 | }
|
151 | 51 |
|
152 | 52 | public func removeUpdateListener(_ listener: IterableEmbeddedUpdateDelegate) {
|
153 | 53 | listeners.remove(listener)
|
154 | 54 | }
|
155 |
| - |
156 |
| - public func syncMessages(completion: @escaping () -> Void) { |
157 |
| - retrieveEmbeddedMessages(completion: completion) |
158 |
| - } |
159 | 55 |
|
160 | 56 | public func handleEmbeddedClick(message: IterableEmbeddedMessage, buttonIdentifier: String?, clickedUrl: String) {
|
161 | 57 | if let url = URL(string: clickedUrl) {
|
@@ -341,3 +237,9 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
|
341 | 237 | }
|
342 | 238 | }
|
343 | 239 | }
|
| 240 | + |
| 241 | +extension IterableEmbeddedManager: EmbeddedNotifiable { |
| 242 | + public func syncMessages(completion: @escaping () -> Void) { |
| 243 | + retrieveEmbeddedMessages(completion: completion) |
| 244 | + } |
| 245 | +} |
0 commit comments