Skip to content

Commit

Permalink
[4.3.1] Release
Browse files Browse the repository at this point in the history
  • Loading branch information
bronenos committed Apr 26, 2024
1 parent 445c212 commit 83d7fa1
Show file tree
Hide file tree
Showing 402 changed files with 628 additions and 531 deletions.
3 changes: 2 additions & 1 deletion JivoSDK.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |root|
root.name = 'JivoSDK'
root.version = '4.3.0'
root.version = '4.3.1'
root.homepage = 'https://github.com/JivoChat'
root.authors = { "Anton Karpushko" => "[email protected]", "Stan Potemkin" => "[email protected]" }
root.summary = 'Jivo business chat Mobile SDK'
Expand Down Expand Up @@ -82,6 +82,7 @@ Pod::Spec.new do |root|
spec.framework = 'SystemConfiguration'
spec.source_files = 'Shared/Models', 'Shared/Models/**/*.swift', 'JivoSDK/Sources/**/*.{h,swift}', 'Shared/Sources/**/*.swift', 'Shared/Sources/Extensions/System/*.swift', 'Shared/Design/**/*.swift', 'JivoSDK/Documentation/Reference.docc/**/*'
spec.resource = 'Shared/Models/*.xcdatamodeld', 'JivoSDK/Resources/Assets.xcassets', 'JivoSDK/Resources/Langpack/*.lproj', 'Shared/Design/*.{xcassets,ttf}'
spec.resource_bundles = {'JivoSDK_Privacy' => ['JivoSDK/Resources/PrivacyInfo.xcprivacy']}

