diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 3f59874b7..561e309c9 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -113,6 +113,7 @@ 7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; }; 7B4C75CD26BB92060000AC89 /* DeletedMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */; }; 7B50D64D28AC7CF80086CCEC /* silence.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 7B50D64C28AC7CF80086CCEC /* silence.aiff */; }; + 7B521E0629A87CEA00C3C36A /* UIContextualAction+Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B521E0529A87CEA00C3C36A /* UIContextualAction+Session.swift */; }; 7B7037432834B81F000DCF35 /* ReactionContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7037422834B81F000DCF35 /* ReactionContainerView.swift */; }; 7B7037452834BCC0000DCF35 /* ReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7037442834BCC0000DCF35 /* ReactionView.swift */; }; 7B7CB18E270D066F0079FF93 /* IncomingCallBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB18D270D066F0079FF93 /* IncomingCallBanner.swift */; }; @@ -1181,6 +1182,7 @@ 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsendRequest.swift; sourceTree = ""; }; 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = ""; }; 7B50D64C28AC7CF80086CCEC /* silence.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = silence.aiff; sourceTree = ""; }; + 7B521E0529A87CEA00C3C36A /* UIContextualAction+Session.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIContextualAction+Session.swift"; sourceTree = ""; }; 7B7037422834B81F000DCF35 /* ReactionContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionContainerView.swift; sourceTree = ""; }; 7B7037442834BCC0000DCF35 /* ReactionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionView.swift; sourceTree = ""; }; 7B7CB18D270D066F0079FF93 /* IncomingCallBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallBanner.swift; sourceTree = ""; }; @@ -2582,6 +2584,7 @@ FD52090828B59411006098F6 /* ScreenLockUI.swift */, FD37EA0828AA2D27003AE748 /* SessionTableViewModel.swift */, FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */, + 7B521E0529A87CEA00C3C36A /* UIContextualAction+Session.swift */, ); path = Shared; sourceTree = ""; @@ -5712,6 +5715,7 @@ 4539B5861F79348F007141FF /* PushRegistrationManager.swift in Sources */, B8041A9525C8FA1D003C2166 /* MediaLoaderView.swift in Sources */, 45F32C232057297A00A300D5 /* MediaPageViewController.swift in Sources */, + 7B521E0629A87CEA00C3C36A /* UIContextualAction+Session.swift in Sources */, 7B9F71D42852EEE2006DFE7B /* Emoji+Name.swift in Sources */, 4CA46F4C219CCC630038ABDE /* CaptionView.swift in Sources */, C328253025CA55370062D0A7 /* ContextMenuWindow.swift in Sources */, diff --git a/Session/Home/HomeVC.swift b/Session/Home/HomeVC.swift index 84351d6ca..3ed8a59ca 100644 --- a/Session/Home/HomeVC.swift +++ b/Session/Home/HomeVC.swift @@ -618,6 +618,20 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi return true } + func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { + let section: HomeViewModel.SectionModel = self.viewModel.threadData[indexPath.section] + let unswipeAnimationDelay: DispatchTimeInterval = .milliseconds(500) + + switch section.model { + case .messageRequests: + return nil + case .threads: + + return UISwipeActionsConfiguration(actions: [ ]) + default: return nil + } + } + func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let section: HomeViewModel.SectionModel = self.viewModel.threadData[indexPath.section] let unswipeAnimationDelay: DispatchTimeInterval = .milliseconds(500) @@ -665,6 +679,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi self?.present(confirmationModal, animated: true, completion: nil) } delete.themeBackgroundColor = .conversationButton_swipeDestructive + delete.setupSessionStyle(with: UIImage(systemName: "trash")) let pin: UIContextualAction = UIContextualAction( style: .normal, @@ -688,6 +703,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi } } pin.themeBackgroundColor = .conversationButton_swipeTertiary + pin.setupSessionStyle(with: UIImage(systemName: "pin")) guard threadViewModel.threadVariant == .contact && !threadViewModel.threadIsNoteToSelf else { return UISwipeActionsConfiguration(actions: [ delete, pin ]) diff --git a/Session/Shared/UIContextualAction+Session.swift b/Session/Shared/UIContextualAction+Session.swift new file mode 100644 index 000000000..64e01217c --- /dev/null +++ b/Session/Shared/UIContextualAction+Session.swift @@ -0,0 +1,42 @@ +// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. + +import UIKit + +extension UIContextualAction { + + func setupSessionStyle(with image: UIImage?) { + guard let title = self.title, let image = image else { + self.image = image + return + } + + let text = NSMutableAttributedString(string: "") + let attachment = NSTextAttachment() + attachment.image = image.withTintColor(.white) + text.append(NSAttributedString(attachment: attachment)) + text.append( + NSAttributedString( + string: "\n\(title)", + attributes: [ + .font : UIFont.systemFont(ofSize: Values.smallFontSize), + .foregroundColor : UIColor.white + ] + ) + ) + + let label = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) + label.textAlignment = .center + label.numberOfLines = 2 + label.attributedText = text + + let renderer = UIGraphicsImageRenderer(bounds: label.bounds) + let renderedImage = renderer.image { context in + label.layer.render(in: context.cgContext) + } + if let cgImage = renderedImage.cgImage { + let finalImage = UIImage(cgImage: cgImage, scale: UIScreen.main.scale, orientation: .up) + self.image = finalImage + self.title = nil + } + } +}