diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 5ef14e3df..70ec0b998 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -140,6 +140,7 @@ 7B9F71D42852EEE2006DFE7B /* Emoji+Name.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9F71CF2852EEE2006DFE7B /* Emoji+Name.swift */; }; 7B9F71D72853100A006DFE7B /* Emoji+Available.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9F71D528531009006DFE7B /* Emoji+Available.swift */; }; 7B9F71D82853100A006DFE7B /* EmojiWithSkinTones.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9F71D628531009006DFE7B /* EmojiWithSkinTones.swift */; }; + 7BA1E0E82A8087DB00123D0D /* SwiftUI+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA1E0E72A8087DB00123D0D /* SwiftUI+Utilities.swift */; }; 7BA68909272A27BE00EFC32F /* SessionCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA68908272A27BE00EFC32F /* SessionCall.swift */; }; 7BA6890D27325CCC00EFC32F /* SessionCallManager+CXCallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */; }; 7BA6890F27325CE300EFC32F /* SessionCallManager+CXProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */; }; @@ -1253,6 +1254,7 @@ 7B9F71CF2852EEE2006DFE7B /* Emoji+Name.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Name.swift"; sourceTree = ""; }; 7B9F71D528531009006DFE7B /* Emoji+Available.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Available.swift"; sourceTree = ""; }; 7B9F71D628531009006DFE7B /* EmojiWithSkinTones.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmojiWithSkinTones.swift; sourceTree = ""; }; + 7BA1E0E72A8087DB00123D0D /* SwiftUI+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SwiftUI+Utilities.swift"; sourceTree = ""; }; 7BA68908272A27BE00EFC32F /* SessionCall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCall.swift; sourceTree = ""; }; 7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXCallController.swift"; sourceTree = ""; }; 7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXProvider.swift"; sourceTree = ""; }; @@ -2922,6 +2924,7 @@ C33100272559000A00070591 /* UIView+Utilities.swift */, FD71161F28D97ABC00B47552 /* UIImage+Tinting.swift */, FDBB25E62988BBBD00F1508E /* UIContextualAction+Theming.swift */, + 7BA1E0E72A8087DB00123D0D /* SwiftUI+Utilities.swift */, ); path = Utilities; sourceTree = ""; @@ -5474,6 +5477,7 @@ C331FFE32558FB0000070591 /* TabBar.swift in Sources */, FD37E9D528A1FCE8003AE748 /* Theme+OceanLight.swift in Sources */, FDF848F129406A30007DCAE5 /* Format.swift in Sources */, + 7BA1E0E82A8087DB00123D0D /* SwiftUI+Utilities.swift in Sources */, FD37E9C828A1D73F003AE748 /* Theme+Colors.swift in Sources */, FD37EA0128A60473003AE748 /* UIKit+Theme.swift in Sources */, FD37E9CF28A1EB1B003AE748 /* Theme.swift in Sources */, diff --git a/Session/Media Viewing & Editing/MessageInfoView.swift b/Session/Media Viewing & Editing/MessageInfoView.swift index 34894ccf0..755ac196c 100644 --- a/Session/Media Viewing & Editing/MessageInfoView.swift +++ b/Session/Media Viewing & Editing/MessageInfoView.swift @@ -5,8 +5,11 @@ import SessionUIKit import SessionSnodeKit struct MessageInfoView: View { + @Environment(\.viewController) private var viewControllerHolder: UIViewController? + @State var index = 1 @State var showingAttachmentFullScreen = false + var actions: [ContextMenuVC.Action] var messageViewModel: MessageViewModel var isMessageFailed: Bool { @@ -140,7 +143,16 @@ struct MessageInfoView: View { } Button { - self.showingAttachmentFullScreen.toggle() +// self.showingAttachmentFullScreen.toggle() + self.viewControllerHolder?.present(style: .fullScreen) { + MediaGalleryViewModel.createDetailViewSwiftUI( + for: messageViewModel.threadId, + threadVariant: messageViewModel.threadVariant, + interactionId: messageViewModel.id, + selectedAttachmentId: attachment.id, + options: [ .sliderEnabled ] + ) + } } label: { ZStack { Circle() @@ -151,15 +163,24 @@ struct MessageInfoView: View { } .frame(width: 26, height: 26) } - .sheet(isPresented: $showingAttachmentFullScreen) { - MediaGalleryViewModel.createDetailViewSwiftUI( - for: messageViewModel.threadId, - threadVariant: messageViewModel.threadVariant, - interactionId: messageViewModel.id, - selectedAttachmentId: attachment.id, - options: [ .sliderEnabled ] - ) - } +// .fullScreenCoverCompat(isPresented: $showingAttachmentFullScreen) { +// MediaGalleryViewModel.createDetailViewSwiftUI( +// for: messageViewModel.threadId, +// threadVariant: messageViewModel.threadVariant, +// interactionId: messageViewModel.id, +// selectedAttachmentId: attachment.id, +// options: [ .sliderEnabled ] +// ) +// } +// .sheet(isPresented: $showingAttachmentFullScreen) { +// MediaGalleryViewModel.createDetailViewSwiftUI( +// for: messageViewModel.threadId, +// threadVariant: messageViewModel.threadVariant, +// interactionId: messageViewModel.id, +// selectedAttachmentId: attachment.id, +// options: [ .sliderEnabled ] +// ) +// } .padding( EdgeInsets( top: 0, diff --git a/SessionUIKit/Utilities/SwiftUI+Utilities.swift b/SessionUIKit/Utilities/SwiftUI+Utilities.swift new file mode 100644 index 000000000..90c32a91a --- /dev/null +++ b/SessionUIKit/Utilities/SwiftUI+Utilities.swift @@ -0,0 +1,37 @@ +// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. + +import SwiftUI +import UIKit +import SessionUtilitiesKit + +struct ViewControllerHolder { + weak var value: UIViewController? +} + +struct ViewControllerKey: EnvironmentKey { + static var defaultValue: ViewControllerHolder { + return ViewControllerHolder(value: CurrentAppContext().mainWindow?.rootViewController) + } +} + +extension EnvironmentValues { + public var viewController: UIViewController? { + get { return self[ViewControllerKey.self].value } + set { self[ViewControllerKey.self].value = newValue } + } +} + +extension UIViewController { + public func present(style: UIModalPresentationStyle = .automatic, @ViewBuilder builder: () -> Content) { + let toPresent = UIHostingController(rootView: AnyView(EmptyView())) + toPresent.modalPresentationStyle = style + toPresent.rootView = AnyView( + builder() + .environment(\.viewController, toPresent) + ) + NotificationCenter.default.addObserver(forName: Notification.Name(rawValue: "dismissModal"), object: nil, queue: nil) { [weak toPresent] _ in + toPresent?.dismiss(animated: true, completion: nil) + } + self.present(toPresent, animated: true, completion: nil) + } +}