spec.exclude_files = [
'Shared/**/*Unit.swift',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
{
"images" : [
{
"filename" : "blocked.pdf",
"filename" : "light.pdf",
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "dark.pdf",
"idiom" : "universal"
}
],
Expand Down
Binary file not shown.
Binary file not shown.
17 changes: 17 additions & 0 deletions JivoSDK/Resources/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
161 changes: 96 additions & 65 deletions JivoSDK/Sources/Engine/Managers/ChatManager/SdkChatManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ final class SdkChatManager: SdkManager, ISdkChatManager {
text: text)
}

func sendRateForm(id: String, chat: JVChat?) {
func presentRateForm(id: String, chat: JVChat?) {
guard let chat = chat else { return }

currentRateFormId = id
Expand Down Expand Up @@ -1074,7 +1074,7 @@ final class SdkChatManager: SdkManager, ISdkChatManager {
}

private func handleMessageTransaction(_ transaction: [NetworkingEventBundle]) {
guard let chat = self.chatContext.chatRef?.resolved else {
guard let chat = chatContext.chatRef?.resolved else {
return
}

Expand All @@ -1092,80 +1092,58 @@ final class SdkChatManager: SdkManager, ISdkChatManager {
}

switch subject {
case .delivered(let messageId, _, let messageDate), .received(let messageId, _, _, _, let messageDate):
case .historyEntry(let entireId, let payload):
defer {
shouldSendMessageAck = activeSessionHandle.jv_hasValue
historyState.remoteHasContent = true
historyState.localEarliestMessageId.jv_replaceWithLesser(messageId)
historyState.localLatestMessageId.jv_replaceWithGreater(messageId)
historyState.localLatestMessageDate.jv_replaceWithGreater(messageDate)
historyState.localEarliestMessageId.jv_replaceWithLesser(entireId.messageId)
historyState.localLatestMessageId.jv_replaceWithGreater(entireId.messageId)
historyState.localLatestMessageDate.jv_replaceWithGreater(entireId.timepoint)
}

guard let message = handleMessageTransaction_upsertMessage(messageIdentifier: bundle.payload.id, subject: subject) else {
return
}

guard let message: JVMessage = {
switch bundle.payload.id {
case let id as String:
return subStorage.upsertMessage(byPrivateId: id, inChatWithId: chat.ID, with: [subject])

case let id as Int:
let message = subStorage.upsertMessage(
havingId: id,
inChatWithId: chat.ID,
with: [subject])

// if let lastSeenMessageId = keychainDriver.userScope().retrieveAccessor(forToken: .lastSeenMessageId).number,
// lastSeenMessageId < id {
// let seenMessages = markMessagesAsSeen(to: id)
// seenMessages.forEach {
// upsertedMessages[$0.UUID] = $0
// }
// }

return message

default:
return nil
}
}() else { return }

if message.hasBeenChanged {
upsertedMessages[message.UUID] = message
}

if let linkedMessageIds = outgoingPairedMessagesIds.removeValue(forKey: message.UUID) {
do {
for linkedMessage in linkedMessageIds.compactMap(subStorage.messageWithUUID) {
_ = subStorage.updateMessage(change: try JVSdkMessageAtomChange(
localId: linkedMessage.localID,
updates: [
.date(message.anchorDate)
]
))
}
}
catch {
if payload.senderId != userContext.clientId {
let newlySeenMessages = markMessagesAsSeen(including: entireId.messageId)
newlySeenMessages.forEach {
upsertedMessages[$0.UUID] = $0
}
}

case .becamePermanent(let entireId, _):
guard let message = handleMessageTransaction_upsertMessage(messageIdentifier: bundle.payload.id, subject: subject) else {
return
}

case let .seen(id, _): // second associated value is date
if message.hasBeenChanged {
upsertedMessages[message.UUID] = message
}

for linkedMessage in handleMessageTransaction_joinPairTimepoints(message: message) {
upsertedMessages[linkedMessage.UUID] = linkedMessage
}

case .alreadySeen(let entireId, _): // second associated value is date
historyState.remoteHasContent = true

// let seenMessages = markMessagesAsSeen(to: id)
// seenMessages.forEach { upsertedMessages[$0.UUID] = $0 }
let newlySeenMessages = markMessagesAsSeen(including: entireId.messageId)
newlySeenMessages.forEach {
upsertedMessages[$0.UUID] = $0
}

case .rate:
guard let rateFormID = bundle.payload.id as? String else {
assertionFailure()
return
}
sendRateForm(id: rateFormID, chat: self.chatContext.chatRef?.resolved)
}

switch subject {
case .received(let messageId, _, _, _, let sentAt) where messageId > historyState.localLatestMessageId.jv_orZero:
historyState.localLatestMessageId = messageId
historyState.localLatestMessageDate = sentAt
shouldSendMessageAck = activeSessionHandle.jv_hasValue

default:
break

presentRateForm(id: rateFormID, chat: self.chatContext.chatRef?.resolved)
}
}

Expand All @@ -1187,6 +1165,50 @@ final class SdkChatManager: SdkManager, ISdkChatManager {
_flushSilentMessages()
}

private func handleMessageTransaction_upsertMessage(
messageIdentifier: AnyHashable?,
subject: SdkChatProtoMessageSubject
) -> JVMessage? {
guard let chat = chatContext.chatRef?.resolved else {
return nil
}

switch messageIdentifier {
case let privateId as String:
return subStorage.upsertMessage(chatId: chat.ID, privateId: privateId, subjects: [subject])
case let messageId as Int:
return subStorage.upsertMessage(chatId: chat.ID, messageId: messageId, subjects: [subject])
default:
return nil
}
}

private func handleMessageTransaction_joinPairTimepoints(
message: JVMessage
) -> [JVMessage] {
guard let linkedMessageIds = outgoingPairedMessagesIds.removeValue(forKey: message.UUID) else {
return .jv_empty
}

let linkedMessages = linkedMessageIds.compactMap(subStorage.messageWithUUID)
do {
for linkedMessage in linkedMessages {
let change = try JVSdkMessageAtomChange(
localId: linkedMessage.localID,
updates: [
.date(message.anchorDate)
]
)

_ = subStorage.updateMessage(change: change)
}
}
catch {
}

return linkedMessages
}

private func handleMessageTransaction_detectMissingRanges(
incomingMessages: [JVMessage],
persistentIds: Set<Int>,
Expand Down Expand Up @@ -1251,15 +1273,24 @@ final class SdkChatManager: SdkManager, ISdkChatManager {
}
}

private func markMessagesAsSeen(to messageId: Int) -> [JVMessage] {
keychainDriver.userScope().retrieveAccessor(forToken: .lastSeenMessageId).number = Int(messageId)
private func markMessagesAsSeen(including messageId: Int) -> [JVMessage] {
guard let chat = chatContext.chatRef?.resolved else {
return .jv_empty
}

guard let chatId = self.chatContext.chatRef?.resolved?.ID else { return [] }
let seenClientMessages = subStorage
.markMessagesAsSeen(to: messageId, inChatWithId: chatId)
.filter { !$0.m_is_incoming }
let lastSeenMessageIdAccessor = keychainDriver.userScope().retrieveAccessor(forToken: .lastSeenMessageId)
let lastSeenMessageId = lastSeenMessageIdAccessor.number.jv_orZero

return seenClientMessages
if messageId <= lastSeenMessageId {
return .jv_empty
}
else {
lastSeenMessageIdAccessor.number = max(lastSeenMessageId, Int(messageId))

return subStorage
.markMessagesAsSeen(chat: chat, till: messageId)
.filter { !$0.m_is_incoming }
}
}

private func handleUserTransaction(_ transaction: [NetworkingEventBundle]) {
Expand Down

0 comments on commit 83d7fa1

Please sign in to comment.