diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 6903a6d95..f351b3090 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -114,6 +114,7 @@ 7B3A392E2977791E002FE4AC /* MediaInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */; }; 7B3A3930297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift */; }; 7B3A39322980D02B002FE4AC /* SessionCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */; }; + 7B3A3934298882D6002FE4AC /* SessionCarouselViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */; }; 7B46AAAF28766DF4001AF2DC /* AllMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */; }; 7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; }; 7B4C75CD26BB92060000AC89 /* DeletedMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */; }; @@ -1185,6 +1186,7 @@ 7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInfoVC.swift; sourceTree = ""; }; 7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaInfoVC+MediaPreviewView.swift"; sourceTree = ""; }; 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCarouselView.swift; sourceTree = ""; }; + 7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCarouselViewDelegate.swift; sourceTree = ""; }; 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllMediaViewController.swift; sourceTree = ""; }; 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsendRequest.swift; sourceTree = ""; }; 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = ""; }; @@ -2590,6 +2592,7 @@ FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */, 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */, 7B2561C329874851005C086C /* SessionCarouselView+Info.swift */, + 7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */, ); path = Shared; sourceTree = ""; @@ -5702,6 +5705,7 @@ FD71164228E2C85A00B47552 /* TransitionType.swift in Sources */, FD848B9828422F1A000E298B /* Date+Utilities.swift in Sources */, FD37E9DB28A244E9003AE748 /* ThemePreviewView.swift in Sources */, + 7B3A3934298882D6002FE4AC /* SessionCarouselViewDelegate.swift in Sources */, B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */, 45B5360E206DD8BB00D61655 /* UIResponder+OWS.swift in Sources */, 7B9F71C928470667006DFE7B /* ReactionListSheet.swift in Sources */, diff --git a/Session/Media Viewing & Editing/MediaInfoVC+MediaPreviewView.swift b/Session/Media Viewing & Editing/MediaInfoVC+MediaPreviewView.swift index f30e5d8a9..2ca703e6e 100644 --- a/Session/Media Viewing & Editing/MediaInfoVC+MediaPreviewView.swift +++ b/Session/Media Viewing & Editing/MediaInfoVC+MediaPreviewView.swift @@ -23,23 +23,6 @@ extension MediaInfoVC { return result }() - private lazy var fullScreenButton: UIButton = { - let result: UIButton = UIButton(type: .custom) - result.setImage( - UIImage(systemName: "arrow.up.left.and.arrow.down.right")? - .withRenderingMode(.alwaysTemplate), - for: .normal - ) - result.themeTintColor = .textPrimary - result.backgroundColor = .init(white: 0, alpha: 0.4) - result.layer.cornerRadius = 14 - result.set(.width, to: 28) - result.set(.height, to: 28) - result.addTarget(self, action: #selector(showMediaFullScreen), for: .touchUpInside) - - return result - }() - // MARK: - Lifecycle init(attachment: Attachment, isOutgoing: Bool) { @@ -66,20 +49,12 @@ extension MediaInfoVC { addSubview(mediaView) mediaView.pin(to: self) - addSubview(fullScreenButton) - fullScreenButton.pin(.trailing, to: .trailing, of: self, withInset: -Values.smallSpacing) - fullScreenButton.pin(.bottom, to: .bottom, of: self, withInset: -Values.smallSpacing) - mediaView.loadMedia() } - // MARK: - Interaction - - @objc func showMediaFullScreen() { - - } - // MARK: - Copy + + /// This function is used to make sure the carousel view contains this class can loop infinitely func copyView() -> MediaPreviewView { return MediaPreviewView(attachment: self.attachment, isOutgoing: self.isOutgoing) } diff --git a/Session/Media Viewing & Editing/MediaInfoVC.swift b/Session/Media Viewing & Editing/MediaInfoVC.swift index 48398a6d8..769216173 100644 --- a/Session/Media Viewing & Editing/MediaInfoVC.swift +++ b/Session/Media Viewing & Editing/MediaInfoVC.swift @@ -4,8 +4,9 @@ import UIKit import SessionUIKit import SessionUtilitiesKit -final class MediaInfoVC: BaseVC { +final class MediaInfoVC: BaseVC, SessionCarouselViewDelegate { internal static let mediaSize: CGFloat = 293 + internal static let arrowSize: CGSize = CGSize(width: 20, height: 30) private let attachments: [Attachment] private let isOutgoing: Bool @@ -35,14 +36,29 @@ final class MediaInfoVC: BaseVC { bottomInset: Values.mediumSpacing ), shouldShowArrows: true, - arrowsSize: CGSize( - width: 20, - height: 30 - ), + arrowsSize: Self.arrowSize, cornerRadius: 8 ) ) result.set(.height, to: Self.mediaSize) + result.delegate = self + + return result + }() + + private lazy var fullScreenButton: UIButton = { + let result: UIButton = UIButton(type: .custom) + result.setImage( + UIImage(systemName: "arrow.up.left.and.arrow.down.right")? + .withRenderingMode(.alwaysTemplate), + for: .normal + ) + result.themeTintColor = .textPrimary + result.backgroundColor = .init(white: 0, alpha: 0.4) + result.layer.cornerRadius = 14 + result.set(.width, to: 28) + result.set(.height, to: 28) + result.addTarget(self, action: #selector(showMediaFullScreen), for: .touchUpInside) return result }() @@ -79,6 +95,10 @@ final class MediaInfoVC: BaseVC { mediaInfoView.update(attachment: attachments[0]) + mediaCarouselView.addSubview(fullScreenButton) + fullScreenButton.pin(.trailing, to: .trailing, of: mediaCarouselView, withInset: -(Values.smallSpacing + Self.arrowSize.width + Values.largeSpacing)) + fullScreenButton.pin(.bottom, to: .bottom, of: mediaCarouselView, withInset: -Values.smallSpacing) + let stackView: UIStackView = UIStackView(arrangedSubviews: [ mediaCarouselView, mediaInfoView ]) stackView.axis = .vertical stackView.alignment = .center @@ -88,4 +108,16 @@ final class MediaInfoVC: BaseVC { stackView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: self.view) stackView.center(.vertical, in: self.view) } + + // MARK: - Interaction + + @objc func showMediaFullScreen() { + + } + + // MARK: - SessionCarouselViewDelegate + + func carouselViewDidScrollToNewSlice(currentPage: Int) { + mediaInfoView.update(attachment: attachments[currentPage]) + } } diff --git a/Session/Shared/SessionCarouselView.swift b/Session/Shared/SessionCarouselView.swift index 207433f5b..6111f6df0 100644 --- a/Session/Shared/SessionCarouselView.swift +++ b/Session/Shared/SessionCarouselView.swift @@ -7,6 +7,7 @@ import SessionUtilitiesKit final class SessionCarouselView: UIView, UIScrollViewDelegate { private let slicesForLoop: [UIView] private let info: SessionCarouselView.Info + var delegate: SessionCarouselViewDelegate? // MARK: - UI private lazy var scrollView: UIScrollView = { @@ -146,10 +147,12 @@ final class SessionCarouselView: UIView, UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { setCorrectCotentOffsetIfNeeded(scrollView) + delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage) } func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { setCorrectCotentOffsetIfNeeded(scrollView) + delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage) } private func setCorrectCotentOffsetIfNeeded(_ scrollView: UIScrollView) { diff --git a/Session/Shared/SessionCarouselViewDelegate.swift b/Session/Shared/SessionCarouselViewDelegate.swift new file mode 100644 index 000000000..8cb2e19eb --- /dev/null +++ b/Session/Shared/SessionCarouselViewDelegate.swift @@ -0,0 +1,7 @@ +// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. + +import Foundation + +public protocol SessionCarouselViewDelegate: AnyObject { + func carouselViewDidScrollToNewSlice(currentPage: Int) +}