damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit c4ee52fdac589a2b3a90a75dbb171ba30d6b4fba
parent 6f044553501ff0141e8425ce8aa260f73e101913
Author: Swift <120697811+scoder1747@users.noreply.github.com>
Date:   Mon, 11 Nov 2024 17:36:27 -0500

Add sharing option in image carousel view (#2629)

Add share button in Full screen image carousel view images

The ellipsis (share button) allows you to share the current image being displayed in the full screen carousel viewer.

Changelog-Changed: Add share button for images on full screen image carousel view
Signed-off-by: Swift Coder <scoder1747@gmail.com>
Diffstat:
Mdamus/Views/Images/FullScreenCarouselView.swift | 30+++++++++++++++++++++++++-----
Mdamus/Views/Images/ImageContainerView.swift | 11++++++++---
2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/damus/Views/Images/FullScreenCarouselView.swift b/damus/Views/Images/FullScreenCarouselView.swift @@ -14,7 +14,7 @@ struct FullScreenCarouselView<Content: View>: View { @Environment(\.presentationMode) var presentationMode @State var showMenu = true - + @State private var imageDict: [URL: UIImage] = [:] let settings: UserSettingsStore @Binding var selectedIndex: Int let content: (() -> Content)? @@ -59,7 +59,7 @@ struct FullScreenCarouselView<Content: View>: View { ForEach(urls.indices, id: \.self) { index in VStack { if case .video = urls[safe: index] { - ImageContainerView(video_controller: video_controller, url: urls[index], settings: settings) + ImageContainerView(video_controller: video_controller, url: urls[index], settings: settings, imageDict: $imageDict) .clipped() // SwiftUI hack from https://stackoverflow.com/a/74401288 to make playback controls show up within the TabView .aspectRatio(contentMode: .fit) .padding(.top, Theme.safeAreaInsets?.top) @@ -71,7 +71,7 @@ struct FullScreenCarouselView<Content: View>: View { } else { ZoomableScrollView { - ImageContainerView(video_controller: video_controller, url: urls[index], settings: settings) + ImageContainerView(video_controller: video_controller, url: urls[index], settings: settings, imageDict: $imageDict) .aspectRatio(contentMode: .fit) .padding(.top, Theme.safeAreaInsets?.top) .padding(.bottom, Theme.safeAreaInsets?.bottom) @@ -96,8 +96,28 @@ struct FullScreenCarouselView<Content: View>: View { GeometryReader { geo in VStack { if showMenu { - NavDismissBarView(navDismissBarContainer: .fullScreenCarousel) - .foregroundColor(.white) + + HStack { + NavDismissBarView(navDismissBarContainer: .fullScreenCarousel) + .foregroundColor(.white) + + if let url = urls[safe: selectedIndex], + let image = imageDict[url.url] { + + ShareLink(item: Image(uiImage: image), + preview: SharePreview(NSLocalizedString("Shared Picture", + comment: "Label for the preview of the image being picture"), + image: Image(uiImage: image))) { + Image(systemName: "ellipsis") + .foregroundColor(.white) + .frame(width: 33, height: 33) + .background(.damusBlack) + .clipShape(Circle()) + } + .padding(20) + } + } + Spacer() if urls.count > 1 { diff --git a/damus/Views/Images/ImageContainerView.swift b/damus/Views/Images/ImageContainerView.swift @@ -14,14 +14,18 @@ struct ImageContainerView: View { let url: MediaUrl let settings: UserSettingsStore + @Binding var imageDict: [URL: UIImage] @State private var image: UIImage? @State private var showShareSheet = false private struct ImageHandler: ImageModifier { @Binding var handler: UIImage? + @Binding var imageDict: [URL: UIImage] + let url: URL func modify(_ image: UIImage) -> UIImage { handler = image + imageDict[url] = image return image } } @@ -32,7 +36,7 @@ struct ImageContainerView: View { .configure { view in view.framePreloadCount = 3 } - .imageModifier(ImageHandler(handler: $image)) + .imageModifier(ImageHandler(handler: $image, imageDict: $imageDict, url: url)) .kfClickable() .clipped() .modifier(ImageContextMenuModifier(url: url, image: image, settings: settings, showShareSheet: $showShareSheet)) @@ -58,10 +62,11 @@ fileprivate let test_video_url = URL(string: "http://cdn.jb55.com/s/zaps-build.m struct ImageContainerView_Previews: PreviewProvider { static var previews: some View { + @State var imageDict: [URL: UIImage] = [:] Group { - ImageContainerView(video_controller: test_damus_state.video, url: .image(test_image_url), settings: test_damus_state.settings) + ImageContainerView(video_controller: test_damus_state.video, url: .image(test_image_url), settings: test_damus_state.settings, imageDict: $imageDict) .previewDisplayName("Image") - ImageContainerView(video_controller: test_damus_state.video, url: .video(test_video_url), settings: test_damus_state.settings) + ImageContainerView(video_controller: test_damus_state.video, url: .video(test_video_url), settings: test_damus_state.settings, imageDict: $imageDict) .previewDisplayName("Video") } .environmentObject(OrientationTracker())