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:
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())