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:
@@ -14,7 +14,7 @@ struct FullScreenCarouselView<Content: View>: View {
|
|||||||
@Environment(\.presentationMode) var presentationMode
|
@Environment(\.presentationMode) var presentationMode
|
||||||
|
|
||||||
@State var showMenu = true
|
@State var showMenu = true
|
||||||
|
@State private var imageDict: [URL: UIImage] = [:]
|
||||||
let settings: UserSettingsStore
|
let settings: UserSettingsStore
|
||||||
@Binding var selectedIndex: Int
|
@Binding var selectedIndex: Int
|
||||||
let content: (() -> Content)?
|
let content: (() -> Content)?
|
||||||
@@ -59,7 +59,7 @@ struct FullScreenCarouselView<Content: View>: View {
|
|||||||
ForEach(urls.indices, id: \.self) { index in
|
ForEach(urls.indices, id: \.self) { index in
|
||||||
VStack {
|
VStack {
|
||||||
if case .video = urls[safe: index] {
|
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
|
.clipped() // SwiftUI hack from https://stackoverflow.com/a/74401288 to make playback controls show up within the TabView
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
.padding(.top, Theme.safeAreaInsets?.top)
|
.padding(.top, Theme.safeAreaInsets?.top)
|
||||||
@@ -71,7 +71,7 @@ struct FullScreenCarouselView<Content: View>: View {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ZoomableScrollView {
|
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)
|
.aspectRatio(contentMode: .fit)
|
||||||
.padding(.top, Theme.safeAreaInsets?.top)
|
.padding(.top, Theme.safeAreaInsets?.top)
|
||||||
.padding(.bottom, Theme.safeAreaInsets?.bottom)
|
.padding(.bottom, Theme.safeAreaInsets?.bottom)
|
||||||
@@ -96,8 +96,28 @@ struct FullScreenCarouselView<Content: View>: View {
|
|||||||
GeometryReader { geo in
|
GeometryReader { geo in
|
||||||
VStack {
|
VStack {
|
||||||
if showMenu {
|
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()
|
Spacer()
|
||||||
|
|
||||||
if urls.count > 1 {
|
if urls.count > 1 {
|
||||||
|
|||||||
@@ -14,14 +14,18 @@ struct ImageContainerView: View {
|
|||||||
let url: MediaUrl
|
let url: MediaUrl
|
||||||
let settings: UserSettingsStore
|
let settings: UserSettingsStore
|
||||||
|
|
||||||
|
@Binding var imageDict: [URL: UIImage]
|
||||||
@State private var image: UIImage?
|
@State private var image: UIImage?
|
||||||
@State private var showShareSheet = false
|
@State private var showShareSheet = false
|
||||||
|
|
||||||
private struct ImageHandler: ImageModifier {
|
private struct ImageHandler: ImageModifier {
|
||||||
@Binding var handler: UIImage?
|
@Binding var handler: UIImage?
|
||||||
|
@Binding var imageDict: [URL: UIImage]
|
||||||
|
let url: URL
|
||||||
|
|
||||||
func modify(_ image: UIImage) -> UIImage {
|
func modify(_ image: UIImage) -> UIImage {
|
||||||
handler = image
|
handler = image
|
||||||
|
imageDict[url] = image
|
||||||
return image
|
return image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +36,7 @@ struct ImageContainerView: View {
|
|||||||
.configure { view in
|
.configure { view in
|
||||||
view.framePreloadCount = 3
|
view.framePreloadCount = 3
|
||||||
}
|
}
|
||||||
.imageModifier(ImageHandler(handler: $image))
|
.imageModifier(ImageHandler(handler: $image, imageDict: $imageDict, url: url))
|
||||||
.kfClickable()
|
.kfClickable()
|
||||||
.clipped()
|
.clipped()
|
||||||
.modifier(ImageContextMenuModifier(url: url, image: image, settings: settings, showShareSheet: $showShareSheet))
|
.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 {
|
struct ImageContainerView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
|
@State var imageDict: [URL: UIImage] = [:]
|
||||||
Group {
|
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")
|
.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")
|
.previewDisplayName("Video")
|
||||||
}
|
}
|
||||||
.environmentObject(OrientationTracker())
|
.environmentObject(OrientationTracker())
|
||||||
|
|||||||
Reference in New Issue
Block a user