diff --git a/OnlineChatSdk/Classes/ChatApi.swift b/OnlineChatSdk/Classes/ChatApi.swift index 5af9cd2..03ac8cc 100644 --- a/OnlineChatSdk/Classes/ChatApi.swift +++ b/OnlineChatSdk/Classes/ChatApi.swift @@ -10,10 +10,11 @@ import Foundation open class ChatApi { - private func post(_ url: String, _ params: Dictionary, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) { + private func post(_ url: String, _ token: String, _ params: Dictionary, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) { guard let url = URL(string: url) else { return } var request = URLRequest(url: url) request.httpMethod = "POST" + request.addValue(token, forHTTPHeaderField: "X-Token") request.addValue("application/json", forHTTPHeaderField: "Content-Type") guard let httpBody = try? JSONSerialization.data(withJSONObject: params, options: []) else { return } request.httpBody = httpBody @@ -23,8 +24,8 @@ open class ChatApi { } public func send(_ token: String, _ method: String, _ params: Dictionary, callback: @escaping (NSDictionary?) -> Void) { - let url = "https://admin.verbox.ru/api/chat/\(token)/\(method)" - post(url, params) { (data, response, error) in + let url = "https://admin.verbox.ru/json/v1.0/\(method)" + post(url, token, params) { (data, response, error) in guard let data = data else { return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary @@ -34,10 +35,9 @@ open class ChatApi { } public func messages(_ token: String, params: Dictionary, callback: @escaping (NSDictionary?) -> Void) { - send(token, "message", params, callback: callback) + send(token, "chat/message/getList", params, callback: callback) } - public static func getNewMessages(_ token: String, _ clientId: String, callback: @escaping (NSDictionary?) -> Void) { let dtFormatter = DateFormatter() dtFormatter.calendar = Calendar(identifier: Calendar.Identifier.iso8601) diff --git a/OnlineChatSdk/Classes/ChatApiMessagesWrapper.swift b/OnlineChatSdk/Classes/ChatApiMessagesWrapper.swift index f290033..cfc92e4 100644 --- a/OnlineChatSdk/Classes/ChatApiMessagesWrapper.swift +++ b/OnlineChatSdk/Classes/ChatApiMessagesWrapper.swift @@ -2,7 +2,50 @@ import Foundation class ChatApiMessagesWrapper { - init(_ response: Dictionary) { - print("ChatApiMessagesWrapper : \(response.debugDescription)") + private var result: Dictionary? + private var dataArray: Array>? + private var data: Dictionary? + private var messages: Array>? + + init(_ response: NSDictionary) { + self.result = response as? Dictionary + self.dataArray = [] + self.data = [:] + self.messages = [] + if response["result"] == nil { + return + } + self.dataArray = response["result"] as? Array> + if self.dataArray == nil || self.dataArray?.count == 0 { + return + } + self.data = dataArray![0] + if self.data == nil || self.data!["messages"] == nil { + self.data = [:] + return + } + self.messages = self.data!["messages"] as? Array> + if self.messages == nil { + self.messages = [] + } } -} + + public func getMessages() -> NSArray { + self.messages! as NSArray + } + + public func setMessages(_ messages: NSArray) { + self.messages = messages as? Array> + } + + public func getResult() -> NSDictionary { + self.data!["messages"] = self.messages + if self.dataArray?.count == 0 { + self.dataArray = [self.data!] + } else { + self.dataArray![0] = self.data! + } + self.result?["result"] = self.dataArray + return self.result! as NSDictionary + } +} \ No newline at end of file diff --git a/OnlineChatSdk/Classes/ChatConfig.swift b/OnlineChatSdk/Classes/ChatConfig.swift index b169dd5..a4c5ec4 100644 --- a/OnlineChatSdk/Classes/ChatConfig.swift +++ b/OnlineChatSdk/Classes/ChatConfig.swift @@ -56,6 +56,6 @@ class ChatConfig { } private func getConfigString(_ key: String) -> String { - self.config.value(forKey: key) as! String + self.config.value(forKey: key) != nil ? self.config.value(forKey: key) as! String : "" } } \ No newline at end of file diff --git a/OnlineChatSdk/Classes/ChatController.swift b/OnlineChatSdk/Classes/ChatController.swift index 422524b..a67bb17 100644 --- a/OnlineChatSdk/Classes/ChatController.swift +++ b/OnlineChatSdk/Classes/ChatController.swift @@ -33,6 +33,26 @@ open class ChatController: UIViewController, WKNavigationDelegate, WKScriptMessa private var didFinish: Bool = false private var widgetUrl: String = "" + private static func getUnreadedMessagesCallback(_ result: NSDictionary) -> NSDictionary { + let resultWrapper = ChatApiMessagesWrapper(result) + if resultWrapper.getMessages().count == 0 { + return resultWrapper.getResult() + } + var unreadedMessages: Array = [] + for message: NSDictionary in resultWrapper.getMessages() as! Array { + if message.value(forKey: "isVisibleForClient") != nil { + if (message.value(forKey: "isVisibleForClient") as! Int) == 1 { + unreadedMessages.append(message) + } + } + } + if unreadedMessages.count == 0 { + return resultWrapper.getResult() + } + resultWrapper.setMessages(unreadedMessages as NSArray) + return resultWrapper.getResult() + } + private static func getUnreadedMessages(_ startDate: String, callback: @escaping (NSDictionary?) -> Void) { let token = ChatConfig.getApiToken() if token == "" { @@ -54,9 +74,6 @@ open class ChatController: UIViewController, WKNavigationDelegate, WKScriptMessa ] ]) } - let dtFormat = ChatDateFormatter() - let currentDate = NSDate() as Date - ChatApi().messages(token, params: [ "client": [ "clientId": clientId @@ -65,28 +82,41 @@ open class ChatController: UIViewController, WKNavigationDelegate, WKScriptMessa "status": "unreaded", "dateRange": [ "start": startDate, - "stop": dtFormat.string(from: currentDate) + "stop": ChatDateFormatter().getCurrent() ] ] as [String: Any], callback: {(result) in - - ChatApiMessagesWrapper(result as! Dictionary) - - callback([ - "success": false, - "error": [ - "code": 0, - "descr": "Не реализовано" - ] - ]) + callback( ChatController.getUnreadedMessagesCallback(result!) ) }) } public static func getUnreadedMessages(callback: @escaping (NSDictionary?) -> Void) { + let startDate = ChatDateFormatter().string(from: Date(timeIntervalSince1970: TimeInterval(Int(NSDate().timeIntervalSince1970) - 86400 * 14))) + ChatController.getUnreadedMessages(startDate, callback: callback) + } + private static func getNewMessagesCallback(_ result: NSDictionary) -> NSDictionary { + let resultWrapper = ChatApiMessagesWrapper(result) + if resultWrapper.getMessages().count == 0 { + return resultWrapper.getResult() + } + let lastMessage = resultWrapper.getMessages()[resultWrapper.getMessages().count - 1] as! NSDictionary + let lastDate = ChatDateFormatter().date(from: lastMessage["dateTime"] as! String) + let nextDate = Date(timeIntervalSince1970: TimeInterval( Int(lastDate!.timeIntervalSince1970) + 1 )) + ChatConfig.setLastDateTimeNewMessage( ChatDateFormatter().string(from: nextDate) ) + return resultWrapper.getResult() } public static func getNewMessages(callback: @escaping (NSDictionary?) -> Void) { - + let startDate = ChatConfig.getLastDateTimeNewMessage() + if startDate == "" { + self.getUnreadedMessages(callback: {(result) in + callback( ChatController.getNewMessagesCallback(result!) ) + }) + } else { + self.getUnreadedMessages(startDate, callback: {(result) in + callback( ChatController.getNewMessagesCallback(result!) ) + }) + } } override public func loadView() { @@ -331,4 +361,4 @@ open class ChatController: UIViewController, WKNavigationDelegate, WKScriptMessa open func getContactsCallback(_ data: NSDictionary) { } -} +} \ No newline at end of file diff --git a/OnlineChatSdk/Classes/ChatDateFormatter.swift b/OnlineChatSdk/Classes/ChatDateFormatter.swift index cbd5eae..b8e4d05 100644 --- a/OnlineChatSdk/Classes/ChatDateFormatter.swift +++ b/OnlineChatSdk/Classes/ChatDateFormatter.swift @@ -1,6 +1,7 @@ import Foundation class ChatDateFormatter : DateFormatter { + override init() { super.init() self.calendar = Calendar(identifier: Calendar.Identifier.iso8601) @@ -12,4 +13,8 @@ class ChatDateFormatter : DateFormatter { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + public func getCurrent() -> String { + self.string(from: NSDate() as Date) + } }