Skip to content

Commit fe9361a

Browse files
committed
Merge branch 'release/3.11.0'
2 parents 74e08fb + 0b2e3e6 commit fe9361a

File tree

9 files changed

+89
-58
lines changed

9 files changed

+89
-58
lines changed

Adamant/Modules/Chat/View/ChatViewController.swift

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,8 @@ final class ChatViewController: MessagesViewController {
164164
super.viewDidAppear(animated)
165165
defer {
166166
state.isFirstTimeViewAppeared = true
167-
if state.isViewDissappeared == true {
168-
state.isViewDissappeared.toggle()
169-
updateUnreadMessages()
170-
}
167+
state.isViewDissappeared = false
168+
updateUnreadMessages()
171169
}
172170
inputBar.isUserInteractionEnabled = true
173171
chatMessagesCollectionView.fixedBottomOffset = nil
@@ -836,12 +834,16 @@ extension ChatViewController {
836834
fileprivate func updateScrollDownButtonVisibility() {
837835
let topCount = viewModel.unreadMessagesIds?.count ?? 0
838836
self.scrollDownButton.updateCounter(topCount)
839-
guard state.isScrollDownButtonHidden != state.isScrollPositionNearlyTheBottom else { return }
840-
state.isScrollDownButtonHidden = state.isScrollPositionNearlyTheBottom
837+
838+
let shouldShowButton = (topCount > 0) || !state.isScrollPositionNearlyTheBottom
839+
guard state.isScrollDownButtonHidden != !shouldShowButton else { return }
840+
841+
state.isScrollDownButtonHidden = !shouldShowButton
841842
let buttonUpdate = {
842-
self.scrollDownButton.alpha = self.state.isScrollPositionNearlyTheBottom ? 0 : 1
843+
self.scrollDownButton.alpha = shouldShowButton ? 1 : 0
843844
self.updateScrollToUnreadButtonPosition()
844845
}
846+
845847
if state.isAnimationAllowed {
846848
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
847849
buttonUpdate()
@@ -913,15 +915,7 @@ extension ChatViewController {
913915
let button = ChatScrollButton(position: .down)
914916
button.action = { [weak self] in
915917
guard let self else { return }
916-
if viewModel.shouldScrollToBottom {
917-
state.isScrollingToBottom = true
918-
markMessagesFromCurrentToBottomAsRead()
919-
self.messagesCollectionView.scrollToBottom(animated: true)
920-
} else if let id = viewModel.unreadMessagesIds?.first {
921-
viewModel.animationType = MessageAnimationType.none
922-
self.scrollToPosition(.messageId(id), animated: true)
923-
viewModel.shouldScrollToBottom = true
924-
}
918+
scrollButtonAction()
925919
}
926920
button.alpha = 0
927921
return button
@@ -958,6 +952,53 @@ extension ChatViewController {
958952
)
959953
return collection
960954
}
955+
956+
fileprivate func scrollButtonAction() {
957+
if viewModel.shouldScrollToBottom {
958+
scrollToBottom()
959+
return
960+
}
961+
962+
guard let firstUnreadId = viewModel.unreadMessagesIds?.first,
963+
let unreadIndex = viewModel.messages.firstIndex(where: { $0.messageId == firstUnreadId }) else {
964+
scrollToBottom()
965+
return
966+
}
967+
968+
let visibleBounds = messagesCollectionView.bounds
969+
let restrictedVisibleRect = visibleBounds.insetBy(dx: 0, dy: 100)
970+
971+
let visibleSections: Set<Int> = Set(
972+
messagesCollectionView.indexPathsForVisibleItems.compactMap {
973+
guard let frame = messagesCollectionView.layoutAttributesForItem(at: $0)?.frame,
974+
restrictedVisibleRect.intersects(frame) else { return nil }
975+
return $0.section
976+
}
977+
)
978+
979+
if visibleSections.contains(unreadIndex) {
980+
scrollToBottom()
981+
return
982+
}
983+
984+
if let separatorIndex = viewModel.separatorState.separatorIndex,
985+
unreadIndex == separatorIndex + 1 {
986+
viewModel.animationType = .none
987+
scrollToPosition(.messageId(firstUnreadId), animated: false, setExtraOffset: true, scrollAt: .top)
988+
viewModel.shouldScrollToBottom = true
989+
return
990+
}
991+
992+
viewModel.animationType = .none
993+
scrollToPosition(.messageId(firstUnreadId), animated: true, scrollAt: .top)
994+
viewModel.shouldScrollToBottom = true
995+
}
996+
997+
fileprivate func scrollToBottom() {
998+
state.isScrollingToBottom = true
999+
markMessagesFromCurrentToBottomAsRead()
1000+
messagesCollectionView.scrollToBottom(animated: true)
1001+
}
9611002
}
9621003

9631004
// MARK: Other
@@ -1395,4 +1436,11 @@ private let messagePadding: CGFloat = 12
13951436
private let filesToolbarViewHeight: CGFloat = 140
13961437
private let targetYOffset: CGFloat = 20
13971438
private let scrollButtonHeight: CGFloat = 30
1398-
private let hiddenScrollViewPartHeight: CGFloat = 94
1439+
//not a real height just for reading messages
1440+
private var hiddenScrollViewPartHeight: CGFloat {
1441+
if isMacOS {
1442+
return 93
1443+
} else {
1444+
return 85
1445+
}
1446+
}

Adamant/Modules/Chat/View/Subviews/ChatMedia/Container/ChatMediaContainerView.swift

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,12 @@ extension ChatMediaContainerView {
184184

185185
reactionsStack.insertSubview(progressRingHostingView, aboveSubview: statusButton)
186186
progressRingHostingView.snp.makeConstraints { make in
187-
make.center.equalTo(statusButton)
187+
if isMacOS {
188+
make.centerX.equalTo(statusButton).offset(-1)
189+
} else {
190+
make.centerX.equalTo(statusButton)
191+
}
192+
make.centerY.equalTo(statusButton)
188193
make.size.equalTo(29)
189194
}
190195
}
@@ -206,29 +211,33 @@ extension ChatMediaContainerView {
206211
statusButton.isHidden = status == .success
207212
}
208213

209-
func averageUploadProgress() -> Double {
214+
func totalUploadProgress() -> Double {
210215
let files = model.content.fileModel.files
211-
212-
let progresses = files
213-
.compactMap { $0.progress }
214-
215-
guard !progresses.isEmpty else {
216+
217+
let totalBytes = files.map { $0.file.size }.reduce(0, +)
218+
219+
let uploadedBytes: Int64 = files.reduce(0) { result, file in
220+
let progress = Double(file.progress ?? 0) / 100.0
221+
return result + Int64(Double(file.file.size) * progress)
222+
}
223+
224+
guard totalBytes > 0 else {
216225
return 0.0
217226
}
218-
219-
let totalProgress = progresses.reduce(0, +)
220-
return Double(totalProgress) / Double(progresses.count)
227+
228+
return Double(uploadedBytes) / Double(totalBytes) * 100.0
221229
}
222230

223231
func updateProgressRing() {
224-
let averageProgress = averageUploadProgress()
232+
let averageProgress = totalUploadProgress()
225233

226234
if averageProgress == 0 {
227235
statusProgressState.backgroundGradient = LinearGradient(
228236
gradient: Gradient(colors: [.white, Color(.adamant.sendingFileAnimationGrayColor)]),
229237
startPoint: .topLeading,
230238
endPoint: .bottomTrailing
231-
)} else {
239+
)
240+
} else {
232241
statusProgressState.backgroundGradient = nil
233242
}
234243
statusProgressState.progress = averageProgress / 100

Adamant/Modules/Chat/ViewModel/ChatViewModel.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,6 @@ final class ChatViewModel: NSObject {
308308
fileprivate func setUpMessagetoShow(messageId: String?) {
309309
if let messageId {
310310
self.messageIdToShow = messageId
311-
separatorState.shouldScrollToNewMessagesOrSavedPosition = false
312311
}
313312
}
314313

@@ -556,9 +555,6 @@ final class ChatViewModel: NSObject {
556555
recipient: partnerAddress
557556
)
558557
}
559-
if let chatroom {
560-
await chatsProvider.markMessageAsRead(chatroom: chatroom, message: messageId)
561-
}
562558

563559
await waitForMessage(withId: messageId)
564560
scrollToId = messageId

Adamant/Modules/Chat/ViewModel/Models/NewMessageSeparatorState.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,4 @@ struct NewMessageSeparatorState {
1414
var isFirstUpdate: Bool = true
1515
var didAddSeparator: Bool = false
1616
var isScrollPositionNearlyTheBottom = true
17-
var shouldScrollToNewMessagesOrSavedPosition = true
1817
}

CommonKit/Sources/CommonKit/Assets/Shared.xcassets/Buttons/Arrow_innactive.imageset/Contents.json

Lines changed: 0 additions & 23 deletions
This file was deleted.

NotificationServiceExtension/NotificationService.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,11 @@ class NotificationService: UNNotificationServiceExtension {
337337
var badgeValue = (Int(SecureStore.get(StoreKey.notificationsService.customBadgeNumber) ?? "0") ?? 0)
338338
if !shouldIgnoreNotification {
339339
badgeValue += 1
340-
bestAttemptContent.userInfo[AdamantNotificationUserInfoKeys.decodedMessage] = decodedMessage
340+
} else {
341+
bestAttemptContent.body = ""
341342
}
342343

344+
bestAttemptContent.userInfo[AdamantNotificationUserInfoKeys.decodedMessage] = decodedMessage
343345
bestAttemptContent.badge = NSNumber(value: badgeValue)
344346
SecureStore.set(String(badgeValue), for: StoreKey.notificationsService.customBadgeNumber)
345347

0 commit comments

Comments
 (0)