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>
This commit is contained in:
Swift
2024-11-11 17:36:27 -05:00
committed by GitHub
parent 6f04455350
commit c4ee52fdac
2 changed files with 33 additions and 8 deletions

View File

@@ -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 {

View File

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